Как переписать старый код на PDO?
$avatar = mysql_fetch_array(query("SELECT id,ras FROM `gallery_foto` WHERE `id_user` = '$user' AND `avatar` = '1' LIMIT 1"));
Переписать его на php pdo подготовленые! Пишу в стандарте через задание параметров и prepare ошибка
Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]
Ответы (1 шт):
Автор решения: Ипатьев
→ Ссылка
Соединение
Пишем такой код и кладем его в файл pdo.php.
<?php
$host = '127.0.0.1';
$db = 'test';
$user = 'root';
$pass = '';
$port = "3306";
$charset = 'utf8mb4';
$options = [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::ATTR_EMULATE_PREPARES => false,
];
$dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
$pdo = new \PDO($dsn, $user, $pass, $options);
Выполнение запросов
- Все переменные в запросе заменить на плейсхолдеры. Это могут быть либо просто знаки вопроса, либо слова, начинающиеся с двоеточия
- Подготовить запрос с помощью prepare()
- Выполнить его с помощью execute(), передав сами переменные для запроса в виде массива.
- Для запросов, которые возвращают данные - получить из, с помощью одной из функций
fetch(),fetchAll()илиfetchColumn()
Переписанный код
Выполнив все эти правила, мы получим такой вот код для позиционных плейсхолдеров:
<?php
require 'pdo.php';
$sql = "SELECT id,ras FROM `gallery_foto` WHERE `id_user`=? AND `avatar`='1' LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->execute([$user]);
$avatar = $stmt->fetch();
и такой - для именованных:
<?php
require 'pdo.php';
$sql = "SELECT id,ras FROM `gallery_foto` WHERE `id_user`=:id AND `avatar`='1' LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->execute(['id' => $user]);
$avatar = $stmt->fetch();