Hallo,
ich beschäftige mich momentan mit Prepared Statements in PHP und bin auf ein Problem gestoßen, das ich mir nicht erklären kann. Konkret geht es um das Abfangen von Problemen (Error Handling) bei Falscheingaben.
Ich habe bereits im Internet dazu recherchiert und Antworten gefunden (bspw. return-Werte checken und nur bei true
weiter machen), aber ohne Erfolg.
Habe auch gelesen, dass deshalb keine Fehlermeldung kommt, da das Prepared Statement ja erst später abgesendet wird aber all die Lösungen die genannt wurden haben bei mir nicht funktioniert.
Bspw.
if (mysqli_stmt_bind_param($stmt, 'i', $entry_id)) {
mysqli_stmt_execute($stmt);
}
In meinem Fall geht es darum, dass (im Standardfall) per POST eine ID in einer Variable übergeben wird. Folgendes ist der HTML-Code:
<form action="validate.php" method="POST">
<select name="entry" id="entries" size="7">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<!-- ... -->
<option value="other">Other Option</option>
</select>
<input type="submit" value="Vote" name="vote">
</form>
Die IDs (bis auf other) kommen aus einer Datenbank und werden danach wieder geprüft.
UPDATE table SET votes = votes + 1 WHERE entry_id = ?; -- ? ist die ID die übergeben wird
Wie man sieht kann aber other
auch übergeben werden und eig. erwarte ich, dass das ganze scheitert.
Warum erwarte ich es? Ich sage mit mysqli_stmt_bind_param
, dass die Variable ein Integer sein soll.
mysqli_stmt_bind_param($stmt, 'i', $entry_id);
Allerdings liefert diese (und jegliche andere Methode) true
bzw. keinen Fehler.
Ich denke ich habe einen simplen Fehler im Programm, weshalb ich keinen Fehler erhalte.
Hier mein ganzes PHP-Script:
// internal method which calls "mysqli_connect" and returns that
$con = open_connection($servername, $username, $password, $database);
$entry_id = $_POST['entry'];
// Lock Database
mysqli_autocommit($con, false);
//mysqli_begin_transaction($con, MYSQLI_TRANS_START_READ_WRITE); // disabled because too old mysql version
$sql = "UPDATE table SET votes = votes + 1 WHERE entry_id = ?;";
$stmt = mysqli_prepare($con, $sql);
if (!$stmt) {
die("An Error occurred while updating the Table. Error: '" . mysqli_error($con)) . "'";
}
$success = mysqli_stmt_bind_param($stmt, 'i', $entry_id);
if (!$success) {
die("An Error occurred while updating the Table. Error: '" . mysqli_error($con)) . "'";
}
$success = mysqli_stmt_execute($stmt);
if (!$success) {
die("An Error occurred while updating the Table. Error: '" . mysqli_error($con)) . "'";
}
$success = mysqli_stmt_close($stmt);
if (!$success) {
die("An Error occurred while updating the Table. Error: '" . mysqli_error($con)) . "'";
}
// Commit
$success = mysqli_commit($con);
if (!$success) {
die("An Error occurred while updating the Table. Error: '" . mysqli_error($con)) . "'";
}
// Unlock Database
mysqli_close($con);
Klar könnte ich auch vorher auf $entry_id == "other"
prüfen aber ich finde das unsauber und würde es gerne ordentlich lösen (eben mit Fehlerbehandlung).
Ich wäre glücklich, wenn jemand wüsste wo mein Fehler ist, habe gestern 2 Stunden versucht es zu fixen ohne Erfolg.
LG, DMan