Слайд 1Работа с БД. SQL Инъекции. PDO.
Урок № 4
Слайд 2Добавляем данные
$query="INSERT INTO myTable (fio,gender,actor) VALUES ('Ivanov',1,'Bruce')";
if ($result=mysql_query($query)){
$id=mysql_insert_id();
}
else{
$id=-1;
}
if ($id
не выполнен id=".$id;
}
else{
echo "запись успешно добавлена id=".$id;
}
Слайд 3Удаляем данные
$deleted_id=2;
$query="DELETE FROM myTable WHERE id=".$deleted_id;
if ($result=mysql_query($query)){
$id=mysql_affected_rows();
}
else{
$id=-1;
}
if ($id
выполнен ";
}
else{
echo "вы успешно удалили ".$id." строк из таблицы";
}
Слайд 4Обновляем данные
$updated_id=4;
$query="UPDATE myTable SET actor='Williams',fio='Petrov' WHERE id=".$updated_id." LIMIT 1";
if ($result=mysql_query($query)){
$id=mysql_affected_rows();
}
else{
$id=-1;
}
if
($id
из таблицы";
}
Слайд 5Синтаксис запросов
$tablename=”myTable”;
$query="INSERT INTO `“.$tablename.”` …..”;
$field=“id”;
$query=“… WHERE `“.$field.”`= ….”
Слайд 6SQL инъекции. Суть проблемы
myScript.php?id=1
//листинг myScript.php
$id=$_GET[‘id’];
$query=“SELECT * FROM myTable WHERE id=”.$id
//вывод
на экран данных о пользователе
myScript.php?id=-1 UNION SELECT id,fio,gender, actor FROM
myTable WHERE id=-152
myScript.php?id=-1 UNION SELECT id,fio,gender, actor FROM myTable WHERE id=1
Слайд 7Простые меры безопасности
Проверяем входные данные
If (is_numeric($_GET[‘id’]))
Экранируем специальные символы
$name=mysql_real_escape_string($name);
$query=“SELECT *
FROM table WHERE name=”.$name
Не выводим никакой информации о структуре БД
Используем
FURL (Friendly URL)
Слайд 8Исключения
function inverse($x) {
if (!$x) {
throw new Exception('Деление на ноль.');
}
else return
1/$x;
}
Слайд 9Ловим исключение
try{
inverse(0);
}
catch(Exception $e){
echo "выброшено исключение:".$e->getmessage();
}
echo "
продолжаю работу";
$x=0;
$p=1/$x; //Warning: Division by
zero in …
inverse(0);//Fatal error: Uncaught exception 'Exception' with message 'Деление
на ноль.'
Слайд 10Класс PDO
Удобство работы с различными СУБД
Широкие возможности по защите от
SQL инъекций
mysql_query – deprecated (http://www.php.net/manual/ru/function.mysql-query.php)
Слайд 11Подключение к БД
$base="testbase";
$user="root";
$pswd="";
$DBH=new PDO("mysql:host=localhost;dbname=".$base,$user,$pswd);
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
Слайд 12Первый запрос к БД
try{//осуществлено подключение к бд
//допускаем явную ошибку
$DBH->prepare('DELECT name
FROM MyTable')->execute();
$DBH->prepare('SELECT fio FROM myTable')->execute();
}
catch(PDOException $e){
echo "Хьюстон, у нас
проблемы.";
file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}
Слайд 13Вставка данных
$STH=$DBH->prepare("INSERT INTO myTable (fio,gender,actor) values ('Иванов ПС',1,'Никулин')");
$STH->execute();
//вставка с плейсхолдерами
$data=array("Петрова
НА",2,"Клуни");
$STH=$DBH->prepare("INSERT INTO myTable (fio,gender,actor) values (?,?,?)");
$STH->execute($data);
execute();//вставка с плейсхолдерами$data=array("Петрова НА",2,"Клуни");$STH=$DBH->prepare("INSERT INTO myTable (fio,gender,actor) values (?,?,?)");$STH->execute($data);">
execute();//вставка с плейсхолдерами$data=array("Петрова НА",2,"Клуни");$STH=$DBH->prepare("INSERT INTO myTable (fio,gender,actor) values (?,?,?)");$STH->execute($data);" alt="Вставка данных$STH=$DBH->prepare("INSERT INTO myTable (fio,gender,actor) values ('Иванов ПС',1,'Никулин')");$STH->execute();//вставка с плейсхолдерами$data=array("Петрова НА",2,"Клуни");$STH=$DBH->prepare("INSERT INTO myTable (fio,gender,actor) values (?,?,?)");$STH->execute($data);">
Слайд 14Выборка
$STH=$DBH->query("SELECT * FROM myTable");
$STH->setFetchMode(PDO::FETCH_ASSOC);
while($row = $STH->fetch()) {
echo
"id=".$row['id']."\n";
echo "fio=".$row['fio'] . "\n";
echo "actor=".$row['actor']
. "\n";
echo "gender=".$row['gender'] . "\n";
echo "
";
}
Слайд 15Выборка с использованием плейсхолдеров
//именные плейсхолдеры
$STH=$DBH->prepare("SELECT * FROM myTable WHERE id=:id");
$STH->setFetchMode(PDO::FETCH_ASSOC);
$STH->bindValue(':id',5);
$STH->execute();
$row
= $STH->fetch();
Слайд 16Выборка с использованием плейсхолдеров
//Простые плейсхолдеры
echo "Простые плейсхолдеры
";
$STH=$DBH->prepare("SELECT * FROM myTable
WHERE actor=? AND gender=?");
$STH->setFetchMode(PDO::FETCH_ASSOC);
$STH->execute(array('Никулин',1));
Слайд 17Задачи
Создать форму для добавления новых пользователей в базу данных
Реализовать всё
на PDO и на mysql_query
Слайд 18Литература
http://habrahabr.ru/post/148151/
SQL injection для начинающих. Часть 1
http://www.php.net/manual/ru/
Безопасность>>Безопасность баз данных
http://habrahabr.ru/post/148701/
Защита от SQL-инъекций
в PHP и MySQL
vk.com/bsuweb