13

準備済みステートメントを使用して古いコードを新しい msqli インターフェイスに移動しています。IN 句を含む SQL ステートメントに問題があります。私は通常これを行います:

$ids = '123,535,345,567,878'
$sql = "SELECT * FROM table WHERE id IN ($ids)";
$res = mysql_query($sql);

これをmysqliと準備済みステートメントに変換して、いくつかの解決策を試しました:

$ids = '123,535,345,567,878'
$ids = implode($ids,',');
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?));
$result->bind_param("i", $ids);
$result->execute();

上記は失敗し、配列内の要素数の計算、SQL 文字列内の疑問符の数の変更、および配列内の各要素に対する bind_parm の呼び出しも失敗します。コンマ区切りの文字列を使用するだけでも失敗します。

Google でこれに関する適切なドキュメントを見つけることができないので、どのように問題を解決しましたか?

4

3 に答える 3

11

可変長のリストを単一のバインドされた変数にバインドすることはできません。

同様に、文字列をバインドすると、$ids実際には次のようになります。

SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878')

(ID のリストを囲む引用符に注意してください)。

適切な数の疑問符とバインドされたパラメーターを使用して独自のクエリを作成すると、実際に機能するはずです。もう一度試して、実際のエラーを報告する必要がある場合があります。

あるいは、これは残念ながら独自の SQL を手作りし、バインドされたパラメーターを使用しないことが必要な場合の 1 つかもしれません。

于 2009-04-21T14:45:01.953 に答える
5

ここで以前に尋ねられた同様の質問への回答を見てください (2 番目のコード サンプル)。

整数の配列があります。mysql クエリ (php) でそれぞれを使用するにはどうすればよいですか?

要約すると、次のようになります。

  • 適切な量​​の疑問符を含む SQL 文字列を作成する
  • call_user_func_array()配列をクエリ文字列にバインドするために使用します
于 2009-04-21T14:51:00.537 に答える
-2

準備されたステートメントのポイントは、この状況であなたができることだと思いました:

$stmt = $this->mysqli->prepare("UPDATE radcheck SET attribute = ?, value = ?  WHERE username = ? AND attribute LIKE 'CS-Total-Octets%'");
foreach ($usernames as $username)
{
    $stmt->bind_param('sss', $bandwidth_types[$bandwidth_type], $bandwidth_bytes, $username);
    $stmt->execute();
}
$stmt->close();
于 2013-05-14T23:04:07.720 に答える