мне нужно разделить эту строку и l oop запрос - PullRequest
0 голосов
/ 01 мая 2020

используемое значение - несколько слов, сокращенных на. Например, это выглядит так: tag1, tag2, tag3 Как я могу разделить теги и искать их в моей базе данных. все теги в одном столбце. Вот почему я использовал подобное утверждение. Я хочу создать поиск по ключевым словам, и в результате должны быть включены все теги. я не могу найти решение. кто-нибудь знал, как это сделать?

if(isset($selectedValues)){

    $keywords = $db->escape_string($selectedValues);

    $query = $db->query("
        SELECT name, img_dir
        FROM website
        WHERE tag LIKE '%{$keywords}%'
        OR name LIKE '%{$keywords}%'
        OR name2 LIKE '%{$keywords}%'
        OR published LIKE '%{$keywords}%'
    ");

    if($query->num_rows) {
        while($r = $query->fetch_object()) {
        ?>

Ответы [ 3 ]

0 голосов
/ 01 мая 2020

Use explode

Пример:

$paragraph="tag1 tag2 tag3 tag4";
$splitting_delimiter=" ";
$splitted_tags=explode($splitting_delimiter,$paragraph);
0 голосов
/ 01 мая 2020

Пожалуйста, попробуйте эти решения (не тестировались).

Решение 1

if(isset($selectedValues)){

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

    $tag_arr = []; 
    $name_arr = [];
    $name2_arr = [];
    $published_arr = [];

    foreach($keywords as $key){

        $key = $db->escape_string($key);

        $tag_arr[] = "tag LIKE '%{$key}%'";
        $name_arr[] = "name LIKE '%{$key}%'";
        $name2_arr[] = "name2 LIKE '%{$key}%'";
        $published_arr[] = "published LIKE '%{$key}%'";
    }

    $tag_str = implode(' OR ', $tag_arr);
    $name_str = implode(' OR ', $name_arr);
    $name2_str = implode(' OR ', $name2_arr);
    $published_str = implode(' OR ', $published_arr);


    echo $sql = "SELECT name, img_dir FROM website WHERE $tag_str OR $name_str OR $name2_str OR $published_str";

    $query = $db->query($sql);

    if($query->num_rows) {
        while($r = $query->fetch_object()) {
        ?>

Решение 2:

if(isset($selectedValues)){


    $keywords_arr = explode(',', $selectedValues);

    $keywords = [];
    foreach($keywords_arr as $word){
        $keywords[] = $db->escape_string($word);
    }

    $tag_str = "tag REGEXP '".implode('|', $keywords)."'";
    $name_str = "name REGEXP '".implode('|', $keywords)."'";
    $name2_str = "name2 REGEXP '".implode('|', $keywords)."'";
    $published_str = "published REGEXP '".implode('|', $keywords)."'";

    echo $sql = "SELECT name, img_dir FROM website WHERE $tag_str OR $name_str OR $name2_str OR $published_str";

    $query = $db->query($sql);

    if($query->num_rows) {
        while($r = $query->fetch_object()) {
        ?>
0 голосов
/ 01 мая 2020

Я полагаю, что есть лучшие способы добиться этого, но быстро (экспериментируйте и приобретайте опыт) вы можете использовать это:

$ keyword = str_replace (",", "%", $ keys);

перед вашим $ запросом. Так это будет выглядеть так: tag1% tag2% tag3, и тогда ваш оператор LIKE будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...