0

私は、配列内の任意の場所に等しい "t1.address_city" (データベース内の列) を持つ行を返すために、データベースに対して where クエリを作成する必要があるアプリケーションを使用しています。これを 1 つの大きな文字列にするために implode() を使用する必要があることは理解していますが、これは行を返しません。おそらく、大きな文字列に一致する行を探しているためです (もちろん、1 つの都市だけではありません。リストです)。コード:

$_GET["places"]次のようなものが含まれています。

["madrid", "lisbon", "london", "paris", "new york"]

配列名 $places を のように where 句IN ('$places')に入れると、行が取得されません。ここでの他の同様の質問のアドバイスに従って、配列を次のように"madrid, lisbon, london, paris, new york"内破し、内破された変数を次のように使用しますIN ('$implodedplaces')が、前述のように、行が見つかりません。

各地名を引用符 ( ) で囲んで個別に入力すると完全に機能することがわかりましたIN ('madrid','lisbon','london')が、もちろん$_GET["places"]、これはユーザーによって操作されるため、を使用するには IN 句が必要です。すべての値$_GET["places"]をカンマで区切って個別の文字列として入力する方法はありますか?

助けていただければ幸いです - 私の説明が良くない場合は、遠慮なく質問してください。

4

3 に答える 3

0

エスケープを行う必要があることに注意する必要があります。

$in = []; 
foreach ($_GET["places"] as $place) {
    $in[] = mysql*_real_escape_string($place);
}
$in = '"' . implode('", "', $in) . '"';
$query = "select * from t where f IN (" . $in . ")";

さらに、count($_GET["places"])空の場合はクエリにIN()構文エラーがあるため、確認する必要があります。

于 2013-08-05T11:37:29.327 に答える
0

IN に注意してください。ほとんどの場合、完全なテーブル スキャンが必要であり、これにより mysql のパフォーマンスが低下します。

EXPLAIN を使用してクエリを確認する必要があります。

于 2013-08-05T11:54:21.927 に答える
-1

試す

$implodedplaces = implode("','", $places);

これは、$places にある可能性のある引用符をエスケープしないことに注意してください。

$_GET["places"] が文字列の場合、次を試すことができます。

$implodedplaces = str_replace('"', "'", str_replace('[',"'", str_replace(']',"'",$_GET["places"])));

ただし、これは地名に引用符や括弧が含まれていないことを前提としています。

于 2013-08-05T11:34:43.043 に答える