Фильтрация данных MySQLi
Подобно тому, как мы получаем все данные из таблицы, мы можем применять фильтрацию выбирать данные по определенному
критерию. Для фильтрации команде 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>hmarketing.ru</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>hmarketing.ru</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
браузер отобразит список пользователей, а
нажав на ссылку рядом с каждым пользователем, мы перейдем к подробному описанию:
Процедурный стиль
Скрипт user.php
:
<!DOCTYPE html>
<html>
<head>
<title>hmarketing.ru</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>hmarketing.ru</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>