<?php
/**
* Защита от sql инъекций при помощи pdo_mysql
* автор: Nc_Soft
* 19.12.10
*/
$host = 'localhost'; //хост
$db = 'database_name'; //база данных
$user = 'root'; //юзер
$password = 'password'; //пароль
//соединяемся
$db = new PDO("mysql:host=$host;dbname=$db", $user, $password,
array(PDO
::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
//делаем sql запрос на создание таблицы (id|user|time)
$q = $db->prepare("CREATE TABLE IF NOT EXISTS `test` (
`id` int(10) unsigned NOT NULL auto_increment,
`user` varchar(20) NOT NULL,
`time` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ");
//выполняем запрос
$q->execute();
//теперь давайте добавим запись
$q = $db->prepare("INSERT INTO test SET user=? ");
$q->execute(array('имя1'));
/*
в таблице добавилась запись
обратите внимание, что я не использовал никакие функции для фильтрации
(mysql_real_escape_string и подобные), просто обозначит placeholder куда вставить
значение через ?, а потом при execute задал значение массивом
*/
//давайте теперь изменим добавленную запись
//получаем последний добавленный ид
$id = $db->lastInsertId();
//запрос на update
$db->prepare("UPDATE test SET user=? WHERE id=? ")->execute(array("новое ' имя", $id));
/*
Обратите внимание, сейчас я воспользовался цепочкой вызовов ->()->
чтобы не заводить переменную $q как в примерах выше.
Параметры в массиве должны идти в строгом порядке, как в запросе,
действительно, будет нелепо перепутать id и name местами ;)
Даже не смотря на то, что в параметре присутствует кавычка запрос выполянется нормально,
pdo все экранирует самостоятельно.
*/
//если не нравятся ? или хотите изменить порядок, можно заюзать именнованные параметры
$db->prepare("INSERT INTO test SET user=:user ")->execute(array(':user'=>'новый юзер')); /*
Теперь массив с параметрами не такой безликий как раньше, какой способ задания параметров
выбрать решайте сами
*/
//Ну и напоследок: как извлекать записи
$q = $db->prepare("SELECT * FROM test");
$q->execute();
$data = $q->fetchAll();