Рабочая тетрадь(4)
.pdf
$sql = "SELECT id, name, email FROM users";
$stmt = $db -> query($sql);
$stmt -> setFetchMode(PDO::FETCH_NUM);
$row = $stmt -> fetch();
class User {public $id, $name, $email;}
$user = new User();
$stmt -> setFetchMode(PDO::FETCH_INTO, $user);
$stmt ->
setFetchMode(PDO::FETCH_CLASS, "User", $args);
$stmt -> setFetchMode(
PDO::FETCH_CLASS |PDO::FETCH_PROPS_LATE, "User", $args);
$sql = 'SELECT email FROM users
WHERE id = :id AND name = :name';
$stmt = $db -> prepare($sql);
$stmt -> execute(
array(
':id' => 5,
':name' => 'John'));
$john = $stmt->fetchAll();
$stmt -> execute(
array(
'id' => 6,
'name' => 'Mike')); $mike = $stmt->fetchAll();
$sql = 'SELECT email FROM users
WHERE id = ? AND name = ?';
$stmt = $db -> prepare($sql);
$stmt -> execute(array(5, 'John'));
$john = $stmt->fetchAll();
$stmt -> execute(array(6, 'Mike'));
$mike = $stmt->fetchAll();
$id = 5; $name = 'John';
Для 'WHERE id = :id AND name = :name'
$stmt = $db -> prepare($sql);
$stmt -> bindParam(':id', $id, PDO::PARAM_INT);
$stmt -> bindParam(':name', $name, PDO::PARAM_STR, 25);
$stmt -> execute();
Для 'WHERE id = ? AND name = ?'
$stmt = $db -> prepare($sql);
$stmt -> bindParam(1, $id, PDO::PARAM_INT);
$stmt -> bindParam(2, $name, PDO::PARAM_STR, 25);
$stmt -> execute();
$id = 5; $name = 'John';
$stmt = $db -> prepare('CALL getEmail(?,?,?)');
Параметр IN
$stmt -> bindParam(1, $id, PDO::PARAM_INT);
Параметр INOUT
$stmt -> bindParam(2, $name,
PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 25);
Параметр OUT
$stmt -> bindParam(3, $email, PDO::PARAM_STR, 25);
$stmt -> execute();
print("User: $name : E-mail: $email");
$id = 5;
Вариант 1
$db -> query('CALL getEmail($id, @name, @email)');
$result = $db -> query('SELECT @name, @email');
Вариант 2
$stmt = $db -> prepare('CALL getEmail(:id, @name,
@email)');
$stmt -> bindParam(':id', $id, PDO::PARAM_INT);
$stmt -> execute();
$result = $db -> query('SELECT @name, @email');
$arr = $result -> fetch();
echo $arr[@name] . ':' . $arr[@email];
$sql = 'SELECT id, name, email FROM users';
$stmt = $db -> prepare($sql);
$stmt -> execute();
$stmt -> bindColumn(1, $id);
$stmt -> bindColumn(2, $name);
$stmt -> bindColumn('email', $email);
while($row = $stmt -> fetch(PDO::FETCH_BOUND) echo "$id : $name : $email\n";
try {
$db -> beginTransaction();
$db -> exec("INSERT INTO users
VALUES(1, 'John', 'Smith')"); $db -> exec("INSERT INTO users
VALUES(2, 'Mike', 'Doe')");
$db->commit();
}catch (PDOException $e) { $db -> rollBack();
}
Лабораторная работа 3.2
Использование транзакций
Упражнение 1: Использование транзакции в конструкторе класса
•В текстовом редакторе откройте файл news\NewsDB.class.php
•В конструкторе класса создайте транзакцию при создании и заполнении таблиц базы данных
•Транзакция должна обеспечивать создание базы данных, создание таблиц и заполнение таблицы category
•В браузер должно выводится сообщение о невозможности создания базы данных
•Сохраните файл news\NewsDB.class.php
•Сделайте копию базы данных news.db и удалите оригинал
•Запустите браузер
•В адресной строке наберите http://mysite.local/news/news.php
•Вы должны увидеть страницу с HTML-формой без новостей
•Если есть ошибки, найдите и исправьте их
•Удалите базу данных news.db
•В текстовом редакторе откройте файл news\NewsDB.php
•Сделайте ошибку в запросе при заполнении таблицы category
•Сохраните файл news\NewsDB.php
•Запустите браузер
•В адресной строке наберите http://mysite.local/news/news.php
•Вы должны получить сообщение о невозможности создания базы данных
•Обратите внимание на то, что файл news.db создается, но нулевой длины
•В конструкторе класса NewsDB внесите изменение в условие, которое учитывает не только наличие файла базы данных, но и его размер
$db = new PDO('sqlite:db');
$sql = "SELECT type, data FROM images WHERE id=?";
$stmt = $db -> prepare($sql);
$stmt -> execute(array($_GET['id']));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
header("Content-Type: $type");
fpassthru($lob);
