PHP не находит то, что находит MySQL

321
04 октября 2017, 10:28

Здравствуйте, скажите пожалуйста, почему в mysql ниже написанный запрос выдаёт ответ

SELECT * FROM `book_material` WHERE (((LOWER(Content) RLIKE LOWER("Евклид") or LOWER(Title) RLIKE LOWER("Евклид")) and Type="TEXT") OR ((LOWER(Title) RLIKE LOWER("Евклид") or LOWER(Description) RLIKE LOWER("Евклид")) and Type="HTML"))

А вот, этот, который я уже запускаю на сайте уже выводит "пусто":

$sql = "SELECT * FROM `book_material` WHERE (((LOWER(Content) RLIKE LOWER(\"Евклид\") or LOWER(Title) RLIKE LOWER(\"Евклид\")) and Type=\"TEXT\") OR ((LOWER(Title) RLIKE LOWER(\"Евклид\") or LOWER(Description) RLIKE LOWER(\"Евклид\")) and Type=\"HTML\"))";
$result = mysqli_query($mysqli, $sql);
  • В mysql строка храниться в UTF-8
  • В HEAD файле, тоже установлена кодировка UTF-8
  • И ещё бонусом, я выполняю -->
mysqli_query($mysqli,"SET CHARACTER SET utf8");
mysqli_query($mysqli,"SET NAMES utf8");

UPD:

E:\wamp64\www\solve.php:37:object(mysqli)[2]  public 'affected_rows' => int -1  public 'client_info' => string 'mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $' (length=79)  public 'client_version' => int 50011  public 'connect_errno' => int 0  public 'connect_error' => null  public 'errno' => int 1139  public 'error' => string 'Got error 'empty (sub)expression' from regexp' (length=45)  public 'error_list' =>     array (size=1)      0 =>         array (size=3)          'errno' => int 1139          'sqlstate' => string '42000' (length=5)          'error' => string 'Got error 'empty (sub)expression' from regexp' (length=45)  public 'field_count' => int 0  public 'host_info' => string 'localhost via TCP/IP' (length=20)  public 'info' => null  public 'insert_id' => int 0  public 'server_info' => string '5.7.19' (length=6)  public 'server_version' => int 50719  public 'stat' => string 'Uptime: 51483  Threads: 1  Questions: 1915  Slow queries: 0  Opens: 144  Flush tables: 1  Open tables: 137  Queries per second avg: 0.037' (length=137)  public 'sqlstate' => string '00000' (length=5)  public 'protocol_version' => int 10  public 'thread_id' => int 310  public 'warning_count' => int 0
E:\wamp64\www\solve.php:37:boolean false
Answer 1

В дампе $mysqli видно, что последняя ошибка была:

1139 Got error 'empty (sub)expression' from regexp

RLIKE является синонимом REGEXP.

Соответственно операнд одного из RLIKE опознается как пустой.

Черт его знает, по какой причине, но, смотря на ваш SQL я сам чуть глаза не сломал, что уж говорить за бедный драйвер mysqlnd

Давайте его, для наглядности, раскроем:

SELECT * 
FROM `book_material` 
WHERE (
    (
        (
            LOWER(Content) RLIKE LOWER("Евклид") 
            or LOWER(Title) RLIKE LOWER("Евклид")
        )
        and Type="TEXT"
    ) 
    OR 
    (
        (
            LOWER(Title) RLIKE LOWER("Евклид") 
            or LOWER(Description) RLIKE LOWER("Евклид")
        ) 
        and Type="HTML"
    )
)

И попробуем применить к нему здравый смысл.

  1. Явно видно, что LOWER(Title) вполне можно вынести в отдельное условие.
  2. Занафига тут регулярки, когда сравнивается с константной строкой?
  3. Зачем делать LOWER от константы?
  4. Даже в документации mysql для текстовых строк используются одинарные кавычки. Зачем же мучиться с экранированием двойных?

Попробуйте так:

$sql = "
SELECT * 
FROM `book_material` 
WHERE 
    LOWER(Title) LIKE '%евклид%'
    OR (LOWER(Content) LIKE '%евклид%' AND Type='TEXT')
    OR (LOWER(Title) LIKE '%евклид%' AND Type='HTML')
"
READ ALSO
Побитовое “И” в функции php

Побитовое “И” в функции php

Какую роль играет побитовое "И" в функциях php? С какой целью его используют? Например: function foo ($var1, & $var2){

223
Наследование моделей в Codeigniter

Наследование моделей в Codeigniter

Каким образом можно создать модель расширенную от своего абстрактного класса?

357
Алгоритм Бабушкина

Алгоритм Бабушкина

Здравствуйте! Есть реализация алгоритма в MATLAB:

236
Как сократить данный MySQL-код?

Как сократить данный MySQL-код?

Можно ли как-то сократить данный код? Думаю, что это делается через циклы, но как - не могу понять

231