2012-03-22 14 views
0

OKこれで、Webページから顧客リストをフィルタリングするためにfullnameを取得しています。実際の部分がファーストネームか姓であるかわからないので、 :LIKE演算子をSQLで使用するときにフィールドを結合する

"SELECT sc.*, c.firstname, c.lastname,c.email FROM scoop_customer AS sc LEFT JOIN 
customer AS c ON sc.customer_id = c.customer_id WHERE c.firstname + ' ' + c.lastname 
LIKE '%".$fullname."%'" 

しかし、それは私が何度も試してみました、通常、それはDBから値を返すされているはずにもかかわらず、私には働いていないようです。私が間違っているところを教えてください。

+2

** WARNING ** SQLインジェクション攻撃を受けやすいかもしれないあなたのコード。 –

+1

"%"を検索してテーブルが十分に大きい場合はサービス拒否 –

答えて

1

使用CONCAT(c.firstname , ' ' , c.lastname)

2

CONCAT

WHERE concat(c.firstname, ' ', c.lastname) LIKE '%".$fullname."%'" 
1

CONCATは、これらの操作

のための素晴らしいことか試してみてくださいSCを選択」

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat

MySQLのドキュメントを参照してください。*、 c.firstname、c .lastname、c.email FROM scoop_customer AS sc LEFT JOIN お客様のAS番号はc.customer_idです。CONCAT(c.firstname、 ''、c.lastname)LIKE '% "。mysql_real_escape_string($ fullname)。 % '"

1

私はフルネームを最初と最後に区切り、2つのチェックを行い、それぞれの先頭にワイルドカード%を取り除きます。連結とワイルドカードのようなものは、あなたが名前フィールドについている可能性のあるインデックス付けをすべて破ります。

もちろん、テーブルに数千人の顧客しかいない場合、インデックス作成はそれほど重要ではありませんが、10万人になるとあなたはそれを感じます!

1

あなたが以前にエスケープしていないと思って、私はmysql_real_escape_stringを追加しました。質問の
は、トリックはORではなく、CONCAT

".... WHERE c.firstname LIKE '%".mysql_real_escape_string($fullname)."%' 
     OR c.lastname LIKE '%".mysql_real_escape_string($fullname)."%'"