[php]MySQLquery werkt niet in php, rechtstreeks in mysql wel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Erik
  • Registratie: November 2003
  • Laatst online: 21-07 08:41
Voor m'n werk ben ik bezig met een systeempje om klanten in te registreren.
Ik heb daarvoor de volgende code in php geschreven:

PHP:
1
2
3
4
5
6
7
8
$insertquery="INSERT INTO Employees(EmployeeID, EmployeeFirstName, EmployeeLastName, EmployeePhone, CompanyID, ActiveDate, PackageID, HasToken, HasBlackberry) VALUES";

while (!empty($_POST["EmployeeFirstName$i"]) && $error==0)  {

  $insertquery.="(NULL,  '$EmployeeFirstName', '$EmployeeLastName', $EmployeePhone, $CompanyID, '$ActiveDate', $PackageID, $HasToken, $HasBlackberry),";

$i++;
}


Bij het uitvoeren van de query, verderop in de code krijg ik de standaard mysql error
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2

Alle waarden die niet in single quotes staan zijn numeriek. Input is gecheckt

Nu komt het: Ik heb géén idee wat er fout gaat! Ik heb de output ge-echo't, en die in een terminal met mysql geplakt, en het resultaat is prima! De gegevens worden direct in de database geplaatst.
Als ik echo, krijg ik deze query:
code:
1
2
3
INSERT INTO Employees(EmployeeID, EmployeeFirstName, EmployeeLastName, EmployeePhone, CompanyID, ActiveDate, PackageID, HasToken, HasBlackberry) VALUES
('NULL', 'erik', 'lkjasfd', 12, 18, '2010-12-12', 2, 0, 1),
('NULL', 'erik', 'lkjsaflkjlkj', 12, 18, '2010-12-12', 1, 1, 1),


