2016-07-19 12 views
1

私はサードパーティのプラットフォームへの投稿時に内部データベースを更新しようとしています。別の変数の同じデータベースを正常に更新しましたが、この変数を追加するとすべてが破損します。mysqli更新クエリが失敗しました

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

私はcolumnID4を取るが、私は持っているときcolumnID4はそれが動作しない文に含まれている場合、それは動作します何らかの理由:ここではmysqliの更新ステートメントです。

私は$ columnID4上のVaRのダンプを行っているし、それは私が毎回期待していた値を返します。私は

echo $mysqli->error; 

をしたとき

私は「フィールドセット」の「アレイ」、未知の配列を言うメッセージが表示されました。ここで

は私のコードは、私はフィールドを設定しています場所のように見えるものです。

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

あなたはcolumnID4の前に '(int)'を持たないのですか? –

+0

データベースのデータ型はPHP経由で送信しているものと一致していますか? –

+0

はい、columnID4は、dbではDecimalとして設定され、intではありません。私はphpが送信しているタイプをチェックします。 – kemosabe

答えて

0

SQL文字列を作成するPHPコードを調べることで、SQLをデバッグすることは常に困難です。代わりに、それが構築されたの後にSQL を見てください!

ヒント:@エラー抑制演算子を使用することはありません。エラーを修正し、抑止しない方がいいです。

私は、文字列の連結を使用するPHP開発者の習慣を好きではありません。それはコードを読みにくくし、間違いを起こしやすいです。

解決策1: sprintf()を使用して、変数をSQL文字列に補間します。これにより、%d%fをそれぞれ使用して、変数を整数または小数点に強制することができます。

$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); 

解決策2:バインドされたパラメータをmysqli_stmt::bind_param()で使用します。これは、SQLを使用する場合に推奨される方法です。変数が決してあなたのSQLコードに触れることはありません。クエリ構文を壊す方法はありません。

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

問題は、私は戻って配列オブジェクトを取得したことと、コードはそれで何をすべきかを知りませんでした:

$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

私の問題を解決するには、次のようにif文を変更しました私が求めていたアレイ内の特定の情報を見つけることができませんでした。

関連する問題