Prepared Statements - Fehlermeldung: You have an error in your SQL syntax..

Blabliblubs

Mitglied
Hallo,

wahrscheinlich ein sehr gängiger Fehler. Nur finde ich den Syntaxfehler nicht. Der Code funktioniert
PHP:
<?php   
	 // *****************************************************************************************************************************************
	 // **** Prepared Statements ************************************************************************************************************
	 // *****************************************************************************************************************************************
   
	 if (isset($_POST['StudieID'])) //&& (int)$_POST['GebTag'] > 0 && (int)$_POST['GebMonat'] > 0 && 
         //(int)$_POST['GebJahr'] > 0 && (int)$_POST['Age'] && isset($_POST['Geschlecht']) && (int)$_POST['dauer'] > 0 ) 
		 {
  try {
    $Datenbank = new MySQLi('localhost', 'root', '', 'base');
    echo 'Verbindung offen.<br />';
    $sql = " INSERT INTO diagnoseprotokoll(StudieID, GebTag,
	GebMonat, GebJahr, Age,
	Geschlecht, Diagnosenanzahl)
	VALUES(
	
	?,?,?,
	
	?,?,?,
	
	?)";
	$Kommando = $Datenbank->prepare($sql);
	echo var_dump($Kommando);
			  echo var_dump($Datenbank->error);
    $Kommando->bind_param(
	'siiiisi', 
	$_POST['StudieID'], $GebTag, $GebMonat, $GebJahr, $Age, $_POST['Geschlecht'], $Diagnosenanzahl );
    $GebTag = (int)$_POST['GebTag']; 	$GebMonat = (int)$_POST['GebMonat']; 	$GebJahr = (int)$_POST['GebJahr'];
	$Age = (int)$_POST['Age'];
	$Diagnosenanzahl = (int)$_POST['Diagnosenanzahl'];
    $Kommando->execute();
    echo 'SQL geschickt. <br />';
    echo $Kommando->affected_rows . ' Zeilen betroffen. <br />';
    $Datenbank->close();
    echo 'Verbindung zu.<br />';
  } catch (Exception $e) {
    echo 'Fehler: ' . htmlspecialchars($e->getMessage());
  }
}
?>
	 

<p><a href="Index.php">Zurueck zur Startseite</a></p>

Mit der Ausgabe
PHP:
Verbindung offen.
object(mysqli_stmt)#2 (9) { ["affected_rows"]=> int(0) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(7) ["field_count"]=> int(0) ["errno"]=> int(0) ["error"]=> string(0) "" ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) } string(0) "" SQL geschickt.
1 Zeilen betroffen.
Verbindung zu.

Nun geht es darum, dass meine Einträge noch viel größer werden. Am Ende brauch ich um die 250 Platzhalter für ein Formular. Ich hatte alles auch soweit fertig dann sind mir die Fehlermeldung um die Ohren geflogen. Also taste ich mich nun langsam ran. Aber schon nach den neuen 'ersten 40' kommt die Fehlermeldung:

PHP:
Verbindung offen.
bool(false) string(226) "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 ') VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?' at line 7"
Fatal error: Call to a member function bind_param() on a non-object in H:\xampp\htdocs\PHP Version\Eingabe_Aktion.php on line 23

