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

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

В прошлой статье применялся метод 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>METANIT.COM</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>METANIT.COM</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:

SELECT и WHERE в MySQL и PHP и pdo
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850