Фильтрация данных в MySQLi

Последнее обновление: 09.06.2021

Подобно тому, как мы получаем все данные из таблицы, мы можем применять фильтрацию выбирать данные по определенному критерию. Для фильтрации команде SELECT передается выражение WHERE, которая принимает названия столбцов их значения в качестве критерия фильтрации. Например, получение всех данные из таблицы Users, где id = 1:

SELECT * FROM Users WHERE id = 1

Однако если данные для фильтрации приходят извне, нам необходимо учитывать их потенциальную опасность. Рассмотрим получение данных на примере таблицы Users, созданной в прошлых, которая имеет следующее определение:

CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INTEGER)

Объектно-ориентированный стиль

Например, мы хотим получать в GET-запросе значение для id и по нему получать из базы данных нужные данные. Определим для этого следующий скрипт user.php:

<!DOCTYPE html>
<html>
<head>
<title>METANIT.COM</title>
<meta charset="utf-8" />
</head>
<body>
<?php
if(isset($_GET["id"]))
{
	$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
	if($conn->connect_error){
		die("Ошибка: " . $conn->connect_error);
	}
	$userid = $conn->real_escape_string($_GET["id"]);
	$sql = "SELECT * FROM Users WHERE id = '$userid'";
	if($result = $conn->query($sql)){
		if($result->num_rows > 0){
			foreach($result as $row){
				$username = $row["name"];
				$userage = $row["age"];
				echo "<div>
						<h3>Информация о пользователе</h3>
						<p>Имя: $username</p>
						<p>Возраст: $userage</p>
					</div>";
			}
		}
		else{
			echo "<div>Пользователь не найден</div>";
		}
		$result->free();
	} else{
		echo "Ошибка: " . $conn->error;
	}
	$conn->close();
}
?>
</body>
</html>

Здесь через запрос GET получаем параметр id - идентификатор пользователя, который надо получить из базы данных. Однако поскольку это значение приходит извне, к нему применяется метод real_escape_string(), который экранирует спецсимволы:

$userid = $conn->real_escape_string($_GET["id"]);

Для упрощения обращения к скрипту определим скрипт index.php, который будет выводить список пользователей с ссылкой на скрипт user.php:

<!DOCTYPE html>
<html>
<head>
<title>METANIT.COM</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
if($conn->connect_error){
	die("Ошибка: " . $conn->connect_error);
}
$sql = "SELECT id, name FROM Users";
if($result = $conn->query($sql)){
    echo "<table><tr><th>Имя</th><th></th></tr>";
	foreach($result as $row){
		echo "<tr>";
			echo "<td>" . $row["name"] . "</td>";
			echo "<td><a href='user.php?id=" . $row["id"] . "'>Подробнее</a></td>";
		echo "</tr>";
	}
	$result->free();
} else{
    echo "Ошибка: " . $conn->error;
}
$conn->close();

echo "</table>";
?>
</body>
</html>

Таким образом, при обращении к скрипту index.php браузер отобразит список пользователей, а нажав на ссылку рядом с каждым пользователем, мы перейдем к подробному описанию:

Фильтрация данных из MySQL в PHP с помощью MySQLi

Процедурный стиль

Скрипт user.php:

<!DOCTYPE html>
<html>
<head>
<title>METANIT.COM</title>
<meta charset="utf-8" />
</head>
<body>
<?php
if(isset($_GET["id"]))
{
	$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
	if (!$conn) {
	  die("Ошибка: " . mysqli_connect_error());
	}
	$userid = mysqli_real_escape_string($conn, $_GET["id"]);
	$sql = "SELECT * FROM Users WHERE id = '$userid'";
	if($result = mysqli_query($conn, $sql)){
		if(mysqli_num_rows($result) > 0){
			foreach($result as $row){
				$username = $row["name"];
				$userage = $row["age"];
				echo "<div>
						<h3>Информация о пользователе</h3>
						<p>Имя: $username</p>
						<p>Возраст: $userage</p>
					</div>";
			}
		}
		else{
			echo "<div>Пользователь не найден</div>";
		}
		mysqli_free_result($result);
	} else{
		echo "Ошибка: " . mysqli_error($conn);
	}
	mysqli_close($conn);
}
?>
</body>
</html>

Скрипт index.php:

<!DOCTYPE html>
<html>
<head>
<title>METANIT.COM</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
if (!$conn) {
  die("Ошибка: " . mysqli_connect_error());
}
$sql = "SELECT id, name FROM Users";
if($result = mysqli_query($conn, $sql)){
    echo "<table><tr><th>Имя</th><th></th></tr>";
	foreach($result as $row){
		echo "<tr>";
			echo "<td>" . $row["name"] . "</td>";
			echo "<td><a href='user.php?id=" . $row["id"] . "'>Подробнее</a></td>";
		echo "</tr>";
	}
	echo "</table>";
mysqli_free_result($result);
} else{
    echo "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
</body>
</html>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850