PHP

Как перевести данный код цикла из кодировки Mysqli в PDO?

Вот исходный (рабочий) код:
Подключение к бд:
$host = 'localhost';
$user = 'admin';
$pass = '123456';
$db_name = 'shop';
$conn = new mysqli($host, $user, $pass, $db_name);
if ($conn->connect_error) {
die('Database connection error: ' . $conn->connect_error);
}
Рабочий запрос к бд:
$result = mysqli_query($conn, "SELECT * FROM `products` WHERE `visible`='1');
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_array($result);
do {...

Вот что я пытался сделать, но успеха не достиг:
Подключение к бд:
<?
$username = "admin";
$password = "123456";
$host = "localhost";
$db = "shop";
$charset = "utf8";
$dsn = "mysql:host=$hostname;dbname=$db;charset=$charset";
$opt = array (
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
);
$pdo = new PDO($dsn,$username,$password,$opt);
Вод запрос, который не получился:
$sql = "SELECT * FROM `products` WHERE `visible` = '1');
$Data = $pdo -> query($sql);
$users = $Data -> fetchAll();
if (PDOStatement::rowCount($sql) > 0) {
$row = $query->fetch(PDO::FETCH_BOTH($sql));
{ do
НЕ НАДО отдельно проверять, сколько строк получено - ты это и так узнаешь в процессе обработки результата запроса.
НЕ НАДО делать fetch() после fetchAll() - вызов fetchAll() УЖЕ прочитал ВСЕ строки результата запроса.

Всё делается намного проще:

foreach ($pdo->query($sql) as $row) {
// а вот тут что-то делаешь с $row
}

https://www.php.net/manual/ru/pdo.query.php

Если же параметризованный запрос, то:

$query = $pdo->prepare('SELECT * FROM `products` WHERE `visible` = :visible');
$query->execute(['visible' => 1]);
foreach ($query as $row) {
...

P.S. Если требуется подставить значения переменных в запрос, то делать это надо только параметризованными запросами, а не вписыванием значений непосредственно в тело запроса: это лучший способ защиты от SQL-инъекций.
Артем Медников
Артем Медников
63 393
Лучший ответ
Попробуйте такой код, если заработает можете усложнить (добавить обработку ошибок, проверять количество записей и т. п).

Подключение:
$host = 'localhost';
$user = 'admin';
$pass = '123456';
$db_name = 'shop';
$conn = new PDO("mysql:host=$host;dbname=$db_name", $user, $pass);

Запрос:
$result = $conn->query("SELECT * FROM `products` WHERE `visible`=1");
while($row = $result->fetch()) {
echo $row['product_name']; // product_name для примера, у вас имена столбцов другие
}

Если в запрос нужно передавать переменные, тогда такой вид:
$visible = 1;
$result= $db->prepare("SELECT * FROM products WHERE visible = :visible");
$result->bindParam(':visible', $visible, PDO::PARAM_INT); // если тип поля БД строкового типа, тогда нужно PDO::PARAM_STR
$result->execute();
while($row = $result->fetch()) {
// обработка строк
}
Толя Резепа
Толя Резепа
97 524