[PHP/MySQL] Query werkt in phpMyAdmin maar niet in PHP code*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dysan
  • Registratie: December 2003
  • Niet online
Ik heb al wat af gegoogled maar niet kunnen vinden,
Ik heb een SQL statement, als ik deze in MyPHPAdmin uitvoer krijg ik netjes te zien dat er geen rijen geselecteerd zijn.
In PHP krijg ik echter de volgende melding te zien:

SELECT * FROM machines WHERE MACHINE_NR = 24 (tijdelijke echo van de SQL String)

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 1
PHP:
1
2
3
4
5
6
mysql_select_db($database_localhost, $localhost);
$query_Machines = "SELECT * FROM machines WHERE MACHINE_NR = ".$_GET['mn'];
echo $query_Machines;
$Machines = mysql_query($query_Machines, $localhost) or die(mysql_error());
$row_Machines = mysql_fetch_assoc($Machines);
$totalRows_Machines = mysql_num_rows($Machines);

Machine nummer is een nummeriek veld.
Zou toch veel beter zijn om hier een normale melding van terug te krijgen?

Im Not A Vacuum Cleaner, Thats DysOn


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
Is dit alle code die je hebt?
Ik zie namelijk nergens een connectie met je database :)

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!

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

NMe

Quia Ego Sic Dico.

Titelfix. Alleen "[PHP/MySQL]" zegt natuurlijk niets over je probleem. ;)

MACHINE_NR (waarom die hoofdletters?) is toch niet toevallig een string-veld he?

offtopic:
Zoek eens op wat SQL injectie is en waarom je daar kwetsbaar voor bent. ;)

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

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

@-NMe-: TS zegt iig dat 't een numeriek veld is ;)

@TS: geen oplossing, maar ik zou zowieso ook achter regel 1 een or die(mysql_Error()) zetten..

Acties:
  • 0 Henk 'm!

  • Dysan
  • Registratie: December 2003
  • Niet online
ik ben gewend om het met Hoofdletter te typen
@The rookie, bij regel 4 staat toch al or die(mysql_error()); ?

voor de duidelijkheid, blijkbaar als je geen rijen terugkrijgt van de SQL instructie krijg ik via PHP foutmeldingen.
bij de volgende url: show_machine.php?mn=24 (24 is een niet bestaande waarde in de kolom MACHINE_NR ) krijg ik dus de fout
bij deze url show_machine.php?mn=26(bestaat wel in de kolom MACHINE_NR ) krijg geen foutmeldingen.

Im Not A Vacuum Cleaner, Thats DysOn


Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Klopt, maar ook het selecteren van de db kan fout gaan.
Op het moment dat je geen rijen terugkrijgt zou je geen foutmelding over je SQL syntax moeten krijgen.
Wat je imho (netter) kan doen is
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$Machines = mysql_query($query_Machines, $localhost) or die(mysql_error());
$totalRows_Machines = mysql_num_rows($Machines); 
if($totalRows_Machines == 1){
  // haal rij op
  $row_Machines = mysql_fetch_assoc($Machines);
} elseif ($totalRows_Machines == 0) {
  // geen machine gevonden
  print("Er zijn geen corresponderende machines gevonden");
} else {
  // meer dan 1 resultaat
  print("Er zijn meerdere resultaten gevonden");
  while ($row_Machines=mysql_Fetch_assoc($Machines)){
   // toon de resultaten
  }
}

edit:
Ik kan me overigens voorstellen dat je, als je met een ID werkt, maar maxiimaal één rij terugverwacht en dus een foutmelding genereert als je er meer dan 1 terugkrijgt ?

[ Voor 13% gewijzigd door TheRookie op 08-06-2006 09:49 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Dysan schreef op donderdag 08 juni 2006 @ 09:35:
voor de duidelijkheid, blijkbaar als je geen rijen terugkrijgt van de SQL instructie krijg ik via PHP foutmeldingen.
Onzin, dat kan niet. :) Je moet gewoon een lege resultset terugkrijgen. De fout zit in elk geval niet hier, tenminste, als het echt om een numeriek veld gaat, en je een goeie waarde doorgeeft als GET-parameter. Gebruik je nergens een andere query die fout gaat?

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

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Dysan schreef op donderdag 08 juni 2006 @ 09:35:
voor de duidelijkheid, blijkbaar als je geen rijen terugkrijgt van de SQL instructie krijg ik via PHP foutmeldingen.
bij de volgende url: show_machine.php?mn=24 (24 is een niet bestaande waarde in de kolom MACHINE_NR ) krijg ik dus de fout
bij deze url show_machine.php?mn=26(bestaat wel in de kolom MACHINE_NR ) krijg geen foutmeldingen.
Als het goed is krijg je dan eerder iets van: "$Machines is not a valid mysql result resource" maar niet foutmeldingen in je query. Dat zou wel erg irritant zijn namelijk.

