Привязка для подготовки оператора с использованием mysqli работает нормально, когда я использую такой запрос

if ($stmt = $dbh->prepare("SELECT url, title, fulltxt FROM links WHERE id = ? ")){// do something}

Но он не работает, когда я использую этот запрос

if ($stmt = $dbh->prepare("SELECT url, title, fulltxt FROM links WHERE MATCH(fulltxt)  AGAINST(?) ")) {//do something}

Как правильно использовать MATCH() AGAINST() со знаком вопроса в запросе для привязки значения.

0
Niamul Hasan 31 Мар 2016 в 14:35
Выглядит правильно, что происходит, ошибки? Если вы передадите значение статически, это сработает?
 – 
chris85
31 Мар 2016 в 14:48
Это не дает ошибок. (я не выключаю выдачу ошибки)
 – 
Niamul Hasan
31 Мар 2016 в 15:25
Вы включили отчеты об ошибках? Вы получаете prepared failed или результаты не возвращаются? Работает ли выполнение запроса в БД напрямую?
 – 
chris85
31 Мар 2016 в 15:25

2 ответа

Лучший ответ

Новый полный код на основе pastebin:

<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
    </head>
    <body>

        <?php
            error_reporting(-1);
            // here the db details

            $query = "%".$_GET['q']."%";

            // Connecting to the server and selecting database
            $dbh  = new mysqli($host, $user, $password,  $database);

            if ($dbh->connect_error) {
                echo 'Unable to connect to database '. $dbh->connect_error;
            } else {
                // run query to select records
                if ($stmt = $dbh->prepare("SELECT url, title, fulltxt FROM links WHERE fulltxt LIKE ?")) {
                    // binding user-supplier input $class to the parameter as string
                    $stmt->bind_param("s", $query);
                    // executing the statement
                    $stmt->execute();
                    // binding the table columns Name and Email to the $Name and Email parameters respectively.
                    $stmt->bind_result($URL, $TITLE, $FULLTXT);
                    /* fetch associative array */
                    while ($stmt->fetch()) {
                        echo $URL. ' -- '. $TITLE. '<br />';
                    }
                } else {
                       echo "Prepare failed: (" . $dbh->errno . ") " . $dbh->error;
                }
            }
        ?>

    </body>
</html>

Проблема была устранена заменой MATCH на LIKE и объединением переменной с процентными символами с обеих сторон.

-1
Jester 31 Мар 2016 в 17:13
Else {echo "Ошибка подготовки: (". $ stmt-> errno. ")". $ stmt-> ошибка; } Я использовал этот код, но он не возвращает ошибок.
 – 
Niamul Hasan
31 Мар 2016 в 15:03
Вы должны использовать $ dbh, а не $ stmt! Вы также включили отчеты об ошибках? добавив error_reporting (-1); в начале кода php?
 – 
Jester
31 Мар 2016 в 15:06
Пожалуйста, проверьте мой полный код. вот. pastebin.com/8SGJfBQp Я не знаю, почему после добавления еще {echo $ dbh-> error; } он выдает эту ошибку «Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданное 'else' (T_ELSE) в ...»
 – 
Niamul Hasan
31 Мар 2016 в 15:23
Код, который у вас есть в pastebin, по-прежнему говорит об ошибке $ stmt->. что неверно.
 – 
Jester
31 Мар 2016 в 15:27
Я считаю, что это правильное решение. Но на моем хостинге сайт не работает. после удаления error_reporting (-1); не давая никаких. ошибка. спасибо за попытку. Я попробую код на другом сервере. может быть проблема в текущем хостинге
 – 
Niamul Hasan
31 Мар 2016 в 15:48

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

$where = "'\"{$some_variable}\"'";

А затем свяжите параметр с переменной $ where:

$stmt = $dbh->prepare("SELECT url, title, fulltxt FROM links WHERE MATCH(fulltxt) AGAINST(? IN BOOLEAN MODE)");
$stmt->bind_param("s", $where);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
-2
Rinaldi Pratama 27 Июл 2021 в 08:15
Зачем нужно экранировать кавычки? Не могли бы вы объяснить?
 – 
Dharman
27 Июл 2021 в 16:16
Потому что я хочу использовать это «(кавычки), что означает двойные кавычки в MySQL MATCH Full-Text с использованием логического режима, сопоставление только буквальных значений для извлечения всех строк, содержащих, например, слово« Sky Sailing ».
 – 
Rinaldi Pratama
27 Июл 2021 в 18:08
Мне очень жаль, но я все еще не понимаю. При чем здесь привязка данных в подготовленном операторе? Мне кажется, что у вас было требование добавить в строку двойные кавычки, которые не имеют ничего общего с привязкой данных. Вы уверены, что это решение проблемы, указанной в вопросе?
 – 
Dharman
27 Июл 2021 в 18:11
Я пытаюсь связать данные с двойными кавычками без выхода из строки, но это не сработает в операторе подготовки mysqli, поэтому я пришел к этому вопросу, чтобы попытаться исправить его, а затем внезапно он работает с escape-строковой переменной. Извините, но я пытаюсь помочь здесь.
 – 
Rinaldi Pratama
27 Июл 2021 в 18:19
Хорошо, что ты пытаешься помочь. Я только пытаюсь понять ваше решение. Я никогда не слышал о влиянии данных на способ связывания подготовленного оператора. Фактически данные никак не могут повлиять на привязку. Ваше решение может быть полезным, но в нем отсутствует образовательная часть. Вы должны объяснить, почему необходимо экранирование (которое, кстати, не имеет ничего общего с mysqli, как я это вижу)
 – 
Dharman
27 Июл 2021 в 19:47