Здравствуйте, скажите пожалуйста, почему в 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);
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
В дампе $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"
)
)
И попробуем применить к нему здравый смысл.
LOWER(Title)
вполне можно вынести в отдельное условие.LOWER
от константы?Попробуйте так:
$sql = "
SELECT *
FROM `book_material`
WHERE
LOWER(Title) LIKE '%евклид%'
OR (LOWER(Content) LIKE '%евклид%' AND Type='TEXT')
OR (LOWER(Title) LIKE '%евклид%' AND Type='HTML')
"
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Какую роль играет побитовое "И" в функциях php? С какой целью его используют? Например: function foo ($var1, & $var2){
Каким образом можно создать модель расширенную от своего абстрактного класса?
Можно ли как-то сократить данный код? Думаю, что это делается через циклы, но как - не могу понять