[PHP/MySQL] Query wordt niet uitgevoerd binnen foreach loop

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Ik gebruik onderstaande foreach loop en query om een winkelmandje weg te schrijven. De foreach loop wordt uitgevoerd en loopt 2 keer als er 2 producten in staan, 3 keer als er 3 producten in staan enz. Dit werkt dus.
Alleen wordt de query slechts een keer uitgevoerd en dus wordt het productnummer dat het laatste is toegevoegd aan het winkelwagentje alleen in de database weggeschreven.

Wie weet er wat ik verkeerd doe?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
print count($_SESSION['winkelwagen']); 
foreach ($_SESSION['winkelwagen'] as $productnummer => $quantity) 
{ 
  $qbestelregel = "INSERT INTO 
                     orderinformatie 
                     (Order_id, 
                      Productnummer,   
                      ProdVariantenId, 
                      Hoeveelheid, 
                      Geleverd) 
                   VALUES 
                      ('$Order_id', 
                       '".$productnummer."', 
                       '".$_SESSION["ProdVariantenId"]."', 
                       '$quantity', 
                       '-1')"; 
  
  //$result_qbestelregel = mysql_query($qbestelregel) or die 
(mysql_error()); 
  print "Het invoeren van ".$productnummer." is gelukt<br>"; 
}


Dit genereert deze output:
Het invoeren van 151 is gelukt
Het invoeren van 127 is gelukt
INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '127', '', '1', '-1')

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
De mysql_query regel is uitgecomment :P
Maar ik neem aan dat je dat al geprobeerd hebt? Heb je de query al eens geprobeerd in een MySQL Query browser of PHPMyAdmin dinges?

offtopic:
Waarom is geleverd -1? Waarom gebruik je niet gewoon 0 of NULL?

[ Voor 19% gewijzigd door RobIII op 07-04-2008 14:44 ]

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!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Ik heb de query even uitgezet, omdat ik anders enorm veel bestellingen in mijn database heb tijdens het testen.

Die -1 heb ik niet verzonnen. De database was er al.

Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Ja, de query werkt gewoon. De bestellingen worden ook toegevoegd. Alleen, als ik meer dan 1 producten in het winkelwagentje heb, wordt alleen het laatst toegevoegde product ingevoerd.

Acties:
  • 0 Henk 'm!

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

Creepy

Tactical Espionage Splatterer

En je hebt $qbestelregel laten afdrukken? Deze zijn ook altijd goed? (lees: ga eens echt debuggen, of geef in elk geval aan dat je dat al hebt gedaan en wat je dan hebt gedaan ;) ).

[ Voor 13% gewijzigd door Creepy op 07-04-2008 14:51 ]

"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!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
$qbestelregel geeft deze output:
INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '127', '', '1', '-1')

Dit had ik in mijn eerste bericht al vermeld.

PHP:
1
2
3
echo "<pre>"; 
print_r($_SESSION);
echo "</pre>";


geeft als output:
[Productnummer] => 294
[aantal] => 1
[winkelwagen] => Array
(
[151] => 1
[127] => 1
[135] => 1
[294] => 1
)

Deze productnummers zijn overigens andere dan in mijn eerste bericht.

[ Voor 6% gewijzigd door Matthijs1982 op 07-04-2008 14:55 ]


Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 08-09 16:22
Tip: Je kunt ook meerdere rijen inserten met 1 query:
SQL:
1
2
3
INSERT INTO leden (naam,leeftijd,woonplaats,functie,berichten,geboren)
VALUES ('Ome Willem','45','Bestaatnietstraat','Reporter','0','1961-08-09'),
('Kermit','80','Sesamstraat','Moderator','0','1921-04-12') ;
(zie ook http://semeleer.nl/tut_sql.html#ins)
Dit los je probleem misschien niet op, maar het is mijns inziens een betere query.

Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij blijft je $Order_id hetzelfde? Waarom wil je een INSERT doen met een id-nummer toegewezen? Waarom zijn je numerieke waarden naar de Database toegestuurd als strings?
Tevens idd, volg Stephan zijn raad op: maak een loop om 1 Query op te bouwen, met alle Insertable values. Dit is niet handig als je LAST_INSERT_ID oid wilt gebruiken, naar ik weet.
Succes ermee Matthijs

Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Order_id komt uit een andere query. Er is een tabel orders en een tabel orderinformatie. In de tabel orders staat het klantnummer, factuurnummer, besteldatum enz.
Alle producten komen dan in de tabel orderinformatie. Vandaar dus die Order_id die uit de tabel orders komt.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Matthijs1982 schreef op maandag 07 april 2008 @ 14:54:
$qbestelregel geeft deze output:
INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '127', '', '1', '-1')

