2016-03-26 9 views
0

では、私はこの1つ上の答えをすべてインターネット上で見てきたし、準備された文とバインドのparamsが出てくる(私はその原料が何であるか見当がつかない)mysqliの - 基本的に、私はカンマを配列

を持っています分けられたリスト

$list = 'food, drink, cooking'; 

[OK]を今すぐデータベースの列にこれらの項目のそれぞれを検索したい...単純な、右か?

$query = "SELECT * FROM table WHERE stuff IN ('$list')"; 
$runquery = mysqli_query($connection, $query); 
while($row = mysqli_fetch_array($runquery,MYSQLI_ASSOC)){ 
    $variable = $row; 
} 

続いて、後に、

var_dump($variable); 

未定義の変数

なぜ?私はコードに間違ったものは見当たらない。それは私が特定の値を入れれば動作し、私はWHERE stuff=$itemでそれをテストしました - それは正常に動作します。

これは変数/データベースではないため、IN文のエラーです。なぜそれがうまくいかないのか分かりません。

答えて

3

各要素は、それ

$list = "'food', 'drink', 'cooking'"; 
$query = "SELECT * FROM table WHERE stuff IN ($list)"; 

の前後に引用符を必要とする、またはあなたは、配列

$array = array("food","drink","cooking"); 
$query = "SELECT * FROM table WHERE stuff IN (".implode(',', $array).")"; 
+0

配列メソッドは機能しません。 –

+0

一番簡単なこと、ねえ!ありがとう、これは完全に問題を解決しました - そして、他のみなさんに感謝しました! – PHPlearnerproject

+0

@PHPlearnerprojectあなたは、このコードが本質的にSQLインジェクションを受けやすいので完璧さに気づいていることを認識しなければなりません。 –

-2

を持っていた場合はあなたのリストが$list = 'food, drink, cooking';です。しかし、それをWHERE INに貼り付けることはできません。あなたはそれを準備する必要があります:$listの文字列を分解し、適切な引用符でそれを黙ってIN句に渡します。

は、このコードを試してみてください。

$list = 'food, drink, cooking'; 
$listArray = array_map('trim', explode(',', $list)); 
$listWhere = "('".implode("','", $listArray)."')"; 

$query = "SELECT * FROM table WHERE stuff IN ".$listWhere; 
$runquery = mysqli_query($connection, $query); 
while($row = mysqli_fetch_array($runquery,MYSQLI_ASSOC)){ 
    $variable = $row; 
} 
+0

これは、dbクエリに渡す値を準備することの本当の意味かどうかは分かりませんが、間違いかもしれません.WikiPediaは完璧ではありませんが、私は[この説明](https:// en.wikipedia.org/wiki/Prepared_statement)はかなり正確です... – webeno

+0

私はクエリを準備することを意味します。著者はこのSQLを 'SELECT * FROM table WHERE stuff stuff '(' food、drink、cooking ')とし、それは動作しません。彼は$ list文字列を分割し、適切な引用符でそれを埋め込み、それをIN節に渡すべきです。 –

+0

私はあなたに言っていることは、OPは準備された声明が何を意味するのか分からず、あなたがしていることは、準備された声明が通常意味するものではないということです。 – webeno

1

私はあなたがその未定義の変数を取得するつもりだ、いつでも、クエリが行を返さないと思われます。行がフェッチされた後を除いて、変数が定義され/初期化されることはありません。

限り、クエリが行を返さない理由として、あなたのクエリがリテラル単一の文字列です

... WHERE stuff = 'food, drink, cooking' 

に相当します。クエリは、列の内容がその文字列と等しい場合にのみ行を返します。その文字列の中のカンマは値の一部にすぎません。

... WHERE stuff IN ('food','drink','cooking') 

注これは、カンマで区切られた3つの別々の文字列リテラルであること:あなたがものは値のいずれかが含まれている行を検索したい場合は、クエリは次の形式である必要があります。カンマは、SQL文の一部であり、値の一部ではありません。これは、列のものに 'food'が含まれている行を返します。または「飲む」。または「料理」。

あなたのクエリが「うまくいかない」のはそのためです。

+0

それを完璧に解決!ありがとうございました! – PHPlearnerproject

関連する問題