ホームページ >バックエンド開発 >PHPチュートリアル >文字列の配列を MySQLi プリペアド ステートメントに正しくバインドするにはどうすればよいですか?

文字列の配列を MySQLi プリペアド ステートメントに正しくバインドするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-28 10:47:10976ブラウズ

How to Correctly Bind an Array of Strings to a MySQLi Prepared Statement?

文字列の配列を mysqi プリペアド ステートメントにバインドする

MySQL を使用する場合、多くの場合、値の配列を準備されたステートメントを使用する WHERE IN 句。このタスクは簡単そうに見えますが、エラーにつながる可能性のある落とし穴がいくつかあります。

この記事では、mysqli プリペアド ステートメントを使用して文字列の配列をバインドする正しいアプローチを検討します。また、関連する手順の詳細な説明を提供し、考えられる解決策についても説明します。

何が問題ですか?

質問で提供されているコード サンプルは、誤って次のことを試みています。 bind_param を使用して、都市の配列を準備されたステートメントにバインドします。ただし、bind_param は引数としてスカラー値 (文字列、整数など) を期待します。配列を直接バインドしようとすると、エラーが発生します。

正しいアプローチ

文字列の配列を準備されたステートメントに正常にバインドするには、次のコードを使用できます。手順:

  1. プレースホルダーの文字列を作成します: まず、配列要素のプレースホルダーを表す適切な数の疑問符 (?) で構成される文字列。
  2. プレースホルダー文字列をクエリに挿入します。 WHERE IN 句を文字列に置き換えます。
  3. ステートメントを準備してバインドします: 変更されたクエリを準備し、配列をバインドします要素に正しい型指定子 (文字列の 's' など) を使用します。
  4. クエリを実行します。 準備されたステートメントを実行して結果を取得します。

サンプルコード

これは正しいコードの例ですcode:

$mysqli = new mysqli("localhost", "root", "root", "db");
if(!$mysqli || $mysqli->connect_errno) { return; }

$cities = explode(",", $_GET['cities']);
$in = str_repeat('?,', count($cities) - 1) . '?';
$query_str = "SELECT name FROM table WHERE city IN ($in)";

$query_prepared = $mysqli->stmt_init();
if($query_prepared && $query_prepared->prepare($query_str)) {
    $types = str_repeat('s', count($cities));
    $query_prepared->bind_param($types, ...$cities);
    $query_prepared->execute();
}

この例では、まず str_repeat を使用してプレースホルダーの文字列を作成します。次に、このプレースホルダー文字列をクエリに挿入し、ステートメントを準備します。 ...$cities を使用して city 配列の個々の要素をバインドし、str_repeat('s', count($cities)) を使用してデータ型を指定する方法に注目してください。

これらの手順に従うことで、正常に実行できます。文字列の配列を mysqli プリペアド ステートメントにバインドし、意図したとおりにクエリを実行します。

以上が文字列の配列を MySQLi プリペアド ステートメントに正しくバインドするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。