Dit had ik in mijn eerste bericht al vermeld.

PHP:
1
2
3
echo "<pre>"; 
print_r($_SESSION);
echo "</pre>";


geeft als output:
[Productnummer] => 294
[aantal] => 1
[winkelwagen] => Array
(
[151] => 1
[127] => 1
[135] => 1
[294] => 1
)

Deze productnummers zijn overigens andere dan in mijn eerste bericht.
Het ziet ernaar uit dat niet alle producten en bijbehorende aantallen als array in je sessie staan. Of eigenlijk wel, maar je hebt Productnummer en aantal ook nog eens apart? :?

Verder: je drukt in de code die je hier postte niet de query af maar hij staat wel in je output. Waar staat de regel die die query afdrukt? Binnen de query of erbuiten? Ik vermoed eigenlijk dat die erbuiten staat. :P

'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.


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Onderstaande code is de code die ik gebruik om te testen wat de output is:
Het heeft wel gewerkt, maar toen heb ik iets aangepast en nu werkt het niet meer. |:(
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
print count($_SESSION['winkelwagen']); 
foreach ($_SESSION['winkelwagen'] as $productnummer => $quantity) 
{ 
  $qbestelregel = "INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('$Order_id', '".$productnummer."', '".$_SESSION["ProdVariantenId"]."', '$quantity', '-1')";   
  //$result_qbestelregel = mysql_query($qbestelregel) or die (mysql_error()); 
  print "Het invoeren van ".$productnummer." is gelukt<br>"; 
}

$_SESSION["Order_id"] = $Order_id;

echo "$qbestelregel<br />$Productnummer";

echo "<pre>"; 
print_r($_SESSION);
echo "</pre>";

echo "<pre>"; 
print count($_SESSION['winkelwagen']);
echo "</pre>";


Dit is de output:
INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('', '151', '', '1', '-1')
Array
(
[aantal] => 1
[winkelwagen] => Array
(
[180] => 1
[151] => 1
)

print count($_SESSION['winkelwagen']); geeft overigens het juiste aantal producten uit het winkelwagentje.

[ Voor 18% gewijzigd door Matthijs1982 op 07-04-2008 16:08 ]


Acties:
  • 0 Henk 'm!

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

Creepy

Tactical Espionage Splatterer

Matthijs1982 schreef op maandag 07 april 2008 @ 14:54:
$qbestelregel geeft deze output:
INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '127', '', '1', '-1')

Dit had ik in mijn eerste bericht al vermeld.
Je drukt nu 1 hele query af, en niet alle queries die worden uitgevoerd en daar vroeg ik nu juist om. Of je loop is niet goed waardoor er maar 1 query wordt uitgevoerd, of je geeft (nog steeds) te weinig informatie.
Door alle queries af te drukken kan je zien of alle queries ook goed zijn. Ga er niet zomaar vanuit dat als je 1 query afdrukt de rest ook wel goed zal zijn.

[ Voor 15% gewijzigd door Creepy op 07-04-2008 16:05 ]

"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!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Dit is alles wat ik heb

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
$query_bestelling= "INSERT INTO orders (Klantnummer, Factuurnr, Orderdatum, Factuurdatum, verzendkosten, factprijs, btwbedrag, commcode, betaalmethode) VALUES ('".$_SESSION["klantnummer"]."', '$factuurnummer', '".date("Y-m-d")."', '".date("Y-m-d")."', '".$_SESSION["proforma"]."', '".$_SESSION["eindsubtotaal"]."', '$btwbedrag', '".$_SESSION["commcode"]."', '".$_SESSION["betaalmethode"]."')";
//$result_bestelling = mysql_query($query_bestelling) or die (mysql_error());
//$Order_id = mysql_insert_id();

print count($_SESSION['winkelwagen']); 
foreach ($_SESSION['winkelwagen'] as $productnummer => $quantity) 
{ 
  $qbestelregel = "INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('$Order_id', '".$productnummer."', '".$_SESSION["ProdVariantenId"]."', '$quantity', '-1')";   
  //$result_qbestelregel = mysql_query($qbestelregel) or die (mysql_error()); 
  print "Het invoeren van ".$productnummer." is gelukt<br>"; 
}

$_SESSION["Order_id"] = $Order_id;

echo "$query_bestelling<br />";
echo "$qbestelregel<br />$Productnummer";

echo "<pre>"; 
print_r($_SESSION);
echo "</pre>";

echo "<pre>"; 
print count($_SESSION['winkelwagen']);
echo "</pre>";


Dat geeft dit als output:
2Het invoeren van 151 is gelukt
Het invoeren van 127 is gelukt
INSERT INTO orders (Klantnummer, Factuurnr, Orderdatum, Factuurdatum, verzendkosten, factprijs, btwbedrag, commcode, betaalmethode) VALUES ('2447', '20034', '2008-04-07', '2008-04-07', '7.5', '167.5', '31.82', '', 'proforma')
INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '127', '', '1', '-1')
Array
(
[Productnummer] => 127
[aantal] => 1
[commcode] =>
[winkelwagen] => Array
(
[151] => 1
[127] => 1
)

[eindsubtotaal] => 167.5
[klantnummer] => 2447
[proforma] => 7.5
[betaalmethode] => proforma
[btwbedrag] => 31.82
[Order_id] => 0
)
2

