PHP vs MySQL error SQL syntax??

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Matthijs

matthijs

29/08/2007 11:56:00
Quote Anchor link
Beste php helpers,

het volgende doet zich voor:

ik heb een formuliertje met 1 dropdown menu die gegevens (INT) ophaald uit mysql database. Verder heb ik nog een submit button om deze waarde te submitten naar een verwerkingsscript. Dit gaat allemaal goed.

In het verwerkingscript staat het volgende:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
36
37
38
39
40
41
42
43
44
45
<?php

if(isset($_POST['afhverzenden'])){
//Het formulier is ingevuld en verzonden

//HTML- en PHP-tags verwijderen

$select_stID=strip_tags($_POST['select_stID']);

//------------------------------------------------invoer controleren

if($select_stID == "0"){
//Niks geselecteerd
$error_msg="<span class=\"normaal_14\">Niks geselecteerd</span><br>";
}


//------------------------------------------------Einde controle
  
if($error_msg){

//Inhoud klopt niet - foutmelding weergeven en velden niet verwerken
$message ="<span class=\"kopvet_18\">Kan de gegevens niet verwerken<br><br></span>";

$message.=$error_msg;
$message.="<br><span class=\"normaal_14\">Klik op <a href=javascript:history.back(1)>Vorige</a> om de gegevens in te vullen<br><br></span>";
 
  }
else{

//Verbinding met database opzetten
$db=mysql_connect("localhost","user","pass") or die ("Verbinding Mislukt" . mysql_error());

mysql_select_db("database",$db);

//Dit is even een test of $select_stID nog steeds de waarde bevat die in het formulier is opgegeven en dit klopt
echo $select_stID;

//Nu volgt het probleem
//Gegevens ophalen uit de database

$SQL = "SELECT * FROM storingen WHERE storingsid='" . $select_stID . "'";
$result = mysql_query($SQL);

if(!mysql_query($result,$db))
  {

  die('Verbinding Mislukt: ' . mysql_error());
  }

?>


Hij geeft de volgende foutmelding:
18Verbinding Mislukt: 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 'Resource id #3' at line 1

18 is het getal wat ik geselecteerd heb in het formulier.


De bedoeling is om met $select_stID een query te trekken en de rest van de gegevens die daar aan gekoppeld zijn te tonen.

Waarom geeft hij nou deze vage foutmelding?

Helluuuuuup.

Gr,

Matthijs
Gewijzigd op 01/01/1970 01:00:00 door Matthijs
 
PHP hulp

PHP hulp

15/05/2024 21:43:22
 
Robert Deiman

Robert Deiman

29/08/2007 12:08:00
Quote Anchor link
Waarom doe jij 2 keer mysql_query en dan de 2e keer over de resultset?

Doe het zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$result
= mysql_query($SQL);
if(mysql_num_rows($result) < 1){//geen resultaten gevonden of foutmelding
   trigger_error('Verbinding mislukt: '.mysql_error());
   }

?>
 
Frank -

Frank -

29/08/2007 12:21:00
Quote Anchor link
Goede zaak dat je foutafhandeling toepast, nog even aanpassen en het werkt ook, maar zorg wel voor een correcte foutmelding. Wanneer de query mislukt, heeft dat (in 99 van de 100 gevallen) niks met 'de verbinding' te maken. Een verbinding maak je met mysql_connect(), wanneer dat mislukt, is een opmerking over de verbinding op zijn plek, maar een mislukte query is toch echt wat anders. Zet jezelf niet op het verkeerd been en zorg voor correcte foutmeldingen. Het wordt anders zoeken naar een speld in een hooiberg.
 
Matthijs

matthijs

29/08/2007 12:25:00
Quote Anchor link
Robert_Deiman schreef op 29.08.2007 12:08:
Waarom doe jij 2 keer mysql_query en dan de 2e keer over de resultset?
?>


Die snap ik niet? Ik trek toch maar 1 query?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$SQL
= "SELECT * FROM storingen WHERE storingsid='" . $select_stID . "'";
$result = mysql_query($SQL);
?>

De inhoud van $SQL = "SELECT * FROM storingen_mv90 WHERE storingsid='" . $select_stID . "'";

Bij $result geef ik toch op dat hij de query moet trekken? (mysql_query($SQL);

Gr,

Matthijs

PS Als ik jouw code gebruik dan krijg ik geen foutmelding, maar geen resultaten. Terwijl als ik deze query zo in phpmyadmin trek ik wel resultaten krijg...
Gewijzigd op 01/01/1970 01:00:00 door matthijs
 
Frank -

Frank -

29/08/2007 12:28:00
Quote Anchor link
Jouw resultaten staan in $result. Met mysql_num_rows() kun je opvragen hoeveel resultaten er zijn en met mysql_fetch_assoc() kun je de resultaten gaan fetchen. Doe jij dit wel in de rest van jouw code?

Jij kreeg een foutmelding omdat jouw foutafhandeling niet goed was. Jij voerde in de foutafhandeling nogmaals de query uit, je keek niet of $result TRUE of FALSE was. Vandaar dat het fout ging.
 
Matthijs

matthijs

29/08/2007 12:30:00
Quote Anchor link
Hoi Frank,

Bedankt voor je goede uitleg. Ik had Robert z'n reactie al beantwoord en vervolgens pas de jouwe gelezen. Ik denk dat wat je zegt dat Robert dit ook bedoelt.

Voor mij is de foutafhandeling duidelijk, echter snap ik nog niet waarom ik geen result krijg?
 
Matthijs

matthijs

29/08/2007 12:34:00
Quote Anchor link
pgFrank schreef op 29.08.2007 12:28:
Jouw resultaten staan in $result. Met mysql_num_rows() kun je opvragen hoeveel resultaten er zijn en met mysql_fetch_assoc() kun je de resultaten gaan fetchen. Doe jij dit wel in de rest van jouw code?

Jij kreeg een foutmelding omdat jouw foutafhandeling niet goed was. Jij voerde in de foutafhandeling nogmaals de query uit, je keek niet of $result TRUE of FALSE was. Vandaar dat het fout ging.


Aha! Kijk eens aan! Frank, als ik jouw toch niet had :-)

Heb ik nog een vraagje, kan ik ipv mysql_fetch_assoc() ook mysql_fetch_array() gebruiken?

Robert, Frank bedankt!!!
 
Frank -

Frank -

29/08/2007 13:10:00
Quote Anchor link
Copy/paste uit de handleiding:
mysql_fetch_array — Fetch a result row as an associative array, a numeric array, or both
mysql_fetch_assoc — Fetch a result row as an associative array

Kortom, mysql_fetch_array() maakt 2 array's aan en mysql_fetch_assoc() slechts 1 array. 1 array kost minder geheugen en is sneller aangemaakt dan 2.

Komt nog bij dat je eigenlijk niks hebt aan een numerieke array, je hebt geen flauw idee wat er in $row[0] komt te staan. Dat is helemaal afhankelijk van de query die je uitvoert:
SELECT naam, achternaam FROM tabelnaam

SELECT achternaam, naam FROM tabelnaam

2 queries die dezelfde gegevens opvragen, maar na het fetchen in $row staat er op $row[0] echt een ander gegeven! $row[1] bevat eveneens een ander gegeven. De ene keer heb je op 0 de naam en op 1 de achternaam, de andere keer is dat net omgedraaid. Vandaar dat $row['naam'] en $row['achternaam'] vele malen handiger zijn. In welke volgorde de gegevens ook worden opgevraagd, jij komt nooit in de knoei met het fetchen.

Vandaar dat het is aan te raden om de assoc-variant te gebruiken.
 
Matthijs

matthijs

29/08/2007 13:33:00
Quote Anchor link
Wow Frank! Jij bent echt goed! (nee geen geslijm) Je antwoorden zijn echt super verhelderend en concreet. Dat mag ook best wel eens keer gezegd worden toch? Petje af hoor!

Dus in principe kan je mysql_feth_array gewoon schrappen en altijd mysql_fetch_assoc() gebruiken?

Momenteel heb ik het script op deze manier:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
//Verbinding met database opzetten
$db=mysql_connect("localhost","user","pass") or die ("Verbinding Mislukt");
mysql_select_db("database",$db);
if (!$db)
  {

  die('Verbinding Mislukt: ' . mysql_error());
  }



//Gegevens ophalen uit de database
$SQL = "SELECT * FROM storingen WHERE storingsid='" . $select_stID . "'";
$result1 = mysql_query($SQL);

if(!mysql_query($SQL)) //ipv $result1
  {
  die('Query Mislukt: ' . mysql_error());
  }


$result=mysql_fetch_assoc($result1);
?>


Nu ik het zo bekijk kan ik waarschijnlijk beter:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if(mysql_num_rows($result1) < 1){
echo "geen resultaten gevonden";
}

?>

gebruiken. Toch?

Gr,

Matthijs
 
Frank -

Frank -

29/08/2007 13:37:00
Quote Anchor link
$result=mysql_fetch_assoc($result1);

mag je vervangen door
$row=mysql_fetch_assoc($result1);

Het is tenslotte een rij uit een resultset, $row is dus een betere naam.

Maar voordat je gaat fetchen, dus eerst kijken of er wel wat valt te fetchen met mysql_num_rows().
 
Robert Deiman

Robert Deiman

29/08/2007 13:40:00
Quote Anchor link
Dat is een mogelijkheid, je kan ook je eigen error_handler gebruiken, die bijvoorbeeld fouten naar een database schrijft, zonder dat een bezoeker op je site ze ziet, maar dat je zelf wel weet wat er gebeurt.

Om meerdere resultaten weer te geven moet je overigens wel zo'n constructie gebruiken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$result1
=mysql_query($sql);
if(mysql_num_rows($result1) <1){
   echo 'geen resultaten gevonden';
   //hier bijv mysql_error(); naar je database schrijven
   }
else{
   //met onderstaande constructie kan je alle gevonden resultaten weergeven.
   while($row = mysql_fetch_assoc($result1)){
       echo $row['id'];
       }
   }

?>
 
Matthijs

matthijs

29/08/2007 15:21:00
Quote Anchor link
Frank, Robert bedankt weer voor de info. Ben weer wat wijzer!

Robert, je schrijft: "je kan ook je eigen error_handler gebruiken, die bijvoorbeeld fouten naar een database schrijft"

Dat lijk me wel wat.

Gebruik je hiermee dan $SQL_insert="INSERT INTO....
of doe je dit op een andere manier?

Gr,

Matthijs
 
Robert Deiman

Robert Deiman

29/08/2007 15:54:00
Quote Anchor link
Kan je doen matthijs, dan moet je wel even controleren of er niet precies diezelfde error eerder op bijvoorbeeld een dag (of in die week) is geplaatst in die tabel, dan hou je hem wel netjes en krijg je niet steeds dezelfde foutmeldingen.

Je kan het ook naar een textbestand schrijven, maar ik ben meer fan van de database, omdat je daar meer controle over hebt.
 
Matthijs

matthijs

29/08/2007 16:20:00
Quote Anchor link
Bedankt Robert, zodra ik de rest van m'n script af heb ga ik dit proberen.

Gr,

Matthijs
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.