-1

準備されたステートメントに問題があります。これが私のコードです:

function query_array($table, $data) {
    foreach ($data as $column => $value) {
        $columns[] = sprintf("`%s` = '%s'", $column, $this->db->real_escape_string($value));
    }
    $column_list = join(',', $columns);

    // Prepare the statement
    $stmt = $this->db->prepare("UPDATE `?` SET ?");
    $stmt->bind_param('ss', $table, $column_list);

    // Execute the statement
    $stmt->execute();

    // Save the affected rows
    $affected = $stmt->affected_rows;

    // Close the statement
    $stmt->close();

    // ...
}

$this->db はオブジェクトを返します。

$table = '設定'; (ストリング)

$column_list: (文字列)

`title` = 'Socialsd',`captcha` = '0',`public` = '',`private` = '',`time` = '1',`perpage` = '10',`message` = '140',`mail` = '1',`inter` = '10000',`size` = '1048576',`format` = 'png,jpg,gif',`sizeMsg` = '1048576',`formatMsg` = 'png,jpg,gif,bmp',`censor` = '',`ad1` = '',`ad2` = ''

私が得ているエラーは次のとおりです。

致命的なエラー: キャッチされない例外 'ErrorException' とメッセージ 'SQL 構文にエラーがあります。「?」の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。C:\xampp\htdocs\new\includes\classes.php:256 の 1 行目 スタック トレース: #0 C:\xampp\htdocs\new\sources\admin.php(225): updateSettings->query_array(' settings', Array) #1 C:\xampp\htdocs\new\index.php(42): PageMain() #2 {main} が C:\xampp\htdocs\new\includes\classes.php 行 256 でスローされる

次のことを試してみるとうまくいくので、何が原因なのかわかりません。

$query = sprintf("UPDATE `%s` SET %s", $table, $column_list);
$result = $this->db->query($query);

どんな助けでも大歓迎です。

更新 1 : これが反対票を投じられた理由を教えてください。知っておくといいでしょう。

更新 2 :最後のバインド ($column_list) を削除し、ステートメントに $column_list の出力全体を入れたので、基本的にはテーブル名のみをバインドしていましたが、別のエラーが発生しました:

ファイルが見つかりません: '.\diary\@003f.frm' (errno: 22)

今、私は本当に混乱しています。

4

1 に答える 1

0

私はここで答えを見つけました:可変数の入力変数で 1 つの bind_param() を使用し、@Jocelyn がリンクしてくれたように、テーブル名をバインドできないことがわかりました。閉じることができます。

于 2013-04-14T23:37:13.590 に答える