[PHP] verlies van data

Pagina: 1
Acties:
  • 128 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik had even een vraagje over het verlies van data buiten een while-loop.

code is als volgt:
PHP:
1
2
3
4
5
6
$sql = "SELECT * FROM winkel_orders WHERE ordernummer='".$_GET["ordernummer"];
$result = mysql_query($sql,$db);
while($row=mysql_fetch_array($result)){
  echo "1. Contract: ".$row["winkel_contract"]."<br />";
}
echo "2. Contract: ".$row["winkel_contract"]."<br />";


dit heeft als resultaat:
1. Contract: testcontract
2. Contract:

Ik vroeg mij af hoe dit kwam? De while loop haalt maar 1 rij op en de array $row wordt nergens gereset.

bij voorbaat dank!

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik weet geen fluit van PHP, maar is de scope van $row niet enkel binnen de while geldig gezien je 'm daar 'declareert' (of: voor het eerst gebruikt)?

Oh, en zowieso wordt bij de laatste iteratie $row natuurlijk "false" omdat mysql_fetch_array dan geen resultaten meer geeft.
Returns an array of strings that corresponds to the fetched row, or FALSE if there are no more rows.
En nu weet je ook waarom ik geen trek heb me in PHP te verdiepen :X

[ Voor 64% gewijzigd door RobIII op 16-05-2007 10:13 ]

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


Acties:
  • 0 Henk 'm!

  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 22:09

Koppensneller

winterrrrrr

Check dit even, een stuk op PHP.net over de scope van variabelen:

http://us2.php.net/variables.scope

Acties:
  • 0 Henk 'm!

Verwijderd

Je doet de while sluiten met een }

In de while declareer je em en dan sluit je
Daarna zal PHP niet meer weten wat die var inhoud en geeft dus nix weer

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Bij elke iteratie van de loop wordt $row opnieuw gedeclareerd.
De $row die je gebruikt na de loop is dus de laatste die je gedeclareerd hebt.

De scope zou het niet mogen zijn omdat die per functie gaat, en niet per loop. (foreach apart geval)

De row wordt echter wel gereset. De functie mysql_fetch_array faalt namelijk.
Dus het 'falend resultaat' wordt in $row gezet. :)

[ Voor 21% gewijzigd door Gonadan op 16-05-2007 10:10 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • Martinspire
  • Registratie: Januari 2003
  • Laatst online: 19-09 09:35

Martinspire

Awesomeness

Inderdaad, die eerste regel haalt ie uit die database ( uit $row )
En vervolgens sluit je hem af ( } ) waarna je dus een lege waarde krijgt.

Misschien handig om wat tutorials door te lezen? ( phphulp.nl of phpfreakz.nl ?)

Martinspire - PC, PS5, XSX


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Van dit:
PHP:
1
while($row=mysql_fetch_array($result)){

Moet hij dit:
PHP:
1
$row=mysql_fetch_array($result)

toch echt twee keer uitvoeren, de eerste keer staat je testcontract erin, de tweede keer levert mysql_fetch_array false terug (en wordt $row dus ook false), en zal er uit de while-loop gesprongen worden.

Met reset() kun je de resultset weer op 0 zetten trouwens, hierdoor kun je er nogmaals doorheen lopen.

[ Voor 3% gewijzigd door CodeCaster op 16-05-2007 10:11 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Allereerst kan deze query niet uitgevoerd worden, omdat je een ' niet afsluit, bij je WHERE statement. Ook is deze query nogal gevoelig voor SQL injection. Vertrouw nooit data ingevoerd door gebruikers. Je zou die GET variabele bijvoorbeeld eens door intval($_GET['ordernummer']) kunnen laten omzetten naar een echt nummer.

Als je toch maar 1 rij verwacht, gebruik dan LIMIT 1 aan het einde van je query, zodat MySQL stopt met zoeken nadat het 1 regel heeft gevonden. En waarom de while loop? Allemaal extra laadtijd die je kan besparen.

Verder, zie de 2 hierboven over scope.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank voor de reacties het is mij helemaal duidelijk! :)

Acties:
  • 0 Henk 'm!

  • doxick
  • Registratie: Augustus 2006
  • Laatst online: 14-05 10:34
mooi zeg dit topic:
de eerste die het goed heeft is de enige die geen php zegt te kunnen =]
A) het heeft niks te maken met de scope
B) while ($row = mysql_fetch_array( $result )); werkt ook gewoon terwijl hij niet wordt afgesloten door }

Waar ligt het aan:
while ($row = mysql_fetch_array( $result ))
de eerste keer is er een resultaat dus komt dit resultaat in $row te staan
de tweede keer is er geen resultaat, dus false. dat is ook het moment waarmee de condition van de while loop verandert in false (immers: $row = mysql_fetch_array( $result ) = false)

niks geen scope, gewoon een return value van de mysql_fetch_array

probeer anders maar:
PHP:
1
2
3
4
5
6
7
8
<?
    while ($i < 5)
    {
        $a = "blaat";
        $i++;
    }
    echo $a;