Der Code:
PHP:
<?php   
	 // *****************************************************************************************************************************************
	 // **** Prepared Statements ***************************************************************************************************************
	 // *****************************************************************************************************************************************
   
	 if (isset($_POST['StudieID'])) //&& (int)$_POST['GebTag'] > 0 && (int)$_POST['GebMonat'] > 0 && 
         //(int)$_POST['GebJahr'] > 0 && (int)$_POST['Age'] && isset($_POST['Geschlecht']) && (int)$_POST['dauer'] > 0 ) 
		 {
  try {
    $Datenbank = new MySQLi('localhost', 'root', '', 'base');
    echo 'Verbindung offen.<br />';
    $sql = " INSERT INTO diagnoseprotokoll(
	StudieID, GebTag, GebMonat, GebJahr, Age, Geschlecht, Diagnosenanzahl,
	Diagnose01, Diagnose02, Diagnose03, Diagnose04, Diagnose05, Diagnose06, Diagnose07, Diagnose08, Diagnose09, Diagnose10, 
    Diagnose11, Diagnose12, Diagnose13, Diagnose14, Diagnose15, Diagnose16, Diagnose17, Diagnose18, Diagnose19, Diagnose20,
	Diagnose21, Diagnose22, Diagnose23, Diagnose24, Diagnose25, Diagnose26, Diagnose27, Diagnose28, Diagnose29, Diagnose30, 
    Diagnose31, Diagnose32, Diagnose33, Diagnose34, Diagnose35, Diagnose36, Diagnose37, Diagnose38, Diagnose39, Diagnose40,
	)
	VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
	$Kommando = $Datenbank->prepare($sql);
	echo var_dump($Kommando);
			  echo var_dump($Datenbank->error);
    $Kommando->bind_param(
	'siiiisissssssssssssssssssssssssssssssssssssssss', 
	$_POST['StudieID'], $GebTag, $GebMonat, $GebJahr, $Age, $_POST['Geschlecht'], $Diagnosenanzahl,
    $_POST['Diagnose01'], $_POST['Diagnose02'], $_POST['Diagnose03'], $_POST['Diagnose04'], $_POST['Diagnose05'], $_POST['Diagnose06'], $_POST['Diagnose07'], $_POST['Diagnose08'], $_POST['Diagnose09'], $_POST['Diagnose10'],
    $_POST['Diagnose11'], $_POST['Diagnose12'], $_POST['Diagnose13'], $_POST['Diagnose14'], $_POST['Diagnose15'], $_POST['Diagnose16'], $_POST['Diagnose17'], $_POST['Diagnose18'], $_POST['Diagnose19'], $_POST['Diagnose20'],		  
    $_POST['Diagnose21'], $_POST['Diagnose22'], $_POST['Diagnose23'], $_POST['Diagnose24'], $_POST['Diagnose25'], $_POST['Diagnose26'], $_POST['Diagnose27'], $_POST['Diagnose28'], $_POST['Diagnose29'], $_POST['Diagnose30'],
    $_POST['Diagnose31'], $_POST['Diagnose32'], $_POST['Diagnose33'], $_POST['Diagnose34'], $_POST['Diagnose35'], $_POST['Diagnose36'], $_POST['Diagnose37'], $_POST['Diagnose38'], $_POST['Diagnose39'], $_POST['Diagnose40']);
	
    $GebTag = (int)$_POST['GebTag']; 	$GebMonat = (int)$_POST['GebMonat']; 	$GebJahr = (int)$_POST['GebJahr'];
	$Age = (int)$_POST['Age'];
	$Diagnosenanzahl = (int)$_POST['Diagnosenanzahl'];
	echo var_dump($Kommando);
			  echo var_dump($Datenbank->error);
    $Kommando->execute();
    echo 'SQL geschickt. <br />';
    echo $Kommando->affected_rows . ' Zeilen betroffen. <br />';
    $Datenbank->close();
    echo 'Verbindung zu.<br />';
  } catch (Exception $e) {
    echo 'Fehler: ' . htmlspecialchars($e->getMessage());
  }
}
?>
	 

<p><a href="Index.php">Zurueck zur Startseite</a></p>

Sieht jmd den Fehler?

Gruß
 
Also der SQL Fehler liegt wohl daran das du nach "Diagnose40" noch ein Komma stehen hast.

PHP:
INSERT INTO .....Diagnose38, Diagnose39, Diagnose40,)

Das letzte Komma löst den Fehler wie gesagt den SQL Fehler aus, ob die Behebung dieses Fehlers auch gleich den Fehler der Funktion löst wird man dann sehen.

Gruß Thomas
 
Hi,

genau daran hats gelegen. Ich konnte das mitlerweile auf meine knapp 300 Felder übertragen und alles klappt wie geschmiert. Für andere Leute, die ähnliche Probleme haben/hatten......für viele ist es sonnenklar. Ich als Anfänger habe mir aber diese Fragen gestellt und genau da war u.a. auch der Fehler (neben dem Komma von oben):

1) Wildcards können ohne Probleme so gecoded werden. Also untereinander mit Leerzeichen (weils dem Compiler wahrscheinlich wurscht is):
PHP:
$sql = " INSERT INTO diagnoseprotokoll(
    StudieID, GebTag, GebMonat, GebJahr, Age, Geschlecht, Diagnosenanzahl,
    Diagnose01, Diagnose02, Diagnose03, Diagnose04, Diagnose05, Diagnose06, Diagnose07, Diagnose08, Diagnose09, Diagnose10, 
    Diagnose11, Diagnose12, Diagnose13, Diagnose14, Diagnose15, Diagnose16, Diagnose17, Diagnose18, Diagnose19, Diagnose20,
    Diagnose21, Diagnose22, Diagnose23, Diagnose24, Diagnose25, Diagnose26, Diagnose27, Diagnose28, Diagnose29, Diagnose30, 
    Diagnose31, Diagnose32, Diagnose33, Diagnose34, Diagnose35, Diagnose36, Diagnose37, Diagnose38, Diagnose39, Diagnose40
    )
    VALUES(
	
		
	?,?,?,?,

         ?,?,?,?,?,?,?,?,?,?,?,?,?,
	?,?,?,?,?,?,
	?,?,?,?,?,?,?,?,
	?,?,?,
	
	?,?,?,
	?,?,?,?,?,?,?
	
	
	
	,?,?,?)";
Da dürfte kein Fehler auftreten. Klar geht das dann auch nebeneinander. Ich habs untereinander gepackt (nicht so blöde wie hier jetz, sondern in Blocks), um besser abzählen zu können. Bei der Typbestimmung ist das anders...jedenfalls wars bei mir so. Sowas klappt einwandfrei:
PHP:
 $Kommando->bind_param(
			  'siiiisissssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiissssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss',

Sowas nicht:
PHP:
$Kommando->bind_param(
    'siiiisisssssssssss
     sssssssssssssssssssssssssssss',

Sowas dann natürlich auch nicht:
PHP:
$Kommando->bind_param(
    'siiiisisssssssssss

     ssssssssssssss
     sssssssssssssss',

:-)

Gruß
 
Zurück