Полный цикл в digital

Фильтрация данных 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:

Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг