Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP\MySQL] Drop-down list bevolken inclusief selected value

Pagina: 1
Acties:

  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
Ha devvers, daar ben ik weer! :P

Ik ben bezig met het vullen van een drop-down list wat prima gaat. Alleen lukt het me niet om één van de items in de drop-down list "selected" te maken.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function execute($query)
{
    $connect = mysqli_connect("bladiebla");
    if (mysqli_connect_errno())
    {
        echo 'Failed to connect to MySQL: ' . mysqli_connect_error();
    }
    return mysqli_query($connect, $query);
    mysqli_close($connect);
}

$result1 = execute("SELECT id, description FROM authorization WHERE type = 'Account' ORDER BY description");
$result2 = execute("SELECT authorization.id FROM authorization LEFT JOIN ad_group ON authorization.id = ad_group.authorization_id WHERE ad_group.id = '2'");

$return = "<select>";
while ($row = mysqli_fetch_array($result1))
{
    if($row['id'] == $result2)
    {
        $return .= "<option value=\"".$row['id']."\" selected>".$row['description']."</option>\r\n";
    }
    else
    {
        $return .= "<option value=\"".$row['id']."\">".$row['description']."</option>\r\n";
    }
}

$return .= "</select>";
echo $return;


Output is gewoon een drop-down list zonder dat één van de items geselecteerd is. Ik vermoed dat dit komt door de vergelijking in de if-statement, maar heb geen idee hoe ik dit anders zou moeten doen. Iemand?

  • swtimmer
  • Registratie: Augustus 2006
  • Laatst online: 16-10 10:49

swtimmer

Ontrafelt het leven!

Je $result2 is een mysql resultaat object. Ik gok dat jij hieruit hetgeen moet halen wat vergelijken moet worden met $row[id].

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Waarom doe je het überhaupt in twee queries?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
Goeie vraag, heb je een beter idee?

Edit: @swtimmer: Ik ga het ff proberen. Hier was ik al mee bezig.

[ Voor 49% gewijzigd door Joep op 09-10-2014 12:25 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

SQL:
1
2
3
4
5
SELECT id, description, ad_group.id AS ad_group_id
FROM authorization
    LEFT JOIN ad_group ON authorization.id = ad_group.authorization_id
WHERE type = 'Account'
ORDER BY description

En dan in je code checken of ad_group_id gelijk is aan 2 en alleen in dat geval de selected-attribute afdrukken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
Derp.

  • Joostje123
  • Registratie: September 2010
  • Laatst online: 21-11 15:53
NMe schreef op donderdag 09 oktober 2014 @ 12:32:
SQL:
1
2
3
4
5
SELECT id, description, ad_group.id AS ad_group_id
FROM authorization
    LEFT JOIN ad_group ON authorization.id = ad_group.authorization_id
WHERE type = 'Account'
ORDER BY description

En dan in je code checken of ad_group_id gelijk is aan 2 en alleen in dat geval de selected-attribute afdrukken.
Iets met hengel en vis kon zeker hier geen kwaad.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Hij had de query er al praktisch staan, dus dat had bijster weinig uitgemaakt. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

Je zou zelfs nog met een if statement in de query een extra kolom met waarde selected mee kunnen geven. Dan hoef je alleen nog maar het attribuut toe te voegen.

SQL:
1
2
3
4
5
6
7
8
SELECT      id, 
            description, 
            ad_group.id AS ad_group_id,
            IF(ad_group.authorization_id = 2, 'selected', NULL) AS `selected`
FROM        authorization
LEFT JOIN   ad_group ON authorization.id = ad_group.authorization_id
WHERE       type = 'Account'
ORDER BY    description


PHP:
1
2
3
while ($row = mysqli_fetch_array($result)){
    $return .= "<option value=\"".$row['id']."\" " . $row['selected'] . ">".$row['description']."</option>\r\n";
}

telefoontoestel


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
En je maakt nu voor elke execute() aanroep een nieuwe databaseverbinding? En je close zit na de return, dus die wordt nooit aangeroepen he. Waarom niet gewoon in het begin van je script de mysql connection maken en die gebruiken. En dan aan het einde weer sluiten?

  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
telefoontoestel schreef op donderdag 09 oktober 2014 @ 13:00:
Je zou zelfs nog met een if statement in de query een extra kolom met waarde selected mee kunnen geven. Dan hoef je alleen nog maar het attribuut toe te voegen.

[sql]
SELECT id,
description,
ad_group.id AS ad_group_id,
IF(ad_group.authorization_id = 2, 'selected', NULL) AS `selected`
FROM authorization
LEFT JOIN ad_group ON authorization.id = ad_group.authorization_id
WHERE type = 'Account'
ORDER BY description
[/sql]

PHP:
1
2
3
while ($row = mysqli_fetch_array($result)){
    $return .= "<option value=\"".$row['id']."\" " . $row['selected'] . ">".$row['description']."</option>\r\n";
}
Zo kan het ook, maar de server weet dat ad_group.id = 2, niet dat ad_group.authorization_id = 2. Daarnaast is ad_group.id AS ad_group_id, niet nodig.

Zo werkt het wel:
SQL:
1
SELECT authorization.id, authorization.description, IF(ad_group.authorization_id = (SELECT ad_group.authorization_id FROM ad_group WHERE ad_group.id = '2'), ' selected', NULL) as 'selected' FROM authorization LEFT JOIN ad_group ON authorization.id = ad_group.authorization_id WHERE type = 'Account'


Btw, hoe zorg je ervoor dat je SQL er zo netjes uitziet met die tabs enzo?
Barryvdh schreef op donderdag 09 oktober 2014 @ 13:00:
En je maakt nu voor elke execute() aanroep een nieuwe databaseverbinding? En je close zit na de return, dus die wordt nooit aangeroepen he. Waarom niet gewoon in het begin van je script de mysql connection maken en die gebruiken. En dan aan het einde weer sluiten?
Ja baas ;) Zal ik doen

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Joep schreef op donderdag 09 oktober 2014 @ 14:21:
[...]

