4

SQL を作成し、AdoDb を使用してデータベースに接続し、クエリを実行しています。パラメータ化されたクエリを使用していますが、問題が発生しました。

パラメータ化のためにAdoDb/MySqlのin_clauseに値の配列を渡す方法です。

私の問題は、「test」、「test2」、「test3」などの準備された文字列をパラメーターとして渡すと、ライブラリまたはデータベースが自動的にエスケープし、最初と最後に外部引用符が追加されるため、機能しないことです。引用符は自動的にエスケープされるため、クエリは、入力したものとは対照的に、「\'test\',\'test2\',\'test3\''を検索するため、何も返しません。

これを達成するための別の可能な方法で更新

<?php
$in_clause = implode(",", $first_names);

$query = "
SELECT    
    mytable_id_pk
FROM 
    mytable
WHERE
FIND_IN_SET(mytable_fname," . $DB->Param('first_names') . ")"

$stmt = $DB->Prepare($query);

$result = $DB->Execute($stmt,array($in_clause));
?>
4

2 に答える 2

6

私はこのようにします(しばらくの間グーグルをしていて、グーグルは何も役に立たなかったので):

$count = count($first_names);
$in_params = trim(str_repeat('?, ', $count), ', ');

$query = "
SELECT    
    mytable_id_pk
FROM 
    mytable
WHERE
    mytable_fname IN ({$in_params});";

$stmt = $DB->Prepare($query);
$result = $DB->Execute($stmt, $first_names);

これで済むはず…

于 2012-05-22T09:04:40.473 に答える
-1

最初にいくつかのヒント:

  1. プリペアド ステートメントに関する AdoDB のドキュメントをよくお読みください。
  2. 含めないでください。SQL クエリ文字列で。

次のようなことを試すことができます:

$question_marks = substr(str_repeat('?,', count($first_names)), 0, -1);

$query = "SELECT mytable_id_pk FROM mytable WHERE mytable_fname IN (" . $question_marks . ")";
$stmt = $DB->Prepare($query);
$result = $DB->Execute($stmt,$first_names);

警告: 私はこれをテストしていません (ここに mySQL をインストールしていません)。

于 2012-05-22T09:04:45.157 に答える