2016-07-19 15 views
1

Ich versuche eine interne Datenbank auf dem Post zu einer Drittanbieter-Plattform zu aktualisieren. Ich habe erfolgreich die gleiche Datenbank für eine andere Variable aktualisiert, aber wenn ich diese Variable in alle Pausen hinzufüge. Hier ist die mysqli Update-Anweisung:mysqli update query failing

@$mysqli->query("UPDATE `tableName` SET `columnID`=" . (int)$columnID . ',`columnID2`=' . (int)$columnID2 . ',`columnID3`=' . (int)$columnID3 . ',`columnID4`=' . $columnID4 . ' WHERE `id`=' . (int)$id . ' LIMIT 1'); 

aus irgendeinem Grund wird es funktionieren, wenn ich columnID4 nehmen, aber wenn ich columnID4, die in der Erklärung ist es nicht funktioniert.

Ich habe einen var-Dump auf $ columnID4 gemacht und es gibt den Wert, den ich jedes Mal erwarte.

wenn ich

tat
echo $mysqli->error; 

bekam ich eine Nachricht "Array" unbekannten Array in 'Feldsatz' zu sagen.

So sieht mein Code aus, wo ich das Feld einstelle.

if ($query->num_rows == 1) { 
    $columnID4 = $query->fetch_assoc(); 
} else { 
    $columnID4 = 0; 
} 
+0

Willst du '(int)' nicht vor columnID4 haben? –

+0

stimmt der Datenbankdatentyp mit dem überein, was Sie über PHP senden? –

+0

Ja, columnID4 wird in der Datenbank als Dezimalzahl und nicht als Ganzzahl gesetzt. Ich werde nach dem Typ suchen, den php sendet. – kemosabe

Antwort

0

Es ist immer schwierig, SQL zu debuggen, indem man PHP-Code ansteuert, der die SQL-Zeichenfolge erstellt. Schauen Sie stattdessen auf das SQL nach wurde es gebaut!

Tipp: Verwenden Sie niemals den Fehlerunterdrückungsoperator @. Es ist besser, Fehler zu beheben, sie nicht zu unterdrücken.

Ich mag nicht die Angewohnheit von PHP-Entwicklern, String-Verkettung zu verwenden. Es macht den Code schwer zu lesen, und es ist leicht, Fehler zu machen. Hier sind zwei verschiedene Möglichkeiten, wie Sie den Code robuster machen könnten:

Lösung 1: Verwenden Sie sprintf(), um die Variablen in Ihre SQL-Zeichenfolge zu interpolieren. Auf diese Weise können Sie die Variablen mithilfe von %d bzw. %f zu Ganzzahlen oder Dezimalzahlen zwingen.

$sql = sprintf("UPDATE `tableName` SET `columnID`=%d, `columnID2`=%d, 
    `columnID3`=%d, `columnID4`=%f WHERE `id`=%d LIMIT 1", 
    $columnID, $columnID2, $columnID3, $columnID4, $id); 
error_log("sql = $sql"); 
$mysqli->query($sql); 

Lösung 2: Verwenden Sie gebundene Parameter mit mysqli_stmt::bind_param(). Dies ist eine empfohlene Vorgehensweise bei der Verwendung von SQL. Die Variablen berühren niemals Ihren SQL-Code. Es gibt keine Möglichkeit, die Abfragesyntax zu unterbrechen.

$sql = "UPDATE `tableName` SET `columnID`=?, `columnID2`=?, 
    `columnID3`=?, `columnID4`=? WHERE `id`=? LIMIT 1"; 
error_log("sql = $sql"); 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param("iiidi", $columnID, $columnID2, $columnID3, $columnID4, $id); 
$stmt->execute(); 
0

Die Lösung für mein Problem war die Änderung der if-Anweisung auf die folgenden:

if ($query->num_rows == 1) { 
    $array = $query->fetch_assoc(); 
    $columnID4 = $array['num']; 
} else { 
    $columnID4 = 0; 
} 

Das Problem war, dass ich ein Array-Objekt zurück, und der Code wurde immer wusste nicht, was mit ihm zu tun und konnte die spezifischen Informationen in diesem Array, nach denen ich gefragt habe, nicht finden.