1

このコードは、データベース内の人の名前の検索エンジンによく似ています。

if (isset($_POST['submit'])){
      $keyword = $_POST['stats'];   
      $orderby = $_POST['orderby'];

      if (!empty($_POST['stats'])) {
          $getStats = $db->query("SELECT * FROM `stats` WHERE
              `lastname` LIKE '%$keyword%' OR `firstname` LIKE '%$keyword%' OR
              `nickname` LIKE '%$keyword%' ORDER BY `$orderby`
              DESC");

これにより、結果がテーブルに出力されます。テーブルコードは必要なく、長すぎると思いました。

上記のクエリは、姓のみ、名のみ、またはニックネームを検索する場合に機能します

しかし、たとえばデータベースに John Smith という名前のユーザーがいる場合は、

名: ジョン
姓: スミス

「John」を検索した場合、彼はテーブルに出力されます。これは、「Smith」を検索した場合と同じです。

しかし、'John Smith' を検索すると、彼はテーブルに出力されません。

これが発生するようにこのクエリを変更するにはどうすればよいですか、私はこれを試しました:

$getStats = $db->query("SELECT * FROM `stats` WHERE
    `firstname`, `lastname` = '$keyword' OR `lastname` LIKE '%$keyword%' OR `firstname` LIKE '%$keyword%' OR
    `nickname` LIKE '%$keyword%' ORDER BY `$orderby`
    DESC");
4

4 に答える 4

1

WHERE CONCAT(firstname, ' ', lastname) LIKE %$keyword%

また、ユーザー入力をクエリ文字列に直接補間するのではなく、パラメーターをバインドする必要があります。現在のコードは SQL インジェクションに対して脆弱です。

于 2013-04-10T19:36:19.110 に答える
0

REGEXP を試すことができます:

$keyword = $db->real_escape_string($_POST['stats']); // escape data
$orderby = $db->real_escape_string($_POST['orderby']); // escape data
$keyword = implode("|", explode(" ", $keyword));

$getStats = $db->query("SELECT * FROM stats 
                        WHERE firstname REGEXP '$keyword' 
                           OR lastname REGEXP '$keyword' 
                           OR nickname REGEXP '$keyword' 
                        ORDER BY $orderby DESC");
于 2013-04-10T19:41:11.387 に答える
0

これを試して

  $sql = "SELECT *
  FROM stats
  WHERE 
  firstname LIKE '%$keyword%'
  OR lastname LIKE '%$keyword%'
  OR CONCAT_WS(' ',firstname,lastname,) LIKE '%$keyword%'
  OR CONCAT_WS(' ',lastname,firstname) LIKE '%$keyword%'
  OR nickname LIKE '%$keyword%'
  ORDER BY $orderby DESC";
于 2013-04-10T19:42:15.327 に答える