Zo kan het ook, maar de server weet dat ad_group.id = 2, niet dat ad_group.authorization_id = 2. Daarnaast is ad_group.id AS ad_group_id, niet nodig.
Dat heeft 'ie zo te zien van mij gecopy/pasted. ;)
Btw, hoe zorg je ervoor dat je SQL er zo netjes uitziet met die tabs enzo?
Zelf formatteren met enters en spaties?
Ja baas ;) Zal ik doen
Het is stiekem wel heel belangrijk. De overhead van het opzetten van een nieuwe verbinding is best hoog en daarbij hou je met de code uit de topicstart bovendien elke verbinding actief tot je klaar bent met het hele script. Je databaseserver gaat dat niet leuk vinden als je meer dan een paar bezoekers tegelijk op je site hebt.

Overigens kun je zo te zien ook beter even kijken naar een goeie editor/IDE om je code in te schrijven, want een goeie IDE zou regel 9 uit de startpost gemarkeerd hebben met de waarschuwing "unreachable statement". ;) Ik gebruik zelf PhpStorm en kan dat wel aanraden, maar er zijn ook andere IDE's die dit ook kunnen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
Ik heb geprobeerd om PHP aan de praat te krijgen in Visual Studio, maar ik ben ermee gestopt omdat ik bang was m'n configuratie van WAMP ermee in de war te schoppen.

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
Joep schreef op donderdag 09 oktober 2014 @ 14:38:
Ik heb geprobeerd om PHP aan de praat te krijgen in Visual Studio, maar ik ben ermee gestopt omdat ik bang was m'n configuratie van WAMP ermee in de war te schoppen.
Ik zou gewoon PHPStorm pakken of evt. NetBeans anders.

  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
Zelfde verhaal. Tijdens het configureren van PHPStorm ging het ook mis, omdat WAMP de PHP-bestanden automatisch in een eigen directory plaatst. Kan ik niet veranderen, want dan gaat WAMP over de zeik. Als ik klaar ben met m'n project, dan gaat WAMP eraf en kan ik een eigen IDE gebruiken i.p.v. Notepad++.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Joep schreef op donderdag 09 oktober 2014 @ 14:38:
Ik heb geprobeerd om PHP aan de praat te krijgen in Visual Studio, maar ik ben ermee gestopt omdat ik bang was m'n configuratie van WAMP ermee in de war te schoppen.
offtopic:
Ik werk al een poos met PHP Tools van Devsense. Werkt fantastisch (voor zover PHP devven in VS werkt uiteraard :P ). Kost maar een paar tientjes en is, IMHO, z'n geld dubbel en dwars waard.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
Joep schreef op donderdag 09 oktober 2014 @ 14:50:
Zelfde verhaal. Tijdens het configureren van PHPStorm ging het ook mis, omdat WAMP de PHP-bestanden automatisch in een eigen directory plaatst. Kan ik niet veranderen, want dan gaat WAMP over de zeik. Als ik klaar ben met m'n project, dan gaat WAMP eraf en kan ik een eigen IDE gebruiken i.p.v. Notepad++.
Ja WAMP zet ze in een bepaalde folder, maar dan kan je IDE toch gewoon die folder gebruiken om in te werken?

  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
