Фильтрация данных PDO
В прошлой статье применялся метод query()
для получения всех данных из БД. Но что, если нам надо
получить не все, а какие-то определенные данные, которые овечают некоторому критерию,
иными словами, произвести фильтрацию данных. Например, возьмем использовавшуюся в прошлых темах таблицу Users:
CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INTEGER)
Она имеет столбец id
, и мы хотим получить определенный объект по id
. На первый взгляд мы могли бы определить следующий код:
$sql = "SELECT * FROM Users WHERE id = 1";
$result = $conn->query($sql);
Для фильтрации команде SELECT передается выражение WHERE
, которая принимает названия столбцов
их значения в качестве критерия фильтрации. То есть, здесь мы получаем строке, где id = 1
.
Однако если данные для фильтрации приходят извне, например, значение для столбца id
, то опять же, как и в случае с
добавлением, мы сталкиваемся с потенциальной уязвимостью кода. И также, как и при добавлении, в этом случае лучше использовать параметризацию и prepared statements
.
Например, мы хотим получать в GET-запросе значение для id
и по нему получть из базы данных нужные данные. Определим для этого следующий скрипт user.php
:
<!DOCTYPE html>
<html>
<head>
<title>hmarketing.ru</title>
<meta charset="utf-8" />
</head>
<body>
<?php
if(isset($_GET["id"])) {
try {
$conn = new PDO("mysql:host=localhost;dbname=testdb1", "root", "mypassword");
$sql = "SELECT * FROM Users WHERE id = :userid";
$stmt = $conn->prepare($sql);
// привязываем значение параметра :userid к $_GET["id"]
$stmt->bindValue(":userid", $_GET["id"]);
// выполняем выражение и получаем пользователя по id
$stmt->execute();
if($stmt->rowCount() > 0){
foreach ($stmt as $row) {
$username = $row["name"];
$userage = $row["age"];
echo "<div>
<h3>Информация о пользователе</h3>
<p>Имя: $username</p>
<p>Возраст: $userage</p>
</div>";
}
}
else {
echo "Пользователь не найден";
}
}
catch (PDOException $e) {
echo "Database error: " . $e->getMessage();
}
}
?>
</body>
</html>
Для выполнения запроса к БД вначале создаем prepared statement
, которое использует параметр userid
,
привязанный к значению $_GET["id"]
:
$sql = "SELECT * FROM Users WHERE id = :userid";
$stmt = $conn->prepare($sql);
$stmt->bindValue(":userid", $_GET["id"]);
Далее у полученного объекта PDOStatement
вызываем метод execute()
, который выполняет запрос к бд:
$stmt->execute();
После выполнения команды SELECT
этот объект содержит полученные из БД данные, которые мы можем перебрать
с помощью цикла:
if($stmt->rowCount() > 0) {
foreach ($stmt as $row) {
$username = $row["name"];
$userage = $row["age"];
}
При этом с помощью метода rowCount()
мы можем узнать количество возвращенных строк. Получение данных
столбцов строки производится как и было описано выше для
простого запроса SELECT
. Получив данные столбцов в переменные, мы можем затем что-то с ними сделать, например,
вывести их значения на страницу.
Чтоб было проще обращаться к скрипту user.php и передавать ему id
, определим скрипт index.php
,
который будет выводить список объектов:
<!DOCTYPE html>
<html>
<head>
<title>hmarketing.ru</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=testdb1", "root", "mypassword");
$sql = "SELECT id, name FROM Users";
$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>";
}
echo "</table>";
}
catch (PDOException $e) {
echo "Database error: " . $e->getMessage();
}
?>
</body>
</html>
Здесь все объекты из базы данных выводятся в таблицу, где второй столбец содержит ссылку на скрипт
user.php
, которому передается соответствующее значение id
. В итоге по нажатию на эту ссылку мы перейдем к описанию объекта по id: