Как переписать старый код на 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);

Выполнение запросов

  1. Все переменные в запросе заменить на плейсхолдеры. Это могут быть либо просто знаки вопроса, либо слова, начинающиеся с двоеточия
  2. Подготовить запрос с помощью prepare()
  3. Выполнить его с помощью execute(), передав сами переменные для запроса в виде массива.
  4. Для запросов, которые возвращают данные - получить из, с помощью одной из функций 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();
→ Ссылка