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