Probeer anders es de gezochte waarde (dus 24) tussen quotes te plaatsen, ondanks het een numeriek veld is? Dus:
PHP:
1
$query_Machines = "SELECT * FROM machines WHERE MACHINE_NR = '" . $_GET['mn'] . "'";

Misschien helpt dat :)

[ Voor 5% gewijzigd door Cloud op 08-06-2006 09:43 ]

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
TheRookie schreef op donderdag 08 juni 2006 @ 09:42:
Klopt, maar ook het selecteren van de db kan fout gaan.
Op het moment dat je geen rijen terugkrijgt zou je geen foutmelding over je SQL syntax moeten krijgen.
Precies, daarom vroeg ik naar de rest van je code :)

Als je geen rijen krijgt dan zou je een 'invalid mysql source'-error of zoiets krijgen.
Deze error gaat over de sql, dus gaat al fout bij de query, niet bij het resultaat ervan.
Het zal dus toch ergens fout gaan tijdens het benaderen van de database. :)

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!

Verwijderd

Of probeer eens alleen "SELECT * FROM machines", daar kan niks fout aan zijn :)

Acties:
  • 0 Henk 'm!

Verwijderd

De waarde die
code:
1
 .$_GET['mn'];
terug geeft moet tussen ' komen te staan. Daarna werkt het bij mij perfect

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
Verwijderd schreef op donderdag 08 juni 2006 @ 09:51:
De waarde die
code:
1
 .$_GET['mn'];
terug geeft moet tussen ' komen te staan. Daarna werkt het bij mij perfect
Dat geldt alleen als het een string veld is.
Als het numeriek is gaat hij door die quotes juist onderuit. :)

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!

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

NMe

Quia Ego Sic Dico.

Gonadan schreef op donderdag 08 juni 2006 @ 09:52:
[...]

Dat geldt alleen als het een string veld is.
Als het numeriek is gaat hij door die quotes juist onderuit. :)
Zelfs dat niet, MySQL cast dat impliciet. Erg ranzig, maar goed, het is dus niet zo strict als MSSQL.
@hieronder: de standaard install van MySQL 3.23 pakte het iig prima, en de install van MySQL 4.0 op mijn host ook. Misschien is er een configuratiesetting voor? :)

[ Voor 21% gewijzigd door NMe op 08-06-2006 09:59 ]

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

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
-NMe- schreef op donderdag 08 juni 2006 @ 09:54:
[...]

Zelfs dat niet, MySQL cast dat impliciet. Erg ranzig, maar goed, het is dus niet zo strict als MSSQL.
offtopic:
Weet je dat zeker? Bij mij gaat hij namelijk rustig onderuit als ik string en numeriek verwar.
Misschien staat dat in mijn Xampp pakket standaard aan hoor, dat zou kunnen. :)

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!

  • Dysan
  • Registratie: December 2003
  • Niet online
ik voer na deze SQL instructie nog 2 instructies uit met waarden die hij uit de genoemde 1e instructie haalt, ik denk dat het daar fout zou gaan.
ik houd jullie op de hoogte

Im Not A Vacuum Cleaner, Thats DysOn


Acties:
  • 0 Henk 'm!

  • SvEn
  • Registratie: Juli 2001
  • Laatst online: 18-09 19:45

SvEn

a.k.a sv3nrg

anders zet je er even

or die(mysql_error());

achter , dan weet je waar de fout ligt.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

SvEn schreef op donderdag 08 juni 2006 @ 10:01:
anders zet je er even

or die(mysql_error());

achter , dan weet je waar de fout ligt.
Anders kijk je even naar de code in de startpost. ;)

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

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Gonadan schreef op donderdag 08 juni 2006 @ 09:56:
offtopic:
Weet je dat zeker? Bij mij gaat hij namelijk rustig onderuit als ik string en numeriek verwar.
Misschien staat dat in mijn Xampp pakket standaard aan hoor, dat zou kunnen. :)
Jep dat is waar :) Standaard cast MySQL alles naar het juiste type toe. Jammer dat ie dat doet, maarja wel makkelijk voor "the masses"..
Dysan schreef op donderdag 08 juni 2006 @ 09:59:
ik voer na deze SQL instructie nog 2 instructies uit met waarden die hij uit de genoemde 1e instructie haalt, ik denk dat het daar fout zou gaan.
ik houd jullie op de hoogte
Tja, das dan duidelijk he :) De gegeven code was dus niet alle code, dit leek mij ook al sterk.
SvEn schreef op donderdag 08 juni 2006 @ 10:01:
anders zet je er even

