1

コードを実行すると、クエリで実行されているキーワードがデータベース内のキーワードと同じではないため、対象のエントリを取得できません。

キーワード:

$keywords = 'spaghetti,macaroni,hamburger';

クエリ:

mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%$keywords%' ORDER BY id DESC LIMIT 1");

これらのキーワードを含むエントリをターゲットにしています:

food, restaurant, hamburger, spaghetti, taco,pie

私は 12 時間連続で働いているので、ここで何か単純なものが欠けている可能性があります。ただし、この問題を回避するために何をしようとしてもうまくいきませんでした。

私の見解では、一致するキーワードが 2 つあるため、クエリはターゲット エントリを返す必要があります。

どうすればいいですか?

4

6 に答える 6

2

複数の値を CSV として列内に保存することは、一般的な SQL アンチパターンです。使用するのは難しく、最適化するのはさらに困難です。

Doom のコンマ区切りリストを修正する方法

于 2012-07-02T21:52:50.913 に答える
2
$like = array();
$keywords = explode(',' , $keywords);
foreach($keywords as $keyword) {
  $like[] = "`keywords` LIKE '%$keyword%'";
}
$like = implode(' OR ', $like);
$query = "SELECT * FROM `table` WHERE $like ORDER BY id DESC LIMIT 1";
于 2012-07-02T21:47:02.043 に答える
2

キーワードを分割し、それぞれについて個別LIKEに比較する必要があります

SELECT * FROM mytable
WHERE keywords LIKE '%spaghetti%' OR keywords LIKE '%macaroni%'
-- ...

あなたはこのようなことをすることができます

<?php

$keywords = 'spaghetti,macaroni,hamburger';

$query = "SELECT * FROM mytable WHERE 1=1";

$keywords = explode(',', $keywords);

if (count($keywords)) {
    $query .= sprintf(
        " AND (%s)",
        implode(' OR ', array_map(function($word){
            return "keywords LIKE '%{$word}%'";
        }, $keywords))
    );
}

echo $query;

// SELECT * FROM mytable WHERE 1=1 AND (keywords LIKE '%spaghetti%' OR keywords LIKE '%macaroni%' OR keywords LIKE '%hamburger%')

コメントからわかるように、これを処理するより良い方法がありますが、この初歩的な質問は簡単な答えを探していると思います。

入力のサニタイズを行ったり、他のフェイル セーフを追加したりしていません。このようなクエリの構築はあまり信頼性が高くないため、将来よくある落とし穴を回避するために、引き続き PHP/MySQL について学習する必要があります。ただし、現時点では、より高度なアプローチは少し手の届かないところにあると思います。OPが把握できると思われるより良いテクニックを他の誰かが提供したい場合は、必ずそれを選択してください:)

于 2012-07-02T21:39:41.990 に答える
1

分離された作品で使用するLIKE必要があります。これを試すことができます:

$keywords = 'spaghetti,macaroni,hamburger';

$arrayWords = explode(',', $keywords);

$like = '';

foreach($arrayWords as $word)
    $like .= empty($like) ? " keywords LIKE '%$word%' " : " OR keywords LIKE '%$word%' ";

mysql_query("SELECT * FROM ---- WHERE $like ORDER BY id DESC LIMIT 1");
于 2012-07-02T21:46:30.827 に答える
1
mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%". implode("%' OR keywords LIKE '%", explode(",", $keywords)) ."%' ORDER BY id DESC LIMIT 1");
于 2012-07-02T21:46:38.690 に答える