Acties:
  • 0 Henk 'm!

Verwijderd

voer dit eens uit?

PHP:
1
2
3
4
5
6
7
8
9
10
<?php
error_reporting(E_ALL);

var_dump($_SESSION); 
foreach ($_SESSION['winkelwagen'] as $productnummer => $quantity) 
{ 
  $qbestelregel = "INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('$Order_id', '".$productnummer."', '".$_SESSION["ProdVariantenId"]."', '$quantity', '-1')";   
  echo $Productnummer.": ".$qbestelregel."<br />";
}
?>

Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Dan krijg ik dit terug.
De variabele productnummer is leeg staat hier. Wel wordt de for each loop 2 keer uitgevoerd zie ik nu.

array(15) { ["Productnummer"]=> int(127) ["aantal"]=> &string(1) "1" ["commcode"]=> string(0) "" ["winkelwagen"]=> array(2) { [151]=> string(1) "1" [127]=> &string(1) "1" } ["eindsubtotaal"]=> float(167.5) ["klantnummer"]=> string(4) "2447" ["typeklant"]=> string(1) "0" ["paypal"]=> string(4) "12.5" ["proforma"]=> string(3) "7.5" ["machtiging"]=> string(2) "10" ["rembours"]=> string(2) "14" ["betaalmethode"]=> string(8) "proforma" ["btwbedrag"]=> float(31.82) ["Order_id"]=> int(0) }
Notice: Undefined index: ProdVariantenId in /var/www/html/afrekenen.php on line 128

Notice: Undefined variable: Productnummer in /var/www/html/afrekenen.php on line 129
: INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '151', '', '1', '-1')

Notice: Undefined index: ProdVariantenId in /var/www/html/afrekenen.php on line 128

Notice: Undefined variable: Productnummer in /var/www/html/afrekenen.php on line 129
: INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '127', '', '1', '-1')
INSERT INTO orders (Klantnummer, Factuurnr, Orderdatum, Factuurdatum, verzendkosten, factprijs, btwbedrag, commcode, betaalmethode) VALUES ('2447', '20034', '2008-04-07', '2008-04-07', '7.5', '167.5', '31.825', '', 'proforma')

Notice: Undefined variable: Productnummer in /var/www/html/afrekenen.php on line 135
INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '127', '', '1', '-1')

Acties:
  • 0 Henk 'm!

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

Creepy

Tactical Espionage Splatterer

Edit: ok, dat was niet waar. :+

[ Voor 89% gewijzigd door Creepy op 07-04-2008 17:00 ]

