METANIT.COM

Примеры использования PDO MySQL

Ниже приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и удаление данных. Подробнее о методах PDO можно узнать на php.net.

Для примеров используется таблица `category` с полями `id` , `name` и `parent` .

Подключение к серверу MySQL

$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');

Четвертым параметром конструктора PDO можно указать параметры подключения, например SQL запрос который будет выполнен сразу после подключения:

$dbh = new PDO(' mysql:dbname=db_name;host=localhost', 'логин', 'пароль', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'") );

Чтобы отследить ошибку подключения к БД используется исключение:

try < $dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль'); >catch (PDOException $e) < die($e->getMessage()); >
SQLSTATE[HY000] [1045] Access denied for user 'логин'@'localhost' (using password: YES)

Выборка из БД

Выборка одной записи

PDO позволяет использовать в запросах псевдопеременные чтобы исключить SQL инъекции. В самом запросе в место данных указывается ? или :id , а в методе execute() указываются реальные значения этих переменных.

$sth = $dbh->prepare("SELECT * FROM `category` WHERE `id` = ?"); $sth->execute(array('21')); $array = $sth->fetch(PDO::FETCH_ASSOC); print_r($array);
$sth = $dbh->prepare("SELECT * FROM `category` WHERE `id` = :id"); $sth->execute(array('id' => '21')); $array = $sth->fetch(PDO::FETCH_ASSOC); print_r($array);
Array ( [id] => 21 [parent] => 3 [name] => Хурма ) 

Выборка всех записей таблицы

Данный пример получает всю таблицу в виде ассоциативного массива:

$sth = $dbh->prepare("SELECT * FROM `category` ORDER BY `name`"); $sth->execute(); $array = $sth->fetchAll(PDO::FETCH_ASSOC); print_r($array);
Array ( [0] => Array ( [id] => 16 [parent] => 3 [name] => Абрикос ) [1] => Array ( [id] => 28 [parent] => 3 [name] => Авокадо ) . )

Получить значение поля одной записи

$sth = $dbh->prepare("SELECT `name` FROM `category` WHERE `id` = ?"); $sth->execute(array('21')); $value = $sth->fetch(PDO::FETCH_COLUMN); echo $value; // Выведет "Хурма"

Получение всех значений одного столбца таблицы

Пример получает все значения поля `name` из таблицы `category` .

$sth = $dbh->prepare("SELECT `name` FROM `category`"); $sth->execute(); $array = $sth->fetchAll(PDO::FETCH_COLUMN); print_r($array);
Array ( [0] => Мороженое [1] => Овощи [2] => Фрукты [3] => Ягоды [4] => Грибы [5] => Морепродукты [6] => Смеси . )

Получение структуры таблицы

$sth = $dbh->prepare("SHOW COLUMNS FROM `category`"); $sth->execute(); $array = $sth->fetchAll(PDO::FETCH_ASSOC); print_r($array);
Array ( [0] => Array ( [Field] => id [Type] => int(10) unsigned [Null] => NO Php pdo insert пример => PRI [Default] => [Extra] => auto_increment ) [1] => Array ( [Field] => parent [Type] => int(11) unsigned [Null] => NO Php pdo insert пример => [Default] => 0 [Extra] => ) [2] => Array ( [Field] => name [Type] => varchar(255) [Null] => NO Php pdo insert пример => [Default] => [Extra] => ) )

Добавление записей в БД

$sth = $dbh->prepare("INSERT INTO `category` SET `parent` = :parent, `name` = :name"); $sth->execute(array('parent' => 1, 'name' => 'Виноград')); // Получаем id вставленной записи $insert_id = $dbh->lastInsertId();

Изменение записей

$sth = $dbh->prepare("UPDATE `category` SET `name` = :name WHERE `id` = :id"); $sth->execute(array('name' => 'Виноград', 'id' => 22));

Удаление из БД

$count = $dbh->exec("DELETE FROM `category` WHERE `parent` = 1"); echo 'Удалено ' . $count . ' строк.';

Или метод c псевдопеременными:

$sth = $dbh->prepare("DELETE FROM `category` WHERE `parent` = :parent"); $sth->execute(array('parent' => 1));

Обработка ошибок

В PDO есть метод errorInfo() который возвращает сведенья об ошибке последнего запроса.

// Таблицы `category_new` нет в БД. $sth = $dbh->prepare("INSERT INTO `category_new` SET `parent` = :parent, `name` = :name"); $sth->execute(array('parent' => 1, 'name' => 'Виноград')); $info = $sth->errorInfo(); print_r($info);
Array ( [0] => 42S02 [1] => 1146 [2] => Table 'database.category_new' doesn't exist )

Комментарии 1

О

Функция debugDumpParams объекта PDOStatement используется для вывода параметров подготовленного оператора. Это может быть полезно для отладки и устранения неполадок, поскольку позволяет увидеть точный SQL-запрос, который будет выполнен, а также значения любых установленных заполнителей.
Например, рассмотрим следующий код:

$sth = $dbh->prepare(‘SELECT * FROM users WHERE name = :name AND age = :age’);
$sth->bindParam(‘:name’, $name);
$sth->bindParam(‘:age’, $age);
$name = ‘John’;
$age = 35;
$sth->debugDumpParams();

SQL: [114] SELECT * FROM users WHERE name = :name AND age = :age
Params: 2
Key: Name: [5] :name
paramno=-1
name=[5] «:name»
is_param=1
param_type=2
Key: Name: [4] :age
paramno=-1
name=[4] «:age»
is_param=1
param_type=2

Вывод показывает SQL-запрос с заполнителями и значениями заполнителей (в данном случае :name — «John», а :age — 35). Это может быть полезно для проверки того, что в запросе используются правильные значения, или для выявления проблем с запросом или заполнителями.
Надеюсь, это поможет! Дайте знать, если у вас появятся вопросы.

Авторизуйтесь, чтобы добавить комментарий.

Источник

Php pdo insert пример

Для добавления данных в БД MySQL применяется sql-команда INSERT , которая имеет следующий синтаксис:

INSERT INTO название_таблицы (столбец1, столбец2, столбецN) VALUES ( значение1, значение2, значениеN)

Данная команда также выполняется методом exec() объекта PDO. Стоит отметить, что для sql-команд INSERT , UPDATE и DELETE метод exec() возвращает количество затронутных командой строк (добавленных, измененных или удаленных). Таким образом, мы можем узнать сколько строк было добавлено.

Сначала рассмотрим простейшее добавление одного объекта в БД. Для примера возьмем созданную в прошлой теме базу данных «testdb1» и созданную в ней таблицу Users со следующим определением:

CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INTEGER)

И для добавления определим следующий скрипт PHP:

exec($sql); echo "В таблицу Users добавлено строк: $affectedRowsNumber"; > catch (PDOException $e) < echo "Database error: " . $e->getMessage(); > ?>

Команда на добавление здесь выглядит следующим образом:

"INSERT INTO Users (name, age) VALUES ('Tom', 37)"

То есть в столбец name добавляется строка «Tom», а в столбец age — число 37. Для столбца id не добавляется никакого значения, потому что при создании таблицы для него указан параметр AUTO_INCREMENT — то есть значение этого столбца у каждой добавляемой строки будет автоматически увеличиваеться по сравнению с предыдущей на единицу.

При добавлении мы получаем количество добавленных строк в переменую $affectedRowsNumber и затем выводим ее значение в браузере. Поэтому при успешном добавлении мы увидим

Множественное добавление

Также мы можем добавить сразу несколько объектов:

exec($sql); echo "В таблицу Users добавлено строк: $affectedRowsNumber"; > catch (PDOException $e) < echo "Database error: " . $e->getMessage(); > ?>

Здесь в таблицу добавляется три строки. Соответственно в браузере мы увидим:

Добавление данных из формы HTML

В большинстве случаев добавляемые данные будут приходить из вне, например, присылаться в запросе пользователя. Рассмотрим добавление данных, отправленных из формы HTML. Для этого определим следующий скрипт:

     exec($sql); // если добавлена как минимум одна строка if($affectedRowsNumber > 0 ) < echo "Data successfully added: name=$username age= $userage"; >> catch (PDOException $e) < echo "Database error: " . $e->getMessage(); > > ?> 

Create a new User

User Name:

User Age:

Здесь мы проверяем, пришли ли с сервера данные в POST-запросе, которые имеют ключи «username» и «userage»:

if (isset($_POST["username"]) && isset($_POST["userage"])) 

Если эти данные имеются, то есть был отправлен post-запрос с данными на добавление, то мы получаем эти данные в переменные и добавляем их в бд.

$sql = "INSERT INTO Users (name, age) VALUES ('$username', $userage)";

Если была добавлена строка, то есть метод exec() возвратил число больше нуля, то выводим пользователю соответствующее сообщение.

После кода php собственно определена форма на добавление данных с помощью post-запроса.

Запустим скрипт. Введем в форму данные и нажмем на кнопку:

Insert data in PHP and PDO in MySQL

И данные будут добавлены. Вроде все хорошо. Однако здесь есть большой недостаток.

Параметризация запросов

Недостаток выше приведенного скрипа заключается в том, что мы никак не констролируем присылаемые данные и сохраняем их в базу данных как есть. Что несет потенциальную угрозу безопасности, особенно при добавлении строк типа "; DELETE FROM `Users`; -- . Кроме того, в ряде случае может быть проблематично добавить даже безопасные данные, например, строку, которая содержит одинарную кавычку, типа "Tom O'Brian".

Для решения этих проблем PDO предлагает параметризацию запросов с помощью применения заранее подготовленных выражений - prepared statement . Выражения prepared statement вместо жестко установленных значений или переменных принимают параметры, которые не привязаны к конкретным значениям. Эти выражения prepared statement посылаются серверу базы данных до того, как станут известны используемые данные, что позволяет серверу приготовить их к выполнению, но при этом они не выполняются. А когда пользователь присылает данные - параметры заменяются пришедшими данными, и выражение prepared statement выполняется.

Перепишем предыдущий пример с использованием параметров:

     prepare($sql); // привязываем параметры к значениям $stmt->bindValue(":username", $_POST["username"]); $stmt->bindValue(":userage", $_POST["userage"]); // выполняем prepared statement $affectedRowsNumber = $stmt->execute(); // если добавлена как минимум одна строка if($affectedRowsNumber > 0 ) < echo "Data successfully added: name=" . $_POST["username"] ." age= " . $_POST["userage"]; >> catch (PDOException $e) < echo "Database error: " . $e->getMessage(); > > ?> 

Create a new User

User Name:

User Age:

В SQL-выражении теперь применяются параметры:

$sql = "INSERT INTO Users (name, age) VALUES (:username, :userage)";

:username и :userage - это названия параметров. Причем они начинаются с символа двоеточия :.

Само выражение prepared statement создается с помощью метода prepare() объекта PDO, в который передается выполняемая sql-команда:

Фактически здесь создается объект PDOStatement , который сохраняется в переменную $stmt .

Чтобы связать параметр с конкретным значением у объекта PDOStatement вызывается метод bindValue() . Первый параметр этого метода - собственно параметр из sql-команды, а второй параметр - передаваемое ему значение.

$stmt->bindValue(":username", $_POST["username"]);

Так, в данном случае параметр :username привязывается к значению из $_POST["username"]

Причем привязка может производиться и к конкретным значениям и обычным переменным, например:

$user = "Tom" // привязка к переменной $user $stmt->bindValue(":username", $user);

Для выполнения sql-выражения у объекта PDOStatement вызывается метод execute() , который для команды INSERT возвращает число добавленных строк.

Передача значений параметрам через массив по имени

В примере выше для параметризации применялся метод bindValue() :

$sql = "INSERT INTO Users (name, age) VALUES (:username, :userage)"; $stmt = $conn->prepare($sql); // привязываем параметры к значениям $stmt->bindValue(":username", $_POST["username"]); $stmt->bindValue(":userage", $_POST["userage"]); // выполняем prepared statement $affectedRowsNumber = $stmt->execute();

Но есть и другой способ привязки параметров к значениям - мы можем передать в метод execute() параметры и их значения в виде ассоциативного массива:

$sql = "INSERT INTO Users (name, age) VALUES (:username, :userage)"; $stmt = $conn->prepare($sql); // через массив передаем значения параметрам по имени $rowsNumber = $stmt->execute(array(":username" => $_POST["username"], ":userage" => $_POST["userage"]));

В этом случае названия параметров являются ключами.

Передача значений параметрам через массив по позиции

Третий способ привязки значений к параметрам представляет передачу значений по позиции:

$sql = "INSERT INTO Users (name, age) VALUES (?, ?)"; $stmt = $conn->prepare($sql); // через массив передаем значения параметрам по позиции $rowsNumber = $stmt->execute(array($_POST["username"], $_POST["userage"]));

В этом случае вместо названий параметров применяются знаки вопроса ? . Для передачи этим параметрам значений в метод execute() также передается массив. Первое значение массива привязывается к первому параметру (условно добавляется вместо первого знака вопроса), второе значение привязывается ко второму параметру и т.д.

Источник

Читайте также:  Файл result modifier php
Оцените статью