2

Web サイト用のシンプルな検索バーを作成しました。クエリが次のようになっていれば、うまく機能します。

$sql = query("SELECT id, firstname, lastname, username, location FROM 
users WHERE firstname LIKE '%" . $search_query . "%' LIMIT 20");

しかし、そのように書くと、SQL構文エラーがエコーされます:

$sql = query("SELECT id, firstname, lastname, username, location FROM 
users WHERE firstname, lastname, username, location  LIKE '%" . $search_query . "%'   
LIMIT 20");

2 つのクエリの違いは、ユーザーが名前または都市のいずれかを検索できるため、2 番目のクエリは複数の列を検索することです。

どのように書き直せばよいですか?

4

3 に答える 3

1

残念ながら、フィールドごとに LIKE ステートメントを繰り返す必要があります。

SELECT id, firstname, lastname, username, location FROM users 
WHERE firstname LIKE '%" . $search_query . "%'
OR lastname LIKE '%" . $search_query . "%' 
OR username LIKE '%" . $search_query . "%'
OR location LIKE '%" . $search_query . "%'
LIMIT 20
于 2013-07-07T23:18:54.073 に答える
1

キーワードLIKEはそのようには機能しません。これを試して:

$like_string = "'%$search_query%'";

$query = "SELECT id, firstname, lastname, username, location
FROM users
WHERE firstname LIKE $like_string OR
lastname LIKE $like_string OR
username LIKE $like_string OR
location LIKE $like_string
LIMIT 20";

$sql = query($query);

他の人が言うように、ユーザー データを受け入れる前に、SQL インジェクションを考慮し、サニティ チェックと有効性チェックを実行するのが賢明です。SQL インジェクションを防ぐ方法については、この質問をご覧ください。

MySQL にはPDO拡張機能またはmysqli 拡張機能が推奨されており、関数は非推奨になっています (ドキュメントmysql_全体で確認できます)。

于 2013-07-07T23:21:20.960 に答える
0

各列の検索条件を個別に指定する必要があります。

$sql = query("SELECT id, firstname, lastname, username, location
FROM users
WHERE firstname LIKE '%$search_query%'
OR lastname LIKE '%$search_query%'
OR username LIKE '%$search_query%'
OR location LIKE '%$search_query%'
LIMIT 20");

ご覧のとおり、連結を削除しました。二重引用符を使用しているため、変数を直接クエリに入れることができます。

また、消毒されていることを願っ$search_queryています。そうでない場合、SQL インジェクション攻撃にさらされています。本当に、今ではパラメーター化されたクエリを使用しているはずです。

于 2013-07-07T23:19:47.077 に答える