1

私の場合、を使用して複数のテーブルから削除してLEFT JOINおり、削除する質問IDの配列を提供する必要があります。質問IDの配列はです$questions_to_delete

配列をパラメーターとしてバインドできないのmysqliは一種の苦痛です。私はいくつかのSOの質問を調べて、これに到達しました。

$params = implode(',', array_fill(0, count($questions_to_delete), '?'));
$types = array_fill(0, count($questions_to_delete), 'i');
$delete_questions = $mysqli->prepare('DELETE    ...
                                          FROM questions
                                          LEFT JOIN ...
                                          WHERE questions.id IN ('.$params.')');

call_user_func_array(array(&$delete_questions, 'bind_param'), array_merge($types, $questions_to_delete));
$delete_questions->execute();
$delete_questions->close();

私が得ているエラーは

警告:mysqli_stmt :: bind_param()[mysqli-stmt.bind-param]:型定義文字列の要素の数がバインド変数の数と一致しません

いくつかの答えが&$delete_questions$delete_questionsに使用されていることに気づきましたが、PHPが何について不平を言っているのかについて私は困惑しています。

4

1 に答える 1

1

私は正しくマージしていませんでした$types$questions_to_delete私の元のコードでは:

// Produces ['i', 'i', 'i', ...]
$types = array_fill(0, count($questions_to_delete), 'i');

// The argument (array_merge) is then ['i', 'i', ..., 'id1', 'id2', ...]
call_user_func_array(array($delete_questions, 'bind_param'), array_merge($types,$questions_to_delete));

最終的に私のために働いたのは:

// Produces 'iii..'
$types = str_repeat('i', $questions_to_delete);

// The argument (array_merge) is then ['iii...', 'id1', 'id2', ...]
call_user_func_array(array($delete_questions, 'bind_param'), array_merge(array($types),$questions_to_delete));

したがって、パラメータのタイプは、パラメータ配列の先頭にある文字列である必要があります。

call_user_func_arrayハンドルがどのように処理array(mysqli_stmt, 'bind_param')されるのか、なぜパラメータをこのように構築する必要があるのか​​、私にはよくわかりません。callable誰かが説明を思い付くことができるかどうかを確認したいと思います。

于 2012-08-08T19:20:24.503 に答える