?>

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
doxick schreef op vrijdag 18 mei 2007 @ 04:46:
mooi zeg dit topic:
de eerste die het goed heeft is de enige die geen php zegt te kunnen =]
Al heeft hij dat er wel achteraf bij ge-edit. ;)
Maar hij heeft gelijk.

Een leuk punt want aansluit op het scope verhaal is het volgende:
Bij het gebruik van een foreach om door een array te lopen wordt er een kopie van het array gebruikt.
Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. Therefore, the array pointer is not modified as with the each() construct, and changes to the array element returned are not reflected in the original array. However, the internal pointer of the original array is advanced with the processing of the array. Assuming the foreach loop runs to completion, the array's internal pointer will be at the end of the array.

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
RobIII schreef op woensdag 16 mei 2007 @ 10:06:
En nu weet je ook waarom ik geen trek heb me in PHP te verdiepen :X
Nee, want while(!rs.eof) is niet precies hetzelfde ofzo.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 19:48

pistole

Frutter

Grijze Vos schreef op vrijdag 18 mei 2007 @ 12:04:
[...]

Nee, want while(!rs.eof) is niet precies hetzelfde ofzo.
Ik denk dat je RobIII niet helemaal hebt begrepen (iets met strings in een resultset enzo)

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
pistole schreef op vrijdag 18 mei 2007 @ 12:09:
[...]

Ik denk dat je RobIII niet helemaal hebt begrepen (iets met strings in een resultset enzo)
die functie geeft gewoon een pointer terug naar een record, en dat blijft ie doen totdat de recordset leeg is, dan geeft ie null (false) terug. Dat die records arrays van strings zijn maakt echt geen ene ruk uit, PHP is dynamically typed.

Zijn verkapte flame is gewoon op hetzelfde niveau als "ik heb een hekel aan M$".
Je mag best een hekel hebben aan PHP, maar persoonlijk hoef ik dat niet in every other PHP topic op dit forum te lezen eigenlijk.

[ Voor 11% gewijzigd door Grijze Vos op 18-05-2007 12:18 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Misschien begrijp ik je verkeerd maar RobIII bedoelt naar mijn idee het mixed resulttype (en niet de array van Strings). En naar mijn idee begrijpelijk als iemand dit vies vindt.

En grappig detail: null is niet hetzelfde als false in PHP.(http://www.php.net/manual/en/language.types.null.php). De functie geeft dan ook FALSE terug en geen null.
PHP:
1
2
3
4
5
6
7
if (null == false) {
        echo "null == false\n";
}

if (null === false) {
        echo "null === false";
}

Geeft wel "null == false" en niet "null === false". Het is alleen in PHP zo dat NULL naar false wordt geconverteerd indien nodig zodat het in dit geval niet uitmaakt of er nu null of false wordt teruggegeven.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Grijze Vos schreef op vrijdag 18 mei 2007 @ 12:04:
[...]

Nee, want while(!rs.eof) is niet precies hetzelfde ofzo.
Nee, want .eof geeft of true of false en niet een array van strings of false ;)

En het is verder geen verkapte PHP flame, helemaal niet. Ik zeg alleen dat mijn voorkeur ergens anders ligt. Niet meer en niet minder.
Grijze Vos schreef op vrijdag 18 mei 2007 @ 12:13:
[...]
Je mag best een hekel hebben aan PHP, maar persoonlijk hoef ik dat niet in every other PHP topic op dit forum te lezen eigenlijk.
Granted, in de meeste PHP topics waarin ik post (als ik er al in post ;) ) vermeld ik even dat ik er geen zak van weet; maar dat is puur omdat het kan zijn omdat ik dan onzin sta uit te kramen. Ik weet niet waar jij vandaan haalt dat er in "every other PHP topic" geflamed wordt :?

[ Voor 39% gewijzigd door RobIII op 18-05-2007 14:41 ]

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


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
RobIII schreef op vrijdag 18 mei 2007 @ 14:39:
[...]

Nee, want .eof geeft of true of false en niet een array van strings of false ;)
EOF geeft ook alleen aan of de recordset End Of File is.... mysql_fetch_array() heeft, zoals je uit de naam al kunt afleiden, een hele andere bedoeling....
het is dus appels en peren vergelijken...

[ Voor 6% gewijzigd door P.O. Box op 18-05-2007 14:44 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
RobIII schreef op vrijdag 18 mei 2007 @ 14:39:
[...]

Nee, want .eof geeft of true of false en niet een array van strings of false ;)

En het is verder geen verkapte PHP flame, helemaal niet. Ik zeg alleen dat mijn voorkeur ergens anders ligt. Niet meer en niet minder.
Komt gewoon op hetzelfde neer als een pointer list. Of je geeft een pointer, of null.
Dat ze hier `null` hebben geimplementeerd als `false`, is wellicht niet handig, maar het verandert niks aan de werkwijze.

