Php mysql DELETE und UPDATE funktioniert nicht

Hallo,
leider zeigt der Code in Zeile 8 und 9 keine Funktion. Die Zeilen in der Tabelle Temptable mit dem leeren Feld image_path werden nicht gelöscht. Es passiert einfach gar nichts. Warum? Fehlermeldung bekomme ich auch keine.

<?php
require "conn.php";

$category = $_POST["category"];
$fruit = $_POST["fruit"];
$cost = $_POST["cost"];

$delete_query = "DELETE FROM `Temptable` WHERE image_path = ''";
$update_query = "UPDATE Temptable SET (`category`, `fruit`, `cost`) VALUES ('$category','$fruit','$cost')";
$mysql_qry = "INSERT INTO Datatable (`category`, `fruit`, `cost`) SELECT `categrory`, `fruit`, `cost` FROM `Temptable` WHERE `id` >= '1'";

if($Datatable->query($mysql_qry) === true) {
    echo "Successful";
}
else {
    echo "Error: " . $mysql_qry . "<br>" . $Datatable->error;
}
$Datatable->close();
$Temptable->close();
?>

Hallo,

natürlich passiert da nichts.

Du schreibst deine Queries (DELETE und UPDATE) in eine Variable ($delete_query, $update_query) und lässt sie dann dort versauern. Du musst sie auch ausführen :joy:

Gruß,
Steve

Du solltest übrigens auch mal diesen Wikipedia-Artikel lesen:

Vom Nutzer übergebene Variablen ($_POST) ungeprüft in SQL-Kommandos zu übernehmen ist ein echtes Sicherheitsrisiko.

Gruß,
Steve

Hallo,
schonmal danke für die Hilfe. Habe die Variablen nun ausgeführt. Das deleten funktioniert nun. Leider funktioniert aber das updaten in Zeile 7 trotzdem nicht. Warum? Führe $update_query doch genauso aus, wie $delete_query.

Zum besseren Verständnis:
Die Tabelle Temptable besitzt die 3 Spalten category, fruit und cost. Nach dem Deleten im php-Code in Zeile 6 enthält sie genau eine Zeile, in der nur das Feld category einen Eintrag enthält. Die zwei anderen Felder sind leer. Durch das Updaten sollen auch fruit und cost einen Eintrag erhalten.

<?php
require "conn.php";

$category = $_POST["category"];
$fruit = $_POST["fruit"];
$cost = $_POST["cost"];

$delete_query = "DELETE FROM `Temptable` WHERE image_path >= 1";
$update_query = "UPDATE Temptable SET (`fruit`, `cost`) VALUES ('$fruit','$cost')";
$mysql_qry = "INSERT INTO Datatable (`category`, `fruit`, `cost`) SELECT `categrory`, `fruit`, `cost` FROM `Temptable` WHERE `id` >= '1'";

$Temptable->query($delete_query);
$Temptable->query($update_query);

if($Datatable->query($mysql_qry) === true) {
echo "Successful";
}
else {
    echo "Error: " . $mysql_qry . "<br>" . $Datatable->error;
}
$Datatable->close();
$Temptable->close();
?>

Hallo!

Zu einem UPDATE gehört auch irgendwo ein WHERE, um die zu updatende(n) Zeile(n) auszuwählen. Beim DELETE hast du sowas ja drin.

Sehr schwierig zu sagen, ohne die Datenbank zu sehen.

Bist du denn sicher, denn das in deinen $_POST Variablen die Daten sind, die du erwartest.
Gib doch mal aus und kontrolliere sie.

Gruß,
Steve

Nicht unbedingt.
Ohne WHERE wird das Update auf alle Zeilen angewendet.
Ein ganz klassischer „DBA-ohne-Kaffee“ Fehler.

Gruß,
Steve

Vielen Dank für die zahlreiche Hilfe. Habe nun endlich die lösung gefunden. Hiermit funktioniert es:

$update_query = "UPDATE Temptable SET `category` = '$category', `fruit` = '$fruit', `cost` = '$cost'";

WHERE habe ich keines verwendet, da sich in der Tabelle immer nur eine Zeile befindet. Damit ist dies nicht notwendig.

Vielen Dank für den Hinweis. Wie kann man diese Sicherheitslücke beheben?
Habe es auf die schnelle mal hiermit ausprobiert, scheint aber nicht zu fruchten.

if( get_magic_quotes_gpc() == 1 ) {
   $category = stripslashes( $_POST["category"] );
   $fruit= stripslashes( $_POST["fruit"] );
}

$category = mysql_real_escape_string( $_POST["category"] );
$fruit = mysql_real_escape_string( $_POST["fruit"] );

Du solltest nicht versuchen, auf bestimmte „böse“ Sachen, wie Quotes etc zu filtern.
Da wird man immer etwas vergessen.

Stattdessen solltest du auf die Eingabewerte einen RegEx anwenden, der definiert, was in diesen Feldern sein sollte. Für „fruit“ und „category“ könnte das bspw. ‚\w+‘ sein.

Gruß,
Steve