RobIII schreef op donderdag 09 oktober 2014 @ 14:55:
offtopic:
Ik werk al een poos met PHP Tools van Devsense. Werkt fantastisch (voor zover PHP devven in VS werkt uiteraard :P ). Kost maar een paar tientjes en is, IMHO, z'n geld dubbel en dwars waard.
Ben ik ook tegengekomen. Zal de trial eens proberen over een tijd
Barryvdh schreef op donderdag 09 oktober 2014 @ 15:01:
[...]

Ja WAMP zet ze in een bepaalde folder, maar dan kan je IDE toch gewoon die folder gebruiken om in te werken?
Geen zin om mee te lopen kloten nu. Iets ging verkeerd en/of niet direct goed en ik was bang de boel te vernøken. Eerst m'n project af, dan opnieuw proberen.

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 21:32
NMe schreef op donderdag 09 oktober 2014 @ 12:32:
SQL:
1
2
3
4
5
SELECT id, description, ad_group.id AS ad_group_id
FROM authorization
    LEFT JOIN ad_group ON authorization.id = ad_group.authorization_id
WHERE type = 'Account'
ORDER BY description

En dan in je code checken of ad_group_id gelijk is aan 2 en alleen in dat geval de selected-attribute afdrukken.
offtopic:
Is de syntax highlighting veranderd? Eerder waren woorden als 'SELECT', 'FROM' etc. altijd groen bij mij, nu zwart :?

  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

NMe schreef op donderdag 09 oktober 2014 @ 14:32:
Dat heeft 'ie zo te zien van mij gecopy/pasted. ;)
Klopt. Was even wat makkelijker dan de query zelf nog een keertje schrijven.
Joep schreef op donderdag 09 oktober 2014 @ 14:21:
Zo werkt het wel:
SQL:
1
SELECT authorization.id, authorization.description, IF(ad_group.authorization_id = (SELECT ad_group.authorization_id FROM ad_group WHERE ad_group.id = '2'), ' selected', NULL) as 'selected' FROM authorization LEFT JOIN ad_group ON authorization.id = ad_group.authorization_id WHERE type = 'Account'
Dan zou je het beter nog zo kunnen doen:
SQL:
1
2
3
4
5
6
7
8
SELECT      authorization.id, 
            authorization.description,
            IF(ad_group.authorization_id = authorization.id, 'selected', NULL) AS `selected`
FROM        authorization
LEFT JOIN   ad_group ON authorization.id = ad_group.authorization_id
WHERE       type = 'Account'
ORDER BY    description
GROUP BY    authorization.id

Dus de vergelijking met de huidige waarde. Verder hoef je in je IF geen select statement te doen, want alle gegevens heb je in principe al uit je join.

telefoontoestel


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Barryvdh schreef op donderdag 09 oktober 2014 @ 15:01:
[...]

Ja WAMP zet ze in een bepaalde folder, maar dan kan je IDE toch gewoon die folder gebruiken om in te werken?
Beter nog: een eigen projectfolder waar je in werkt en een automatische dev-deployment instellen in je IDE (of in elk geval in PhpStorm). Zo hou je tests met geuploade bestanden en dergelijke gescheiden van je verder schone code en heb je verder geen project-files van je IDE in je webroot.
Joep schreef op donderdag 09 oktober 2014 @ 15:06:
[...]

Geen zin om mee te lopen kloten nu. Iets ging verkeerd en/of niet direct goed en ik was bang de boel te vernøken. Eerst m'n project af, dan opnieuw proberen.
De tijd die het je kost om het één keer goed in te stellen verdien je direct terug aan het feit dat je IDE het je al vertelt als je iets fout doet.
ThinkPadd schreef op donderdag 09 oktober 2014 @ 15:18:
[...]

offtopic:
Is de syntax highlighting veranderd? Eerder waren woorden als 'SELECT', 'FROM' etc. altijd groen bij mij, nu zwart :?
offtopic:
Da's al twee maanden geleden gebeurd, joh. :P Er wordt overigens wel achter de schermen gekeken of er geen fijnere styles zijn.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • HansvDr
  • Registratie: Augustus 2009
  • Niet online
Joep schreef op donderdag 09 oktober 2014 @ 15:06:
[...]

Ben ik ook tegengekomen. Zal de trial eens proberen over een tijd


[...]

Geen zin om mee te lopen kloten nu. Iets ging verkeerd en/of niet direct goed en ik was bang de boel te vernøken. Eerst m'n project af, dan opnieuw proberen.
Pak webmatrix van Microsoft, is gratis en heeft php en mysql ondersteuning en een webserver . Simpele configuratie, en prima te doen.

  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
