mysqliのプリペアドステートメントでIN句を使用するにはどうすればよいですか[重複]

StackOverflow https://stackoverflow.com/questions/772913

  •  12-09-2019
  •  | 
  •  

質問

プリペアド ステートメントを使用して古いコードの一部を新しい 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 文字列内の疑問符の数を変更し、配列内の各要素に対して binding_parm を呼び出すことも失敗します。カンマ区切りの文字列だけを使用しても失敗します。

Google ではこれに関する適切なドキュメントが見つかりません。問題をどのように解決しましたか?

役に立ちましたか?

解決

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

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

要約すると次のとおりです。

  • 適切な量​​の疑問符を含む SQL 文字列を作成する
  • 使用 call_user_func_array() 配列をクエリ文字列にバインドするには

他のヒント

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

同様に、あなたが実際になってしまいます文字列$idsをバインドした場合:

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

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

疑問符の右の数を使用して独自のクエリを作成し、バインドされたパラメータは、実際に働いている必要があります - あなたは再びそれを試してみて、実際のエラーを報告する必要があるかもしれません。

また、これはそれがバインドされたパラメータを使用して、独自のSQLをしていない - クラフト手に残念ながら必要ですこれらの機会のいずれかになります。

私は、準備文のポイントは、あなただけ行うことができ、このような状況でそう思った。

$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();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top