Using mysqli prepared statements with LIKE operator in SQL
Before running any query with mysqli, make sure you’ve got a properly configured mysqli connection variable that is required in order to run SQL queries and to inform you of the possible errors.
SELECT query with LIKE operator
In general, SELECT with LIKE is no different from any other SELECT query with prepared statements. However, there are two certain gotchas that one should keep in mind:
- A placeholder cannot represent an arbitrary part of a query but only a whole data literal (or, to put it simpler, a string or a number). Hence, an SQL like this field LIKE ‘%?%’ won’t work. Hence, the percent marks should be added to the source variable instead. Then ,a variabe that would contain something like ‘%search string%’ can be bound to a placeholder the regular way.
- bind_param() function accepts only variables, and strings are not allowed. Hence, a code like this $stmt->bind_param(«s», «%$var%»); won’t work, causing «Only variables can be passed by reference» error. So we must prepare our variable before binding it.
Knowing that now we can create a prepared statement with LIKE:
$name = "%$name%"; // prepare the $name variable
$sql = "SELECT * FROM users WHERE name LIKE ?"; // SQL with parameters
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $name); // here we can use only a variable
$stmt->execute();
$result = $stmt->get_result(); // get the mysqli result
$rows = $result->fetch_all(MYSQLI_ASSOC); // all rows matched
Using a helper function
As you may noted, the code for a prepared statement is quite verbose. If you like to build a code like a Lego figure, with shining ranks of operators, you may keep it as is. If you, like me, hate useless repetitions and like to write concise and meaningful code, then there is a simple helper function. With it, the code will become two times shorter:
$sql = "SELECT * FROM users WHERE name LIKE ?"; // SQL with parameters
$stmt = prepared_query($conn, $sql, ['%$name%']);
$rows = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); // fetch an array of rows
Unlike bind_param() , our helper function accepts strings as parameters, hence you can add percent marks right at the call time.
Related articles:
Got a question?
I am the only person to hold a gold badge in , and on Stack Overflow and I am eager to show the right way for PHP developers.
Besides, your questions let me make my articles even better, so you are more than welcome to ask any question you have.
SEE ALSO:
- Top 10 PHP delusions
- PDO Examples
- Mysqli Examples
- Principles of web-programming
- Mysqli SELECT query with prepared statements
- How to run a SELECT query using Mysqli
- How to run an INSERT query using Mysqli
- How to run an UPDATE query using Mysqli
- Mysqli prepared statement with multiple values for IN clause
- Mysqli examples
- How to call stored procedures with mysqli
- How to create a search filter for mysqli
- How to run 1000s insert queries with mysqli?
Latest comments:
- 23.07.23 16:47
Tim Dawson for PDO Examples:
I have a web site where visitors can look at accommodation reviews. A selection of reviews is.
read more - 17.07.23 21:18
Jim for (The only proper) PDO tutorial:
Thanks for the reply! I was hoping you would know if what I’m attempting is even possible! :).
read more - 16.07.23 00:35
Jim for (The only proper) PDO tutorial:
Hi, I just discovered this site today, so first and foremost, thank you for all your work.
read more - 27.06.23 05:30
Jeff Weingardt for MVC in simpler terms or the structure of a modern web-application:
I was just curious what you find the most effective way to learn php and become proficient? so.
read more - 23.06.23 00:57
Michael for INSERT query using PDO:
I read your bit on not needing to check the status of execution. I’m curious, if I needed to.
read more
Add a comment
Please refrain from sending spam or advertising of any sort.
Messages with hyperlinks will be pending for moderator’s review.
Comments:
Thank you so much. I searched for hours before I found your solution. In this piece of code, $name = «%$name%»; I was using single quotes, changed to double quotes and my queries work like a charm. Thank you so much once again.
As of 2/05/2020, in both SQL queries on this page there is an equal sign after the ‘LIKE’ that should not be there.
Оператор MySQL LIKE
Оператор MySQL LIKE проверяет, соответствует ли конкретная символьная строка указанному шаблону.
expr LIKE pat [ESCAPE 'escape_char']
- Сопоставление с образцом с использованием простого сравнения регулярных выражений SQL. Возвращает 1 (ИСТИНА) или 0 (ЛОЖЬ). Если expr или pat имеют значение NULL, результат равен NULL.
- Шаблон не обязательно должен быть литеральной строкой. Например, его можно указать как строковое выражение или столбец таблицы.
- В соответствии со стандартом SQL, LIKE выполняет сопоставление для каждого символа, поэтому он может давать результаты, отличные от оператора сравнения =.
- Оператор LIKE использует WILDCARDS (то есть%, _) для сопоставления с шаблоном. Это очень полезно для проверки наличия в записях определенного символа или строки.
% используется для соответствия любому количеству символов, даже нулю символов.
_ используется для соответствия ровно одному символу.
Чтобы проверить наличие буквенных символов подстановочного знака, перед ним должен быть escape-символ. Если вы не укажете символ ESCAPE, подразумевается «/».
/% используется для соответствия одному символу «%».
/ _ Соответствует одному символу «_»
Версия MySQL: 5.6
Пример: оператор MySQL LIKE
Следующая инструкция MySQL сканирует всю таблицу авторов, чтобы найти любое имя автора, имя которого начинается с символа «W», за которым следуют любые символы.
SELECT aut_name, country FROM author WHERE aut_name LIKE 'W%';
mysql> mysql> SELECT aut_name, страна -> ОТ автора -> ГДЕ aut_name LIKE 'W%'; + ----------------- + --------- + | aut_name | страна | + ----------------- + --------- + | Уильям Нортон | Великобритания | | Уильям Моэм | Канада | | Уильям Энтони | Великобритания | + ----------------- + --------- + 3 ряда в наборе (0,05 сек)
List of authors whose name starts with 'w', along with their country:
Publisher Country query('SELECT aut_name, country FROM author WHERE aut_name LIKE "W%"') as $row) < echo ""; echo "" . $row['aut_name'] . " "; echo "" . $row['country'] . " "; echo " "; > ?>
Publisher Country %> catch (Exception ex) < out.println("Can’t connect to database."); >%>
Пример: оператор MySQL LIKE, соответствующий концу
Следующая инструкция MySQL сканирует всю таблицу авторов, чтобы найти любого автора, имя которого заканчивается строкой ‘on’.
SELECT aut_name, country FROM author WHERE aut_name LIKE '%on';
mysql> SELECT aut_name, страна -> ОТ автора -> ГДЕ aut_name LIKE '% on'; + ---------------- + --------- + | aut_name | страна | + ---------------- + --------- + | Уильям Нортон | Великобритания | | Томас Мертон | США | | Пирс Гибсон | Великобритания | | Джозеф Мильтон | США | + ---------------- + --------- + 4 ряда в наборе (0,00 сек)
Пример: оператор MySQL LIKE, соответствующий строке
Следующая инструкция MySQL сканирует всю таблицу авторов, чтобы найти любого автора, в имени которого есть строка «an». Имя автора хранится в столбце aut_name.
SELECT aut_name, country FROM author WHERE aut_name LIKE '%an%';
mysql> SELECT aut_name, страна -> ОТ автора -> ГДЕ aut_name LIKE '% an%'; + ---------------------- + ----------- + | aut_name | страна | + ---------------------- + ----------- + | Уильям Энтони | Великобритания | | С.Б.Сваминатан | Индия | | Томас Морган | Германия | | Джон Бежеман Хантер | Австралия | | Эван Хайек | Канада | | Батлер Андре | США | + ---------------------- + ----------- + 6 рядов в наборе (0,00 сек)
Пример: оператор MySQL LIKE, соответствующий указанной строке
Следующее утверждение MySQL ищет всех авторов, чьи родные города, такие как «Лондон», «Лэндон» и т. Д., Подстановочный знак подчеркивания используется для упоминания одного символа.
SELECT aut_name, country,home_city FROM author WHERE home_city LIKE 'L_n_on';
mysql> ВЫБРАТЬ aut_name, страну, home_city -> ОТ автора -> ГДЕ home_city LIKE 'L_n_on'; + -------------- + --------- + ----------- + | aut_name | страна | home_city | + -------------- + --------- + ----------- + | Пирс Гибсон | Великобритания | Лондон | | Си Джей Уайльд | Великобритания | Лондон | + -------------- + --------- + ----------- + 2 ряда в наборе (0,00 сек)
Пример: оператор MySQL LIKE, соответствующий управляющему символу
Для поиска символа подстановки или комбинации символа подстановки и любого другого символа символу подстановки должен предшествовать строка ESCAPE. В MySQL строка ESCAPE по умолчанию — «/». Следующая инструкция MySQL возвращает те записи, чьи isbn_no содержат «_16».
SELECT book_name,isbn_no,no_page,book_price FROM book_mast WHERE isbn_no LIKE '%\_16%';
mysql> SELECT book_name, isbn_no, no_page, book_price -> ОТ book_mast -> ГДЕ isbn_no НРАВИТСЯ "% / _ 16%"; + --------------------------------- + ------------- + - -------- + ------------ + | book_name | isbn_no | no_page | book_price | + --------------------------------- + ------------- + - -------- + ------------ + | Сети и Телекоммуникации | 00009790_16 | 95 | 45,00 | + --------------------------------- + ------------- + - -------- + ------------ + 1 ряд в наборе (0,00 сек)
Пример: оператор MySQL LIKE, соответствующий начальной и конечной строке
Подстановочные знаки также можно использовать в середине шаблона поиска. Следующая инструкция MySQL найдет всех авторов, чьи имена начинаются с ‘t’ и заканчиваются на ‘n’.
SELECT aut_name, country FROM author WHERE aut_name LIKE 't%n';
mysql> SELECT aut_name, страна -> ОТ автора -> ГДЕ aut_name LIKE 't% n'; + --------------- + --------- + | aut_name | страна | + --------------- + --------- + | Томас Морган | Германия | | Томас Мертон | США | + --------------- + --------- + 2 ряда в наборе (0,00 сек)
Слайд-шоу функции сравнения MySQL и операторов
Предыдущий: Меньше чем оператор ( <)
Далее: НЕ МЕЖДУ И