or die(mysql_error);

achter , dan weet je waar de fout ligt.
Als je goed leest, zie je dat dat al in zijn code staat. Of bedoel je de rest van zijn queries?

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
Dysan schreef op donderdag 08 juni 2006 @ 09:59:
ik voer na deze SQL instructie nog 2 instructies uit met waarden die hij uit de genoemde 1e instructie haalt, ik denk dat het daar fout zou gaan.
ik houd jullie op de hoogte
Wil je eigenlijk wel dat het opgelost wordt?
De meeste tips wijs je af en je zegt zelf te weten waar de fout ligt. :?

Zet nu gewoon eens achter ELK mysql commando een 'or die(mysql_error())'.
Dan krijg je meer meldingen :)

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!

Verwijderd

-NMe- schreef op donderdag 08 juni 2006 @ 09:54:
[...]

Zelfs dat niet, MySQL cast dat impliciet. Erg ranzig, maar goed, het is dus niet zo strict als MSSQL.
@hieronder: de standaard install van MySQL 3.23 pakte het iig prima, en de install van MySQL 4.0 op mijn host ook. Misschien is er een configuratiesetting voor? :)
ja, dat klopt. Maar als het nummerieke veld leeg is en er staan geen quotes dan gaat het ook mis

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 08 juni 2006 @ 10:11:
ja, dat klopt. Maar als het nummerieke veld leeg is en er staan geen quotes dan gaat het ook mis
Als er wel quotes staan ook. :? "" betekent niks in het integerdomein. :?

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

  • cavey
  • Registratie: Augustus 2000
  • Laatst online: 29-05 01:29
owja, niet om het even wat hoor,

maar.... 'random string' . $_GET['mn']; is a disaster WAITING too happen.

DOE er dan op z'n minst een (int) typecast voor, want je hebt een ENORM SQL-injection gat erin zitten. Of anderssoortige input checking. Dit is gewoon _te ranzig_ voor woorden.

oh, _NME_ geeft dat ook al aan in een mooi klein fontje in z'n eerste reactie.

En wat betreft de query, I'm baffled... ziet er simpel uit, zou moeten werken, maar misschien gaat het fout door de $_GET['mn'] zonder (int) cast...

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

komakeef schreef op donderdag 08 juni 2006 @ 10:38:
En wat betreft de query, I'm baffled... ziet er simpel uit, zou moeten werken, maar misschien gaat het fout door de $_GET['mn'] zonder (int) cast...
Dysan schreef op donderdag 08 juni 2006 @ 09:59:
ik voer na deze SQL instructie nog 2 instructies uit met waarden die hij uit de genoemde 1e instructie haalt, ik denk dat het daar fout zou gaan.
ik houd jullie op de hoogte
Een geval van lees het topique? ;) We waren al ietsje verder :)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • Dysan
  • Registratie: December 2003
  • Niet online
Wil je eigenlijk wel dat het opgelost wordt?
De meeste tips wijs je af en je zegt zelf te weten waar de fout ligt. :?
Ik zei dat ik 2 die query er nog 2 draaide en dat ik daar in ga zoeken,
hij kan toch moelijk een nieuwe select doen met waarde uit een 0 row array toch?
Zet nu gewoon eens achter ELK mysql commando een 'or die(mysql_error())'.
Dan krijg je meer meldingen :)
Achter Elk mySQL commando staat al 'or die(mysql_error())'.


Helaas zit ik niet 8uur per dag te php'en maar moet het reguliere werk er ook nog tussendoor, ik zal hopenlijk vanmiddag tijd hebben om te kijken waar het probleem ligt.

[ Voor 4% gewijzigd door Dysan op 08-06-2006 13:02 ]

Im Not A Vacuum Cleaner, Thats DysOn


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
Dysan schreef op donderdag 08 juni 2006 @ 13:02:
Achter Elk mySQL commando staat al 'or die(mysql_error())'.
En achter 'mysql_select_db' dan?
En je 'mysql_connect'? Die staat er helemaal niet bij :?
Helaas zit ik niet 8uur per dag te php'en maar moet het reguliere werk er ook nog tussendoor, ik zal hopenlijk vanmiddag tijd hebben om te kijken waar het probleem ligt.
Dat begrijp ik, same here ;)

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!

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

NMe

Quia Ego Sic Dico.

