[PHP] Extract werkt niet zoals verwacht.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 11:33
Hoi, Ik kijk me de laatste 2 uur verrot op het commando extract van php. Zover ik begrepen heb (zowel op php.net, got en phpfreakz erover nagezocht) kun je met extract een kolom uit je array gebruiken als variabele en deze invullen door een andere kolom. (Ik hoop dat ik nog goed zit)

Wel ik heb nu de volgende code:
PHP:
1
2
3
4
5
6
7
8
require('system/config.php');
$query = 'select item,data from system';
$result = mysql_query ($query);
while($result1 = mysql_fetch_array ($result))
    {
    extract ($result1) ;
    }
print $kleur;

1e regel zorgt dat de naam en zo goed gezet wordt en de verbinding naar de server geopend wordt.
2e regel selecteerd alleen de 2 kollomen die ik nodig heb (3e id heb ik niet nodig)
3e is de uitkomst van de query
4e plaats ik alles in een array
5 t/m 8 zou alles om moeten zetten van waardes naar variables met waarden.
9 moet de inhoud van variable kleur geven.

laten we dus zeggen dat in item de waarde kleur staat en in data groen dan moet ik uiteindelijk er dus uitkrijgen $kleur=groen. of denk ik nu mis?

Acties:
  • 0 Henk 'm!

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 08:29
Doe eens: while($result1 = mysql_fetch_assoc($result)) {

en nog even een tip:

Let op de naamgeving, result1 is namelijk niet zo veel zeggen even als result. Misschien kun je beter $rs[INSERT OMSCHRIJVING] en $row[INSERT OMSCHRIJVING] gebruiken. (bijv. $rsKlantGegevens en $rowKlantGegevens )

[ Voor 79% gewijzigd door Eskimootje op 02-09-2003 23:49 ]


Acties:
  • 0 Henk 'm!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 11:33
Eskimootje, bedankt voor de snelle reactie. Ik heb de assoc nu gebruikt, maar helaas, de variable groen geeft nog steeds geen gegevens terug.

Op 1 of andere manier twijfel ik of de gegevens in de array goed zijn. Omdat ik nog maar een beginnende programeur ben (zie ook het gebruik van result(1)) is er een simpele manier om te controlleren wat er in de array zit die aan extract gevoerd wordt.

Die benamingen van variablen ga ik nog nakijken. Ik kwam er niet uit en heb alles even simpel gehouden.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Eskimootje schreef op 02 September 2003 @ 23:41:
Let op de naamgeving, result1 is namelijk niet zo veel zeggen even als result. Misschien kun je beter $rs[INSERT OMSCHRIJVING] en $row[INSERT OMSCHRIJVING] gebruiken. (bijv. $rsKlantGegevens en $rowKlantGegevens )
Ik vind result1 ook een slechte naam, maar ben het niet helemaal eens met je redenering. Hij zegt eerst:
$result = mysql_query($query);
nix mis mee, je stopt het resultaat van de query in $result. so far so good.
Maar dan is het natuurlijk raar om daarna $result1 te gaan gebruiken. Dat impliceert eenzelfde iets in die variabele. Dat bevat het echter niet, het bevat een rij uit je mysql tabel met de geselecteerde velden. Ik noem 'm daarom zelf ook altijd gewoon $row. Waar ik over van mening verschil is dat ik het nogal ver vind gaan om die $row een dusdanige naam te geven dat je weet wat er in zit. Zeker als je een script/site maakt waarbij veel van een database gebruik wordt gemaakt is het een pokkewerk om iedere keer die hele variabele in te gaan zitten typen. Mijns inziens kun je veel beter een regel (of meerdere) comment boven de query toevoegen waarin je uitlegt waarom je die query doet. Dat is minder typewerk en nog duidelijker ook.

Aan de TS: waarom wil je zo graag van het extract commando gebruik maken? Zou je dat wat toe kunnen lichten?

Acties:
  • 0 Henk 'm!

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 08:29
ECHO $result1[0]."-".$result1[1]."*";

en ipv
$result = mysql_query ($query);
$result = mysql_query ($query) or die(mysql_error());

gebruiken

Acties:
  • 0 Henk 'm!

Verwijderd

gebruik print_r om de inhoud van je array result1 te tonen.
Hiermee kun je wat makkelijk debuggen en controleren of je tabel inhoud cq veld inhoud wel correct is.

Acties:
  • 0 Henk 'm!

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 08:29
marty schreef op 03 september 2003 @ 00:00:
[...]

Ik vind result1 ook een slechte naam, maar ben het niet helemaal eens met je redenering. Hij zegt eerst:
$result = mysql_query($query);
nix mis mee, je stopt het resultaat van de query in $result. so far so good.
Maar dan is het natuurlijk raar om daarna $result1 te gaan gebruiken. Dat impliceert eenzelfde iets in die variabele. Dat bevat het echter niet, het bevat een rij uit je mysql tabel met de geselecteerde velden. Ik noem 'm daarom zelf ook altijd gewoon $row. Waar ik over van mening verschil is dat ik het nogal ver vind gaan om die $row een dusdanige naam te geven dat je weet wat er in zit. Zeker als je een script/site maakt waarbij veel van een database gebruik wordt gemaakt is het een pokkewerk om iedere keer die hele variabele in te gaan zitten typen. Mijns inziens kun je veel beter een regel (of meerdere) comment boven de query toevoegen waarin je uitlegt waarom je die query doet. Dat is minder typewerk en nog duidelijker ook.

Aan de TS: waarom wil je zo graag van het extract commando gebruik maken? Zou je dat wat toe kunnen lichten?
Als je bijvoorbeeld binnen in een while-loop (geactiveerd door een query) een query gebruikt zal er een probleem optreden als je steeds dezelfde naam gebruikt. Daarnaast maakt mijn oplossing commentaar overbodig en leest het een stuk makkelijker door de code ipv elke keer weer te moeten bedenken welke $row er ook alweer op gevraagd was.

Daarnaast hoop ik voor je dat het denkwerk je meer tijd kost als het typen van de tekst. Hoeveel seconden kost het nou om een paar letters te typen?

[ Voor 5% gewijzigd door Eskimootje op 03-09-2003 00:09 ]


Acties:
  • 0 Henk 'm!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 11:33
OK met de echo krijg ik gewoon keurig te zien site_name-LW-CMS* (ja ik ben voor mezelf een cms aan het bouwen) site_name zou dus de variable moeten worden ($site_name) en LW-CMS er in.

Ik heb die "or die..." er ook ingezet(wat er in zekere zin off in moet, maar vergeten ben), maar zoals hiervoor al aangegeven gaat het verder goed...

@Marty. Ik wil alle "belangrijke" waardes van mijn CMS in een database zetten, bv: naam (vd site), quote, lettertype, achtergrond, kleur van letters,........ name it. Zodat het simpel aan te passen is in de database. Ik heb begrepen dat je met extract de waarde van kolom 1 kunt gebruiken als variabele naam en de inhoudt van kolom 2 als de waarde. Zo is het simpel om een nieuwe variabele aan te maken en meteen te gebruiken als bv $lettertype (als je lettertype toevoegd in de db)

Hopelijk is het duidelijk

[ Voor 45% gewijzigd door ge-flopt op 03-09-2003 00:15 ]


Acties:
  • 0 Henk 'm!

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 08:29
Is er nu nog een probleem? print die bijvoorbeeld $site_name ook niet?

En wat word de output van:
print_r $result1;
?

[ Voor 28% gewijzigd door Eskimootje op 03-09-2003 00:19 ]


Acties:
  • 0 Henk 'm!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 11:33
Ik heb na de extract een regel staan met print (ook getest met echo) $site_name maar het blijft angstvallig leeg.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Eskimootje schreef op 03 September 2003 @ 00:08:
[...]

Als je bijvoorbeeld binnen in een while-loop (geactiveerd door een query) een query gebruikt zal er een probleem optreden als je steeds dezelfde naam gebruikt.
Hoe dan?
Ik zie niet in waarom dit problemen zou opleveren:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
 // deze query haalt alle informatie van alle members op
$query = "SELECT * FROM members";
if (!$result = mysql_query($query))
{
    echo $query."<br>\nis geen geldige query: ".mysql_error();
}
else
{
    while ($row = mysql_fetch_assoc($result))
    {
        echo $row['name']." is ".$row['leeftijd']." jaar oud.<br>\n";
    }
}

dat moet je me toch eens uitleggen
Daarnaast maakt mijn oplossing commentaar overbodig
Tja, da's 1 manier om er naar te kijken. Mijn manier maakt ellelange variabelen die nog maar de helft zeggen van wat er gebeurd overbodig :?
en leest het een stuk makkelijker door de code ipv elke keer weer te moeten bedenken welke $row er ook alweer op gevraagd was.
De query zal er in negen van de 10 gevallen vlak boven staan en anders voeg je toch een regeltje commentaar boven de while loop toe.
Daarnaast hoop ik voor je dat het denkwerk je meer tijd kost als het typen van de tekst. Hoeveel seconden kost het nou om een paar letters te typen?
Tja, ik werk met databases waar tabellen met soms zo'n 30 velden in voorkomen. Heel wat dus als je 30 keert $rowKlantGegevens ipv $row moet typen. Het lijkt me gewoon onwijs overbodig om iedere keer $rowKlantGegevens te gaan typen. Op het moment dat je oude code induikt dan zie je toch eerst die query met het commentaar wel staan. Op dat moment voegt $rowKlantGegevens dus helemaal niets meer toe aan de leesbaarheid van je code.
ge-flopt schreef op 03 September 2003 @ 00:09:
Ik heb begrepen dat je met extract de waarde van kolom 1 kunt gebruiken als variabele naam en de inhoudt van kolom 2 als de waarde.
Dat vind ik persoonlijk behoorlijk wazig. Waarom niet gewoon de kolommen heldere namen geven en daar die waardes in opslaan. Zodat je daarna gewoon $row['lettertype'] kunt benaderen om het lettertype te krijgen.
Wat in dat geval dan nog beter zou zijn is:

$site_vars = mysql_fetch_assoc($result);
(ik ga er van uit dat je query maar 1 row terug geeft?)

Dan heb je al je variabelen van je site netjes in 1 array zitten. Houdt het ook wat leesbaarder

Acties:
  • 0 Henk 'm!

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 08:29
marty schreef op 03 September 2003 @ 00:51:
[...]


Hoe dan?
Ik zie niet in waarom dit problemen zou opleveren:

[EDIT BY ESKIMOOTJE]
PHP:
1
2
3
4
5
6
7
8
9
10
$sql = "SELECT * FROM blaat";
$result = mysql_query($sql);
while($row = mysql_fetch_row($result))
{
  $sql = "SELECT * FROM andereblaat WHERE id = ".$row[0];
  $result = mysql_query($sql);
  while($row = mysql_fetch_row($result)) {
    ECHO "iets";
  }
}

[/EDIT]
dat moet je me toch eens uitleggen
Dit levert wel een probleem op.
Tja, da's 1 manier om er naar te kijken. Mijn manier maakt ellelange variabelen die nog maar de helft zeggen van wat er gebeurd overbodig :?
Het zegt allicht meer als $row. En jij krijgt meer commentaar + je scrolled je gek.
De query zal er in negen van de 10 gevallen vlak boven staan en anders voeg je toch een regeltje commentaar boven de while loop toe.
De query staat wel boven de while loop maar die while-loop kan wel een aardige pagina in beslag nemen soms.
Tja, ik werk met databases waar tabellen met soms zo'n 30 velden in voorkomen. Heel wat dus als je 30 keert $rowKlantGegevens ipv $row moet typen. Het lijkt me gewoon onwijs overbodig om iedere keer $rowKlantGegevens te gaan typen. Op het moment dat je oude code induikt dan zie je toch eerst die query met het commentaar wel staan. Op dat moment voegt $rowKlantGegevens dus helemaal niets meer toe aan de leesbaarheid van je code.
Dan typ je toch eerst $row allesselecteren en daarna vervangen is je code als je het terugkijkt wel leesbaarder.
Dat vind ik persoonlijk behoorlijk wazig. Waarom niet gewoon de kolommen heldere namen geven en daar die waardes in opslaan. Zodat je daarna gewoon $row['lettertype'] kunt benaderen om het lettertype te krijgen.
Wat in dat geval dan nog beter zou zijn is:
Er bestaat geen kolom lettertype de tabel ziet er zo uit bij hem:
code:
1
2
3
[Variabele]  [Waarde]
Naam            Dezesite
Kleur            Groen

anders krijg je een beetje veel tabellen.

[ Voor 18% gewijzigd door Eskimootje op 03-09-2003 01:27 ]


Acties:
  • 0 Henk 'm!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 11:33
Eskimootje schreef op 03 september 2003 @ 00:14:
En wat word de output van:
print_r $result1;
?
output print_r
Array ( [0] => site_name [item] => site_name [1] => LW-CMS [data] => LW-CMS )
Moet hij dan niet alles laten zien van de array? Ik heb nl. nog een site_quote. Heb het nu met
marty schreef op 03 september 2003 @ 00:51:
[...]
knip.....

Dat vind ik persoonlijk behoorlijk wazig. Waarom niet gewoon de kolommen heldere namen geven en daar die waardes in opslaan. Zodat je daarna gewoon $row['lettertype'] kunt benaderen om het lettertype te krijgen.
Wat in dat geval dan nog beter zou zijn is:

$site_vars = mysql_fetch_assoc($result);
(ik ga er van uit dat je query maar 1 row terug geeft?)

Dan heb je al je variabelen van je site netjes in 1 array zitten. Houdt het ook wat leesbaarder
Het leek me gewoon makkelijker om de kolom item als variabele te gebruiken. Zeker omdat je dan niet elke keer een "dijk" hoeft te typen. Als je straks bij wijze van 100 variabele hebt en je moet 100X $row[' '] typen dan lijkt me via extract wat simpeler

Eskimootje legt het goed uit:
Eskimootje schreef op 03 September 2003 @ 01:25:
[...]
knip....
Er bestaat geen kolom lettertype de tabel ziet er zo uit bij hem:
code:
1
2
3
[Variabele]  [Waarde]
Naam            Dezesite
Kleur            Groen

anders krijg je een beetje veel tabellen.

[ Voor 16% gewijzigd door ge-flopt op 03-09-2003 08:54 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Eskimootje schreef op 03 September 2003 @ 01:25:
[...]

Dit levert wel een probleem op.
Dat voorbeeld gaat natuurlijk nergens over. Allicht dat je niet 2x dezelfde variabele naam gaat gebruiken. Dat geldt voor iedere situatie.
Maargoed, dit begint een zinloze discussie te worden, ik hou er over op.
ge-flopt schreef :
Het leek me gewoon makkelijker om de kolom item als variabele te gebruiken. Zeker omdat je dan niet elke keer een "dijk" hoeft te typen. Als je straks bij wijze van 100 variabele hebt en je moet 100X $row[' '] typen dan lijkt me via extract wat simpeler
Dat kan misschien wel wat simpeler lijken, maar als je (niet $row maar bijv.) $site_vars als array naam gebruikt dan wordt het er wel een stuk leesbaarder op. Als je dan ergens in je code ziet staan $site_vars['lettertype'], dan weet je gelijk dat het een waarde is die je uit je tabel heb gehaald en dat ie dus nergens anders vandaan kan komen. Zeker als dit er 100 zijn, dan raak je snel de draad kwijt en kan dit dus z'n voordelen hebben. Daarbij biedt een array ook nog andere voordelen. Zo kun je allerlei functies gebruiken om iets in die array op te zoeken, of op het bestaan ervan te controleren. Je kunt met 1 commando alle waardes weer wissen. Etc. Dat nut zie je nu misschien niet, maar kan later in je project wel heel erg handig zijn.
Ook vind ik deze aanpak minder mooi qua hoe de tabel in je database er uit gaat zien. Je kan natuurlijk ook gewoon netjes iedere waarde onder een naam opslaan en vervolgens dit doen:

PHP:
1
2
3
$row = mysql_fetch_assoc($result);
foreach ($row AS $key => $value)
   $$key = $value;


Is ook niet echt mooi, maar heeft hetzelfde effect en is database-wise tenminste wel een stuk mooier

Acties:
  • 0 Henk 'm!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 11:33
Marty, ik ben nu even naar die andere oplossing aan het kijken want ik kom er niet uit met extract. Nu zit ik alleen met het probleem hoe bepaal ik met $row['data'] dat hij bv de rij moet pakken met het lettertype. dat is me niet geheel duidelijk.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Kijk, ik ben van mening dat je je database moet gebruiken waar ie voor bedoelt is en niet voor 1 of andere vage constructie die als hulpmiddel voor php dient. (gaat wellicht ook niet altijd op, maar zeker niet voor die constructie met extract wat jij probeert)

Mijn voorstel is dus om gewoon alle waardes netjes onder een naam op te slaan in je tabel die aangeeft wat voor waarde daar is opgeslagen.

Je maakt dus bijvoorbeeld een tabel Sitevars aan en daarin maak je de velden id, naam, bgcolor, font_type en font_size aan. (ik noem maar wat)
vervolgens stop je daar de waardes
'site1', '#FFFFFF', 'verdana, arial', '12pt' in (id voer je niets in want die zet je uiteraard op auto_increment)

stel dat site1 als id het getal 1 krijgt.
en je haalt zo je waardes op:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$query = "SELECT * FROM Sitevars WHERE id=1";
if (!$result = mysql_query($query))
{
    echo $query."<br>\nis geen geldige query: ".mysql_error();
}
else
{
    $row = mysql_fetch_assoc($result);
    foreach ($row AS $key => $value)
        $$key = $value;
}


dan beschik je daarna over de variabelen $id, $naam, $bgcolor, $font_size en $font_type die de waardes '1', 'site1', '#FFFFFF', 'verdana, arial' en '12pt' bevatten. Precies wat je wilt.

Maar let dus op: je krijgt hier nu ineens een variabele $id wat een vrij algemene naam voor een variabele is. Ik zou daar persoonlijk niet zo blij mee zijn - zeker als je strax veel veldnamen heb. Daarbij is een $$ constructie gewoon een beetje..... vies.... zeg maar. Als je het mij vraagt ben je beter af met een array waar je alles in stopt. Maargoed, dat moet je zelf weten

Acties:
  • 0 Henk 'm!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 11:33
Maar wat je dan krijgt is dat je bijna voor alles een tabel aan moet maken. terwijl ik eigenlijk de aantal tabels niet te groot wil laten worden en als je maar 1 regel erin hebt staan, dan zou het misschien makkelijker zijn om alles in een soort config file te doen.

[ Voor 30% gewijzigd door ge-flopt op 03-09-2003 12:38 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ge-flopt schreef op 03 September 2003 @ 12:32:
Maar wat je dan krijgt is dat je bijna voor alles een tabel aan moet maken.
Dat snap ik niet. Waarom zou je meer dan 1 tabel moeten aanmaken? Wat ik er van begrijp wat jij wil is een CMS waarbij je per website over de juiste variabelen beschikt. Dan maak je toch gewoon één tabel aan, waar je per website al die waardes netjes per veld opslaat? Ik snap niet zo goed waarom jij meerder tabellen denkt nodig te hebben.

Acties:
  • 0 Henk 'm!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 11:33
Marty ik heb het licht gezien... ik snap nu wat je bedoelt... laat maar. Klopt inderdaad zoals jij het zecht. Om het simpel te zeggen, zat ik verticaal te denken en jij horizontaal.
Ik wilde alles in twee kolommen doen en jij zet alles eigenlijk in 2 rijen, wat eigenlijk het zelfde effect heeft.

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 11:33
Even een update-je... ben nu een half avondje aan het programmeren op de manier die je aangaf Marty. Perfect. Valt simpel een veldje bij te maken, gegevens erbij zetten en je kunt verder programmeren. :D
Pagina: 1