Het móet iets kleins zijn, maar ik ben al úúúren aan het zoeken en googlen geweest.
Wat ik heb gedaan:
- alle backquotes weggehaald om de tabelnamen (resultaat zie je in de code hierboven
- alles mét backquotes om de tabelnamen
- alle variabelen in single quotes gezet
- een andere query opgesteld, waarbij ook het eerste deel van de insertquery in de while loop zat.
- gegoogled of php misschien iets doet met de quotes
- andere mogelijke oorzaken gegoogled.

Ik ben radeloos! Wie geeft me een zet in de juiste richting?

Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Nu online
Eh, je probeert een string met de waarde NULL in het ID veld te zetten?

en eindigt je query met een , (komma)?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Haal je de laatste komma wel weg?

(en wat doen die quotes rond NULL daar eigenlijk?)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
spatie na VALUES in je php? (boeit niet)
Die laatst komma idd ja

[ Voor 45% gewijzigd door Y0ur1 op 28-07-2010 23:10 ]


Acties:
  • 0 Henk 'm!

  • Erik
  • Registratie: November 2003
  • Laatst online: 21-07 08:41
418O2 schreef op woensdag 28 juli 2010 @ 23:02:
Eh, je probeert een string met de waarde NULL in het ID veld te zetten?

en eindigt je query met een , (komma)?
die waarde 0 is een integer met auto increment.
Die komma zal ik er even uit-toveren, alhoewel dat in mysql niet uitmaakte. Dit is echter idd niet netjes, bedankt. Ik laat hiervan het resultaat weten

Janoz schreef op woensdag 28 juli 2010 @ 23:03:
Haal je de laatste komma wel weg?

(en wat doen die quotes rond NULL daar eigenlijk?)
die quotes was ook een poging om te kijken of het daar aan lag.


Oh Mijn God.

Het lag gewoon aan de komma.

Ik heb een if-statement toegevoegd die controleert of er wel of geen komma moet komen, waardoor de komma nu niet meer op het einde van de query komt.

Nu werkt het.
Wel een beetje kansloos dit. :+

Iedereen die mij gewezen heeft op de komma: zéér vriendelijk bedankt.

Ik ga maar gauw in een hoekje staan, me schamen :P

edit: verdorie, dit heeft me gewoon een dikke 4 uur gekost, en dan blijkt dit het te zijn. :P

[ Voor 47% gewijzigd door MueR op 28-07-2010 23:41 . Reden: berichten samengevoegd ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
En wat heb je dus geleerd? Gewoon simpel debuggen had je al die moeite kunnen besparen.

Doe je verder nog iets tegen SQL-injection?

offtopic:
Het is de bedoeling om je bericht te editten ipv. steeds nieuwe posts te doen als je eigen post de laatste is, die melding onder je post staat er niet voor jan l*l natuurlijk...


* Cartman! schopt MueR

[ Voor 4% gewijzigd door Cartman! op 28-07-2010 23:43 ]


Acties:
  • 0 Henk 'm!

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

MueR

Admin Tweakers Discord

is niet lief

Ga je je dan ook even schamen voor het driedubbelposten? :P Wil je volgende keer de Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif knop gebruiken alsjeblieft? ;)

:w Cartman!

[ Voor 3% gewijzigd door MueR op 28-07-2010 23:43 ]

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


Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Nu online
Als je álle velden gaat inserten hoef je ze niet te benoemen.

Als je een autoincrement Id hebt, dan kan je dat veld gewoon weglaten uit je fieldlist
Erik schreef op woensdag 28 juli 2010 @ 23:04:
[...]

die waarde 0 is een integer met auto increment.
Die komma zal ik er even uit-toveren, alhoewel dat in mysql niet uitmaakte. Dit is echter idd niet netjes, bedankt. Ik laat hiervan het resultaat weten
NULL is met apostroffen eromheen gewoon een string, losstaand is het NULL zoals jij het bedoelt.

[ Voor 58% gewijzigd door 418O2 op 28-07-2010 23:55 ]


Acties:
  • 0 Henk 'm!

  • Erik
  • Registratie: November 2003
  • Laatst online: 21-07 08:41
418O2 schreef op woensdag 28 juli 2010 @ 23:54:
Als je álle velden gaat inserten hoef je ze niet te benoemen.
dit zijn niet alle velden ;)
Als je een autoincrement Id hebt, dan kan je dat veld gewoon weglaten uit je fieldlist
Hmm. Ok!
NULL is met apostroffen eromheen gewoon een string, losstaand is het NULL zoals jij het bedoelt.
Yep. De apostroffen had ik er even neergezet om te testen, aangezien de query wel werkte in mysql, maar niet via php was mijn gedachtegang dat er wellicht iets niet goed ging bij het opstellen van de query. Dit is in mijn codevoorbeeld abusievelijk blijven staan.
Cartman! schreef op woensdag 28 juli 2010 @ 23:42:
En wat heb je dus geleerd? Gewoon simpel debuggen had je al die moeite kunnen besparen.
Hmm. Hoe kan ik sql queries debuggen? ik heb in mijn zoektocht op google ook gekeken naar een syntaxchecker voor sql statements :P
Doe je verder nog iets tegen SQL-injection?
Ja, ik gebruik mysql_real_escape_string voor elke variabele die gepost kan worden. Overigens draait het intern op ons lan, niet op het internet. (Maar met toekomstig gebruik in het achterhoofd heb ik toch maar voor alle posts mysql_real_escape_string gebruikt)

Verder zeer bedankt voor jullie hulp. Opmerkingen worden gewaardeerd!
MueR schreef op woensdag 28 juli 2010 @ 23:42:
Ga je je dan ook even schamen voor het driedubbelposten? :P
Helemaal niet gemerkt? :? Mijn excuses.

