0

ユーザーの入力を配列に分解してデータベースで検索しますが、結果としてユーザーがスペースを入力すると、スペースのあるテーブルの行全体が表示されます。どうすれば正しくできますか?

if(isset($_POST['submit'])){
$keywords = explode(" ", $_POST["search"]);
for ($i=0; $i<count($keywords); $i++) {

$query = "SELECT * FROM mp3s " .
"WHERE (artist LIKE '%".$keywords[$i]."%' 
OR   genre LIKE '%".$keywords[$i]."%'  
OR  album LIKE '%".$keywords[$i]."%'
OR  filename LIKE '%".$keywords[$i]."%'
) ";
$sql = mysql_query($query) or die(mysql_error());

}
4

2 に答える 2

1

trim()スペースを削除するために使用しmysql_real_escape_string()、SQL インジェクションを防ぐために使用します。

 if(isset($_POST['submit'])){
    $keywords = explode(" ", trim($_POST["search"]));
    for ($i=0; $i<count($keywords); $i++) {

    if(!empty($keywords[$i])) {

      $query = "SELECT * FROM mp3s " .
      "WHERE (artist LIKE '%".trim(mysql_real_escape_string($keywords[$i]))."%' 
      OR   genre LIKE '%".trim(mysql_real_escape_string($keywords[$i]))."%'  
      OR  album LIKE '%".trim(mysql_real_escape_string($keywords[$i]))."%'
      OR  filename LIKE '%".trim(mysql_real_escape_string($keywords[$i]))."%'
      ) ";
      $sql = mysql_query($query) or die(mysql_error());

    }

    }

しかし、機能MySQLiよりも使用する方が良いです。http://php.net/manual/en/function.mysql-real-escape-string.php を参照してください。mysql_real_escape_string()

または、準備済みステートメントを含む PDO :
http://php.net/manual/en/pdo.prepared-statements.php

于 2012-10-16T12:35:07.230 に答える
1

いくつかのポイント: 1. を使用する代わりにfor、使用foreach- 配列で便利です (あなたのケースのように)

  1. クエリを実行する前にユーザーのクエリを確認してください。2 文字を超えるキーワードを入力するようユーザーに要求することは恥ずべきことではありません (「strlen」を使用)。

3.使用するPDO

4.trim機能の詳細を読む

if(isset($_POST['submit'])){
$search_string = trim($_POST['search']);
if(strlen($search_string) == 0)
{
//The user is looking for empty string...
//Amm...why is he doing it?
exit();
}

$keywords = explode(" ", $_POST["search"]);
foreach($keywords as $keyword)
{
$keyword = trim($keyword);
$stmt = $dbh->prepare("SELECT * FROM mp3s WHERE (artist LIKE ? 
OR   genre LIKE ? OR  album LIKE ? OR  filename LIKE ?)");

$stmt->execute(array("%$keyword%","%$keyword%","%$keyword%","%$keyword%"));

}
于 2012-10-16T12:42:36.940 に答える