Какова функция этого синтаксиса ~ * в запросе sql?

Я пытаюсь понять сценарий для реализации новых функций и опций. Для поиска в таблицах sql они использовали следующий синтаксис

$sqlquery = "SELECT DISTINCT \"Name\", \"FileName\", \"Status\", lower(\"Name\") FROM \"" . $SearchedTable . "\" WHERE ";

$sqlquery=$sqlquery." (\"Name\" ~* '".$text[$i]."' OR \"DNA\" ~* '".$text[$i]."')";
  • Я хотел бы знать, почему они используют \ "Имя \" (я где-то читал, что это как-то связано с инъекциями sql).
  • Я также не мог найти причину, по которой использовать этот синтаксис ~ * вместо =. Или это еще что-то значит?

Вы уверены, что это mysql, а не postgres? ~ используется в mysql как побитовый оператор, а также как оператор отрицания при полнотекстовом поиске. Похоже, что ни то, ни другое здесь не играет роли. Где в postgresql ~ - это оператор регулярного выражения, который имеет гораздо больше смысла в этом контексте.

JNevill 12.12.2018 16:26

Спасибо, адаптировал. Я не хотел задавать свой полный вопрос. Я бы не очень ясно сказал.

Nemo 12.12.2018 16:27

Это Postgresql, а не mysql. Найдите операторы сопоставления с образцом.

emix 12.12.2018 16:27

Если вы хотите избежать внедрения sql, прочтите руководство по PDO

Alon Eitan 12.12.2018 16:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
3 583
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Общее примечание: в вашем текущем запросе используется конкатенация строк, поэтому он подвержен SQL-инъекции. Лучшее решение на вашей стороне PHP - использовать подготовленный оператор.

При этом ваш синтаксис SQL выглядит как Postgres, а не MySQL. Вот примерный запрос:

SELECT DISTINCT Name, FileName, Status, lower(Name)
FROM yourTable
WHERE Name ~* ? OR DNA ~* ?;

Оператор ~* в Postgres выполняет сопоставление регулярных выражений без учета регистра. Так, например, чтобы сопоставить любой Name, который начинается с mi, вы можете использовать:

WHERE Name ~* '^mi'

Следовательно, то, что вы должны привязать к двум заполнителям, - это регулярные выражения.

Мои столбцы содержат полные предложения. Так, например, я обнаружил, что строка, содержащая мои таблицы, содержит полные предложения ". Этот оператор найдет эту строку, когда мой sqlquery содержит, например," WHERE Name ~ * full "?

Nemo 12.12.2018 16:37

Вам понадобятся одинарные кавычки вокруг full, но да, это будет. Вы, вероятно, также захотите окружить full границами слов, чтобы соответствовать только полному слову, а не как подстроке. Так что, возможно, использовать WHERE Name ~* '\yfull\y'.

Tim Biegeleisen 12.12.2018 16:41

Другие вопросы по теме