PHP MySQL SELECT WHERE
Узнайте, как использовать WHERE в MySQL в PHP для фильтрации SELECT с операторами сравнения, логическими операторами и подготовленными запросами.
Оператор SELECT используется для выборки данных из базы данных. Предложение WHERE применяется для фильтрации данных на основе определённых условий. Предложение WHERE можно объединять с оператором SELECT, чтобы извлекать из базы данных только нужные данные.
Ниже приведён базовый синтаксис оператора SELECT с предложением WHERE:
PHP / SQL — базовый синтаксис оператора SELECT с предложением WHERE
SELECT column1, column2, ...
FROM table_name
WHERE condition;В приведённом синтаксисе:
column1,column2, ... — столбцы, из которых нужно получить данные.table_name— название таблицы, из которой нужно получить данные.condition— логическое выражение, определяющее, какие данные следует извлечь.
Пример
Рассмотрим таблицу customers со следующими данными:
| id | name | country | |
|---|---|---|---|
| 1 | John | [email protected] | USA |
| 2 | Jane | [email protected] | UK |
| 3 | Alice | [email protected] | France |
Ниже приведён пример использования оператора SELECT с предложением WHERE для извлечения только определённых данных из таблицы customers:
PHP / SQL — пример использования оператора SELECT с предложением WHERE для извлечения определённых данных из таблицы customers
SELECT name, email
FROM customers
WHERE country = 'USA';Приведённый оператор SELECT вернёт только строки, в которых столбец country равен USA. Результат будет следующим:
name | email
----------|----------------------
John | [email protected]Несколько условий
В предложении WHERE можно использовать несколько условий. Например, можно извлечь всех клиентов из таблицы customers, которые проживают в USA и имеют адрес электронной почты, заканчивающийся на example.com.
PHP / SQL — получение всех клиентов из таблицы customers, проживающих в USA и имеющих адрес электронной почты, заканчивающийся на example.com
SELECT name, email
FROM customers
WHERE country = 'USA'
AND email LIKE '%example.com';Приведённый оператор SELECT вернёт следующий результат:
name | email
----------|----------------------
John | [email protected]Для объединения нескольких условий в предложении WHERE можно использовать логические операторы AND и OR. При их совместном использовании группу OR следует заключать в скобки, чтобы приоритет выполнения соответствовал ожиданиям:
SELECT name, email
FROM customers
WHERE country = 'USA'
AND (name = 'John' OR name = 'Alice');Операторы сравнения и логические операторы
Условие condition в предложении WHERE строится из операторов. Вот наиболее часто используемые из них:
| Оператор | Значение | Пример |
|---|---|---|
= | Равно | country = 'USA' |
<> или != | Не равно | country <> 'UK' |
>, <, >=, <= | Больше / меньше | id >= 2 |
BETWEEN | В заданном включительном диапазоне | id BETWEEN 1 AND 3 |
IN | Совпадает с любым значением из списка | country IN ('USA', 'UK') |
LIKE | Поиск по шаблону (% = любые символы, _ = один символ) | email LIKE '%@example.com' |
IS NULL / IS NOT NULL | Проверка на отсутствие значения | email IS NOT NULL |
AND, OR, NOT | Объединение или отрицание условий | country = 'USA' AND id > 1 |
Несколько распространённых шаблонов:
-- Match several values without writing OR three times
SELECT name FROM customers WHERE country IN ('USA', 'UK', 'France');
-- Inclusive numeric range
SELECT name FROM customers WHERE id BETWEEN 1 AND 2;
-- Find rows where a value is missing (do NOT use = NULL — that never matches)
SELECT name FROM customers WHERE email IS NULL;Выполнение запроса WHERE из PHP
Заголовок страницы — «PHP MySQL», поэтому далее рассматривается часть, которая реально выполняется в PHP. Поскольку значение WHERE почти всегда поступает из пользовательского ввода (поле поиска, параметр URL), его нельзя напрямую конкатенировать в строку SQL — это открывает дверь для SQL-инъекций. Вместо этого используйте подготовленный запрос и передавайте значение как параметр.
Пример: фильтрация по стране с помощью подготовленного запроса PDO
<?php
$pdo = new PDO('mysql:host=localhost;dbname=shop;charset=utf8mb4', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// The user-supplied value never touches the SQL text directly.
$country = $_GET['country'] ?? 'USA';
$stmt = $pdo->prepare('SELECT name, email FROM customers WHERE country = ?');
$stmt->execute([$country]);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
echo $row['name'] . ' - ' . $row['email'] . "\n";
}Тот же запрос с использованием MySQLi выглядит следующим образом:
Пример: тот же запрос с MySQLi
<?php
$conn = new mysqli('localhost', 'user', 'password', 'shop');
$country = $_GET['country'] ?? 'USA';
$stmt = $conn->prepare('SELECT name, email FROM customers WHERE country = ?');
$stmt->bind_param('s', $country); // 's' = the parameter is a string
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['name'] . ' - ' . $row['email'] . "\n";
}Примечание по безопасности: всегда передавайте пользовательские данные через связанные параметры (PDO или MySQLi), никогда не строя SQL-строку вида
"... WHERE country = '$country'". Подготовленные запросы разделяют данные и код, что предотвращает SQL-инъекции.
Связанные темы
- PHP MySQL Select — основы
SELECT, на которых строится это предложение. - PHP MySQL Order By — сортировка строк, возвращаемых предложением
WHERE. - PHP MySQL Limit Data — ограничение количества возвращаемых отфильтрованных строк.
- PHP MySQL Prepared Statements — подробный разбор безопасного шаблона, использованного выше.