2011-09-13 9 views
0

'like'ステートメントを含むクエリに問題があります。ここでMySQLの 'Like'クエリの問題

は私のコードです:

function get_number_of_locations_by_zip_tag($zip, $tag) 
{ 
     global $db; 
     $query = "SELECT * FROM location WHERE zip = :zip AND disabled = 0 AND (tags LIKE :tag OR name LIKE :tag) LIMIT :start, :number"; 

     $statement = $db->prepare($query); 
     $statement->bindValue(':zip', $zip); 
     $statement->bindValue(':tag', '%'.$tag.'%', PDO::PARAM_STR); 
     $statement->execute(); 
     $locations = $statement->fetchAll(); //fetch(); 
     $statement->closeCursor(); 
     return $locations; 
} 

私はタグは「名前」や「タグ」欄のいずれかに一致するが、その代わりに、それは場合にのみ行を返すローを返すために、クエリを期待していタグは一致します。

私は、クエリを切り替える場合:

$query = "SELECT * FROM location WHERE zip = :zip AND disabled = 0 AND (name LIKE :tag OR tags LIKE :tag) LIMIT :start, :number"; 

そして、その結果は、それが唯一の名前のフィールドが一致した行を返しますところ、反対で、タグのフィールドを無視します。

誰でもこのクエリに間違いはありますか?私が開発を開始したときにWindowsのXAMPPサーバーに期待したとおりに動作しますが、LAMPサーバーにすべてを切り替えたとき、このクエリは正しく機能しなくなりました。

すべてのヘルプは高く評価され、

+0

[あなたの投稿に署名やタグラインを追加しないでください](http://stackoverflow.com/faq#signatures)。 – meagar

答えて

0

まあ、私は尋ねた、と私は、私はすでに私の解決策を掲載、私はないと思う考え、数週間後にこれを解決終わるんでした。..

DhruvPathakの答えがうまくいかなければならないようだが、何らかの理由でそれは私にとってはうまくいかなかったようだ。 は、代わりに、私は一種の騙してこれをした:

$query = "SELECT * FROM location WHERE zip = :zip AND disabled = 0 AND (name LIKE :tag OR tags LIKE :tag2) LIMIT :start, :number"; 

代わりに、私は2つの変数にそれを区切って、その後、同じ値でそれらの両方をバインド倍、単一のバインド値を使用しようとしているの:

$statement->bindValue(':tag', '%'.$tag.'%', PDO::PARAM_STR); 
$statement->bindValue(':tag2', '%'.$tag.'%', PDO::PARAM_STR); 

誰かが実際にこの問題にぶつかった場合、私はこれもあなたのためにそれを解決することを願っています。

1

、変更する場合があります

tags LIKE ':tag' OR name LIKE ':tag' 

またはあなたのコードの変化に

tags LIKE :tag OR name LIKE :tag 

:式などの

$statement->bindValue(':tag', '\'%'.$tag.'%\'', PDO::PARAM_STR); 

〜する必要がありますよると「%ジョン%」LIKE引用符.eg名に電子

+0

私はこれらのソリューションの両方を試しましたが、現在行を返すようには見えませんが、mysqlコマンドラインから次のコマンドを実行すると、 'select * from location zip = 92346、disabled = 0および( name '%Am%'や '%Am%'のようなタグ); ' 両方のフィールドを返すことができるので、バインディングはそのコマンドに変換されません。 – OrangeGrover