[ Voor 36% gewijzigd door Erik op 29-07-2010 00:10 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Erik schreef op donderdag 29 juli 2010 @ 00:00:
Hmm. Hoe kan ik sql queries debuggen? ik heb in mijn zoektocht op google ook gekeken naar een syntaxchecker voor sql statements :P
Debuggen: Hoe doe ik dat?

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!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
418O2 schreef op woensdag 28 juli 2010 @ 23:54:
[...]

NULL is met apostroffen eromheen gewoon een string, losstaand is het NULL zoals jij het bedoelt.
Ja? Zou hij NULL in een primary_key auto_increment-veld willen opslaan? Zo te zien weet hij niet eens het verschil tussen 0, "0" en NULL.
Hmm. Hoe kan ik sql queries debuggen? ik heb in mijn zoektocht op google ook gekeken naar een syntaxchecker voor sql statements :P
Echo'en vlak voor de mysql-query aanroep en dan zelf uitvoeren.

[ Voor 23% gewijzigd door GlowMouse op 29-07-2010 02:10 ]


Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Nu online
GlowMouse schreef op donderdag 29 juli 2010 @ 02:09:
[...]

Ja? Zou hij NULL in een primary_key auto_increment-veld willen opslaan? Zo te zien weet hij niet eens het verschil tussen 0, "0" en NULL.
Ik schrijf zelf al een tijdje geen insert query's meer (Leve NHibernate), maar als je NULL in je ID veld zet bij een insert dan genereert hij toch alsnog zelf een id?
MySQL:
1
INSERT INTO gebruiker (gebruiker_id, voornaam) VALUES (NULL, 'Max')


Waarbij gebruiker_id een auto increment is, maar dan vult hij wel zelf een id in. Het is niet netjes, maar het werkt wel.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Veruit de meeste databases zullen de NULL weigeren op een primary key, dit is een vaag stukje MySQL waardoor het per ongeluk goed gaat. Je wilt hier de default waarde aanroepen, de volgende waarde van de auto_increment. Gebruik dan DEFAULT of laat de kolommen en waarde gewoon weg, dan zal de database ook de default waarde gebruiken.

Maar een NULL opgeven en eigenlijk de DEFAULT bedoelen, dat is heel vaag. Of bestel jij ook een biertje wanneer je eigenlijk een bak koffie wilt hebben?

Acties:
  • 0 Henk 'm!

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

MueR

Admin Tweakers Discord

is niet lief

Dat is helemaal geen vaag stukje MySQL, dat is by design. Het word een beetje flauw om je bij elk topic over MySQL te zien bashen. Reageer dan niet, voer die oorlog tegen MySQL maar ergens anders.

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


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 02:46

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

GlowMouse schreef op donderdag 29 juli 2010 @ 02:09:
[...]
Echo'en vlak voor de mysql-query aanroep en dan zelf uitvoeren.
Dat heeft ie toch ook gedaan? Alleen blijkbaar geeft die komma wel een probleem als het vanuit PHP komt, maar niet bij handmatig uitvoeren van de query.

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Nu online
Orion84 schreef op donderdag 29 juli 2010 @ 10:22:
[...]

Dat heeft ie toch ook gedaan? Alleen blijkbaar geeft die komma wel een probleem als het vanuit PHP komt, maar niet bij handmatig uitvoeren van de query.
een komma aan het eind van een statement levert altijd een parse error op, welke client je ook gebruikt. Hij zal die komma wel zijn vergeten ofzo.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

418O2 schreef op woensdag 28 juli 2010 @ 23:54:
Als je álle velden gaat inserten hoef je ze niet te benoemen.
Doe toch maar wel. Het is net als met 'Select *'. Het lijkt wel even lekker snel bij het tikken voor de eerste keer, maar gaat een hel worden bij het onderhoud. Je hebt eigenlijk geen enkele garantie dat de kolommen ook daadwerkelijk in die volgorde blijven en daarnaast moet ik de eerste applicatie nog tegen komen waar nooit meer iets veranderd is aan het database schema na het eerste create table statement.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Erik
  • Registratie: November 2003
  • Laatst online: 21-07 08:41
GlowMouse schreef op donderdag 29 juli 2010 @ 02:09:
[...]

Ja? Zou hij NULL in een primary_key auto_increment-veld willen opslaan? Zo te zien weet hij niet eens het verschil tussen 0, "0" en NULL.
0 is het getal 0, "0" is een string, NULL is geen waarde.
Echo'en vlak voor de mysql-query aanroep en dan zelf uitvoeren.
Heb ik gedaan! :)
Orion84 schreef op donderdag 29 juli 2010 @ 10:22:
[...]

Dat heeft ie toch ook gedaan? Alleen blijkbaar geeft die komma wel een probleem als het vanuit PHP komt, maar niet bij handmatig uitvoeren van de query.
Juist. Overigens krijg ik wel een parse error als ik het nu probeer te reproduceren :F

[ Voor 30% gewijzigd door Erik op 29-07-2010 10:52 ]

Pagina: 1