Barryvdh schreef op donderdag 09 oktober 2014 @ 13:00:
En je maakt nu voor elke execute() aanroep een nieuwe databaseverbinding? En je close zit na de return, dus die wordt nooit aangeroepen he. Waarom niet gewoon in het begin van je script de mysql connection maken en die gebruiken. En dan aan het einde weer sluiten?
jessy100 schreef op zondag 11 mei 2014 @ 16:20:
Php sluit open db connecties zelf aan het eind van het script.
Ik kan dus in principe de connectie aan het begint van het script declaren en vervolgens open laten, waarna PHP 'm zelf sluit als 'ie klaar is :?

Verwijderd

Aan het einde van de script word de verbinding gesloten, je zou het zelf kunnen gaan doen wanneer je erg met resources moet opletten.

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
Verwijderd schreef op vrijdag 10 oktober 2014 @ 12:31:
Aan het einde van de script word de verbinding gesloten, je zou het zelf kunnen gaan doen wanneer je erg met resources moet opletten.
Klopt maar dan moet je dus niet meerdere connecties in 1 script gaan openen.

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Joep schreef op vrijdag 10 oktober 2014 @ 12:30:
[...]
Ik kan dus in principe de connectie aan het begint van het script declaren en vervolgens open laten, waarna PHP 'm zelf sluit als 'ie klaar is :?
Technisch kan het, maar ik vraag me altijd af waarom je het zou willen?

Waarom zou je jezelf niet aanleren om gewoon behoorlijke housekeeping te doen?

Het niet sluiten van php-tags aan het einde van je script vind ik wel te verantwoorden omdat dat een php-specifiek iets is.
Maar een database connectie openen en sluiten op de juiste positie komt in elke programmeertaal voor... Dus waarom dat niet behoorlijk aanleren?

  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
Hé! Ik wil het wél fatsoenlijk aanleren hoor :P
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$connect = mysqli_connect("bladiebla");
if (mysqli_connect_errno())
{
    echo 'Failed to connect to MySQL: ' . mysqli_connect_error();
}
    
function execute($connect, $query)
{
    return mysqli_query($connect, $query);  
}

execute($connect, "SELECT * FROM table1");
execute($connect, "SELECT * FROM table2");

mysqli_close($connect);

Zoiets?

  • Joostje123
  • Registratie: September 2010
  • Laatst online: 21-11 15:53
execute($connect, "SELECT * FROM table1, table2");

dan graag ;)

  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
Het was een voorbeeld, copy paste, jeweet ;)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Dat is op zich beter, maar dan kom je meteen op het volgende punt: wat heeft de executefunctie nog voor nut als hij eigenlijk alleen mysqli_query wrapt met zelfs exact dezelfde parameters? :)

Wrappen kan best leuk zijn, maar dat in losse functies doen is meestal niet heel handig in een tijd waarin je fatsoenlijk OO kan werken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Joep
  • Registratie: December 2005
  • Laatst online: 19:06
telefoontoestel schreef op donderdag 09 oktober 2014 @ 17:40:
Dan zou je het beter nog zo kunnen doen:
SQL:
1
2
3
4
5
6
7
8
SELECT      authorization.id, 
            authorization.description,
            IF(ad_group.authorization_id = authorization.id, 'selected', NULL) AS `selected`
FROM        authorization
LEFT JOIN   ad_group ON authorization.id = ad_group.authorization_id
WHERE       type = 'Account'
ORDER BY    description
GROUP BY    authorization.id

Dus de vergelijking met de huidige waarde. Verder hoef je in je IF geen select statement te doen, want alle gegevens heb je in principe al uit je join.
Eerst GROUP BY, dan ORDER BY. Jouw IF query geeft een record de waarde "selected" als het account een ad_group gekoppeld heeft. Er is niks specifieks aan jouw query.

Ik wil juist dat er maar één account in de drop-down list de waarde "selected" krijgt toegewezen en dat is het account (SELECT ad_group.authorization_id FROM ad_group WHERE ad_group.id = '$_GET['id']')

Hoe dan ook, ik moet wel GROUP BY gaan gebruiken, want als een account meerdere groups heeft, dan komt authorization.description meerdere keren voor en dat is niet de bedoeling in een drop-down list.

Edit: Ik ga DISTINCT gebruiken i.p.v. GROUP BY, omdat ik geen gebruik maak van aggregate functions.

[ Voor 4% gewijzigd door Joep op 15-10-2014 11:34 ]


  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

Typo, kan gebeuren. Query verder ook niet getest. Voor het selecteren van de juiste waarde kun je in de if dan vergelijken met het resultaat uit je subselect.

telefoontoestel

Pagina: 1