2012-02-24 8 views
8

私は配列リストでSELECTする必要があります。 $array_nameは含まれていますMysqlの配列WHERE LIKE?

Array ([0] => gum.cn [1] => lol.com. [2] => ns1.blar.com [3] => test.com [4] => web.cn.) 

ますprint_r($のARRAY_NAME)。上記の作業をしない理由

$string = implode(',',$array_name); 


    $tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE '%{$string}%'"; 
    $result1 = mysql_query($tank); 
     while ($jwp = mysql_fetch_array($result1)) 
     {  
     echo $jwp['url']; 
     echo "<br>"; 
     } 

?私は他の例を検索し、質問はLIKE節を使わずに尋ねているので、解決策はありません。助けてください、ありがとうございます。

+1

@stackoverflow.com/questions/1127088/mysql-like-in – lamplightdev

+0

@lightightdev:REGEXPは良い選択肢ですが、残念なことにここには '.'文字が含まれており、正規表現ではワイルドカードですあなたはそれらをエスケープすることができますが、そのような些細なことIMOのためにあまりにも多くの仕事です。それは考えられるが。 – netcoder

答えて

30

は、それは動作しません。

SELECT url FROM `PHP`.`db` WHERE url LIKE '%a,b,c,d,%' 

あなたはどちらかと思っていますか? o複数のLIKE文を追加する。 Implodeは、正確な文字列一致クエリを実行していない限り、このタスクでは機能しません。それでもコードを微調整する必要があります。

+0

ねえ、ありがとう。今は動作しますが、これはわかりません。$ string = implode( 'OR url LIKE'、$ query_parts); '空白も含めて' 'OR url LIKE ''を削除する必要があるのはなぜですか?説明していただき、ありがとうございます。 – sg552

+1

@ sg552:削除しません。*追加します。クエリを画面にダンプすると、おそらく理解できます。 – netcoder

+0

この間、私は 'implode()'がコンマや空白を配列から取り除いていると考えました。私は次のような出力を得ます: '%gum.cn% 'OR url LIKE'%lol.com。% 'OR url LIKE'%blar.com% 'OR url LIKE'%test.com% 'OR url LIKE'%web .cn。% 'もし私が正しく理解すれば、MySQLは' $ string'変数を長い文字列として解釈します。もし1000のドメインがあれば、1000のドメインが1つのクエリで実行されますか?正しい?あなたの時間をありがとう。 – sg552

0

「gum.cn」などのデータベース値と '%gum.cn、lol.com、.....%'との照合が試行されるため、動作しません。本当だ。

foreach ($array_name as $string) { 
    $tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE '%{$string}%'"; 
    $result1 = mysql_query($tank); 
    echo $jwp['url']; 
    echo "<br>"; 
} 

に役立ちます希望を

はむしろこれを行います。あなたは少しクエリ変更する必要が

SELECT url FROM `PHP`.`db` WHERE url LIKE '%gum.cn,lol.com.,ns1.blar.com...%' 

:技術的に有効な、わかりました(それは無効なSQLを生成するので

$query_parts = array(); 
foreach ($array_name as $val) { 
    $query_parts[] = "'%".mysql_real_escape_string($val)."%'"; 
} 

$string = implode(' OR url LIKE ', $query_parts); 

$tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE {$string}"; 
+1

ループ内でクエリを実行していますか?これは良い習慣ではなく、OPの質問にも答えません。 – Sarfraz

+0

OPの質問は、それがうまくいかない理由を説明することでした。 – ralfe

+1

あなたがもっと経験を積むと、私は今日(ループ内のクエリを実行している)正しいことを知っているでしょう:) – Sarfraz

1

を、あなたのクエリはに拡大していきますので

+0

ところで、それは完全に有効なSQLです。 – netcoder

+1

有効なSQLですが、実行しようとしているものではありません。 – JohnFx

0

は、IN句を使用しますが、値が引用されていることを確認し、エスケープ:/ **

//TODO: escape $array_name values 

$string = implode("','",$array_name); //ensure quoted values 

$tank = "SELECT url FROM `PHP`.`db` WHERE url IN ('$string')"; 
0

を*と、「[]」ブロックと異なる文字をグループ化、値の多次元配列を内破。 * @param配列$配列 * @return列爆縮配列 */ 関数hoArray2SqlLike($配列)を内破する配列 { (もし!is_array($ array))$ arrayを返します。

$values = array(); 
$strings = array(); 

foreach ($array as $value) 
{ 
    foreach (str_split($value) as $key => $char) 
    { 
     if (! is_array($values[ $key ])) 
     { 
      if (isset($values[ $key ])) 
      { 
       if ($values[ $key ] != $char) 
       { 
        $values[ $key ]  = array($values[ $key ]); 
        $values[ $key ][] = $char; 
       } 
      } 
      else 
       $values[ $key ] = $char; 
     } 
     elseif (! array_search($char , $values[ $key ])) 
      $values[ $key ][] = $char; 
    } 
} 

foreach ($values as $value) 
{ 
    if (is_array($value)) 
     $value = '['.implode('', $value).']'; 

    $strings[] = $value; 
} 

return implode('', $strings); 

}

0

/*配列のデータ*/

$array_name = array("gum.cn","lol.com","ns1.blar.com","test.com","web.cn"); 

/* "分離(空白)と文字列に配列要素に参加" */

echo $string = implode(" ", $array_name); 
// output: gum.cn lol.com ns1.blar.com test.com web.cn 

/*区切り記号(空白)を "%"または "%"で置き換えます*/

echo $string = str_replace(" ", "%' OR '%", $string); 
// output: gum.cn%' OR '%lol.com%' OR '%ns1.blar.com%' OR '%test.com%' OR '%web.cn 

/*クエリのSQL */

$tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE 

'%$文字列%'

「に挿入します。

関連する問題