Dysan schreef op donderdag 08 juni 2006 @ 13:02:
Achter Elk mySQL commando staat al 'or die(mysql_error())'.
Daar heb je meer aan als je ook __LINE__ en __FILE__ afdrukt. Dan weet je namelijk ook welke query misgaat en zit je niet, zoals hier waarschijnlijk het geval is, de verkeerde query te verdenken. ;)

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

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

In PHP can het uitmaken dat je quotes gebruikt bij veldnamen.

SQL:
1
SELECT * FROM `machines` WHERE `MACHINE_NR` = ...
Heb daar met MySQL 4 wel eens ruzie gehad.

offtopic:
Drie vragen over naamgeving: MACHINE_NR
1. waarom in hoofdletters, meestal wordt dit gezien als constante
2. Als de tabel al machines heet, waarom zou je de naam nog een keer in nummer laten terug komen, alleen NR lijkt mij ook goed? Voor joins etc kan het handig zijn om snel onderscheid te maken ... je zou dan m_Nr (of beter m_ID, zie volgende vraag) kunnen gebruiken.
3. Ik ga er vanuit dat NR de identificatie is van de machine ... het is in SQL land common om (unieke) identificaties als ID aan te merken.

[ Voor 3% gewijzigd door hamsteg op 08-06-2006 21:43 . Reden: verkeerde quotes, moest back-quote zijn ]

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • Dysan
  • Registratie: December 2003
  • Niet online
Yes!, allemaal bedankt voor jullie Input, het probleem is opgelost.
MBT benaming van velden / gebruik van hoofdlettes ben ik al iets te ver om het allemaal weer te veranderen.
het was dus inderdaag SQL instructie2 en 3 die de foutmelding gaven.
Heb nu de volgende code gebruikt:

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
//machine gegevens binnenhalen
 mysql_select_db($database_localhost, $localhost);
 $query_Machines = "SELECT * FROM machines WHERE MACHINE_NR = ".$_GET['mn'];
 $Machines = mysql_query($query_Machines, $localhost) or die(mysql_error());
 $row_Machines = mysql_fetch_assoc($Machines);
 $totalRows_Machines = mysql_num_rows($Machines);

//indien machine bekend 1 rij retour 
 if($totalRows_Machines >0 ){
    //model gegevens binnenhalen
  $artnr = $row_Machines['ARTIKEL_NR'];
  mysql_select_db($database_localhost, $localhost);
    $query_model = sprintf("SELECT * FROM artikelen WHERE ARTIKEL_NR = ". $artnr);
    $model = mysql_query($query_model, $localhost) or die(mysql_error());
    $row_model = mysql_fetch_assoc($model);
    $totalRows_model = mysql_num_rows($model);
    
    // klant gegevens 
    $relnr = $row_Machines['RELATIE_NR'];
    mysql_select_db($database_localhost, $localhost);
    $query_relaties = sprintf("SELECT * FROM relaties WHERE RELATIE_NR= ". $relnr);
    $relaties = mysql_query($query_relaties, $localhost) or die(mysql_error());
    $row_relaties= mysql_fetch_assoc($relaties);
    $totalRows_relaties= mysql_num_rows($relaties); 
    } elseif ($totalRows_Machines == 0) {
        // geen machine gevonden
        echo("Er zijn geen machines gevonden");
    } else {
}


Misschien een beetje vuil enz. en vermoedelijk sneller met Joins :? maar zover ben ik nog niet.
dit is een ruwe versie, daarna een betere en dan de html opmaak...

Im Not A Vacuum Cleaner, Thats DysOn


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Dat ziet er inderdaad smerig uit en ik zou inderdaad eens goed naar joins kijken. :)
hamsteggot schreef op donderdag 08 juni 2006 @ 13:17:
In PHP can het uitmaken dat je quotes gebruikt bij veldnamen.

SQL:
1
SELECT * FROM 'machines' WHERE 'MACHINE_NR' =
Heb daar met MySQL 4 wel eens ruzie gehad.
Ik kan me voorstellen dat je met zo'n query inderdaad ruzie krijgt met MySQL, want zo'n ranzige query pakt zelfs MySQL niet. :+ Dit werkt beter:
SQL:
1
SELECT * FROM `machines` WHERE `MACHINE_NR` = 24

:P
offtopic:
2. Als de tabel al machines heet, waarom zou je de naam nog een keer in nummer laten terug komen, alleen NR lijkt mij ook goed? Voor joins etc kan het handig zijn om snel onderscheid te maken ... je zou dan m_Nr (of beter m_ID, zie volgende vraag) kunnen gebruiken.
Ook weinig zinvol IMO, bij een join kun je altijd nog een alias opgeven. :)

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

Pagina: 1