Taal-filosofische debatten en voorkeuren voor andere talen hoeven wat mij betreft niet telkens in een php topic aan bod te komen. Ik stoor me gewoon aan het feit dat er te vaak in een php topic vermeldt moet worden dat de betreffende poster liever geen PHP gebruikt want <vul reden in>.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Wim-Bart
  • Registratie: Mei 2004
  • Laatst online: 10-01-2021

Wim-Bart

Zie signature voor een baan.

Waarom niet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ordernummer= (isset($_GET["ordernummer"])?$_GET["ordernummer"]:-1); 
$sql = "SELECT `winkel_contract` FROM `winkel_orders` WHERE ordernummer='".$ordernummer."';";
unset($result);
$result = mysql_query($sql,$db); 

$rows= mysql_num_rows($result);
$row= array();

if ($rows>0)
{
  for($contract=0;$contract<$rows;$contract++)
  {
    $row= mysql_fetch_array($result);
    echo ($contract+1)." Contract: ".$row[winkel_contract]."<br />";
  } 
}
else
{
  echo "Sorry er zijn geen contracten.";
}

Beheerders, Consultants, Servicedesk medewerkers. We zoeken het allemaal. Stuur mij een PM voor meer info of kijk hier De mooiste ICT'er van Nederland.


Acties:
  • 0 Henk 'm!

  • Wim-Bart
  • Registratie: Mei 2004
  • Laatst online: 10-01-2021

Wim-Bart

Zie signature voor een baan.

RobIII schreef op vrijdag 18 mei 2007 @ 14:39:
[...]

Nee, want .eof geeft of true of false en niet een array van strings of false ;)
[...]
Persoonlijk vindt ik dat altijd vieze aannames. .eof is een leuke functie maar in asp een volledig lugubere functie. Heb je een lege tabel dan moet je zowel .eof en .bof testen. Doe je dat niet goed dan zijn de resultaten soms heel raar en zoek je uren naar een bug. Voor mij zou code er als volgt uit moeten zien (in pseudocode):

code:
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
30
31
32
33
34
35
Open tabel;
als tabel==open dan
(
  voer query uit;
  als query==succes dan
  (
    bepaal aantal records in query;
    als aantal records>0 dan
    (
       zet iteratie op 0;
       herhaal zolang iteratie<aantal records
       (
          lees record;
          als record goed gelezen
          (
            verwerk de record......................
          )
          anders
          (
             lees fout exceptie;
          )
       )
    )
   anders
   (
     Meld dat er 0 records zijn of 0 records exceptie;
   )
  )
  anders
  (
    query fout exceptie;
  )
) anders (
  tabel niet open exceptie;
)


Op deze wijze vang je heel wat ellende af. Bijvoorbeeld, er zit een memory leak in een (ODBC) driver en je test op .eof. Nu kan het zijn dat je itereerd tot .eof en er blind van uitgaan dat je leesacties altijd goed gaan, dan zit je opeens met een huge probleem, door voldoende testen in te bouwen ondervang je heel wat problemen waar je geen invloed op hebt. Maar ieder zijn eigen idee hierover natuurlijk. Zelf merk ik dat logica ongeveer 20% van de code is maar goede foutafhandeling 80% is. En met de juiste plaatsing van testen kost het weinig performance.

Beheerders, Consultants, Servicedesk medewerkers. We zoeken het allemaal. Stuur mij een PM voor meer info of kijk hier De mooiste ICT'er van Nederland.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
nevermind

[ Voor 92% gewijzigd door PrisonerOfPain op 18-05-2007 15:54 ]


Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 19:48

pistole

Frutter

Wim-Bart schreef op vrijdag 18 mei 2007 @ 15:40:
[...]


Persoonlijk vindt ik dat altijd vieze aannames. .eof is een leuke functie maar in asp een volledig lugubere functie. Heb je een lege tabel dan moet je zowel .eof en .bof testen. Doe je dat niet goed dan zijn de resultaten soms heel raar en zoek je uren naar een bug. Voor mij zou code er als volgt uit moeten zien (in pseudocode):

(...)

Op deze wijze vang je heel wat ellende af. Bijvoorbeeld, er zit een memory leak in een (ODBC) driver en je test op .eof. Nu kan het zijn dat je itereerd tot .eof en er blind van uitgaan dat je leesacties altijd goed gaan, dan zit je opeens met een huge probleem, door voldoende testen in te bouwen ondervang je heel wat problemen waar je geen invloed op hebt. Maar ieder zijn eigen idee hierover natuurlijk. Zelf merk ik dat logica ongeveer 20% van de code is maar goede foutafhandeling 80% is. En met de juiste plaatsing van testen kost het weinig performance.
Hoewel het zwaar offtopic is, heb ik in mijn inmiddels 10 jaar .asp ervaring nooit last gehad van deze memory leak en noodzaak gezien om op zowel eof als bof te checken...

[ Voor 21% gewijzigd door pistole op 18-05-2007 20:38 ]

Ik frut, dus ik epibreer

Pagina: 1