"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!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
  • Wees consistent met je naamgeving, ik zie afwisselend wel en geen hoofdletters, zo ook $Productnummer vs $productnummer.
  • Leer debuggen.
  • Houd ook je debug info duidelijk, je laatste post leest heel slecht.
  • Denk rustig na, en ga alles stap voor stap langs, want echt moeilijk kan het niet zijn. :P
  • Post eens eens werkende code, inc. foutafhandeling (return value mysql functies checken), incl. debug output.
  • Blijf alle queries uitvoeren, truncate table is zo gepiept.
  • Succes. ;)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array(15) { ["Productnummer"]=> int(127) ["aantal"]=> &string(1) "1" ["commcode"]=> string(0) "" ["winkelwagen"]=> array(2) { [151]=> string(1) "1" [127]=> &string(1) "1" } ["eindsubtotaal"]=> float(167.5) ["klantnummer"]=> string(4) "2447" ["typeklant"]=> string(1) "0" ["paypal"]=> string(4) "12.5" ["proforma"]=> string(3) "7.5" ["machtiging"]=> string(2) "10" ["rembours"]=> string(2) "14" ["betaalmethode"]=> string( "proforma" ["btwbedrag"]=> float(31.82) ["Order_id"]=> int(0) } 
Notice: Undefined index: ProdVariantenId in /var/www/html/afrekenen.php on line 128

Notice: Undefined variable: Productnummer in /var/www/html/afrekenen.php on line 129
: INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '151', '', '1', '-1')

Notice: Undefined index: ProdVariantenId in /var/www/html/afrekenen.php on line 128

Notice: Undefined variable: Productnummer in /var/www/html/afrekenen.php on line 129
: INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '127', '', '1', '-1')
INSERT INTO orders (Klantnummer, Factuurnr, Orderdatum, Factuurdatum, verzendkosten, factprijs, btwbedrag, commcode, betaalmethode) VALUES ('2447', '20034', '2008-04-07', '2008-04-07', '7.5', '167.5', '31.825', '', 'proforma')

Notice: Undefined variable: Productnummer in /var/www/html/afrekenen.php on line 135
INSERT INTO orderinformatie (Order_id, Productnummer, ProdVariantenId, Hoeveelheid, Geleverd) VALUES ('0', '127', '', '1', '-1')


nog een puntje, gebruik bij het posten van output altijd [ code][ /code] tags. das leest lekker.

debuggen stap 1. lekker vanaf regel 1 kijken wat het betekent.

regel 1. dat is je hele array met session vars. alleen de elementen die hierin staan kan je dus gebruiken. dit is ook hoofdletter gevoelig.

regel2. je gebruikt hier iets in die session vars wat niet bestaat. zoals je ziet komt ProdVariantenId niet voor in die dump van $_SESSION. ga dus eens goed na of die wel correct geset wordt in je code. en of je niet misschien een heel andere variabele naam gebruikt.

regel4. in de echo klopt het hoofdletter gebruik niet waardoor hij een fout geeft. wanneer een waarde niet geset is gaat hij altijd uit van NULL.

regel 5. hier zie je de query die hij uit wilde gaan voeren. nu zie je ook dat doordat ProdVariantenId niet bestaat in je $_SESSION hij enkel een lege waarde neerzet bij dat veld. als je tabel die kolom als mandatory heeft zal hij de query niet correct uitvoeren.

de rest is eigenlijk een herhaling van het eerste deel omdat die forloop hem nog een keer doorloopt.

dus ga met deze info nog eens door je code heen, zet bij debuggen altijd "error_reporting(E_ALL)" aan en kijk of het nu wel lukt.

en bij het uitvoeren van mysql_queries gebruik voor het gemak tijdens het debuggen
PHP:
1
2
3
<?
mysql_query("SELECT * FROM sometable") or die(mysql_error());
?>


als hij dan fout gaat geeft hij netjes een fout terug

Acties:
  • 0 Henk 'm!

Verwijderd

//$result_qbestelregel = mysql_query($qbestelregel) or die

Haal die 2 slashes eens weg, je bevestigt je insert niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Matthijs1982 schreef op maandag 07 april 2008 @ 14:44:
Ik heb de query even uitgezet, omdat ik anders enorm veel bestellingen in mijn database heb tijdens het testen.
;)

p.s. zie nu pas dat je die mysql_error normaal ook al uitvoerde ;)
Pagina: 1