Archive for the ‘PDO’ Category

PDO::exec

Tuesday, January 13th, 2009

класс быстрой команды, возвращает только два типа данных это количество отработанных строк и последний id

$count = $dbh->exec("insert into test_table (name, ints) values ('Ira', 10);");
echo $dbh->lastInsertId();
echo "Обработано $count строк";

PDO - подсчёт строк

Friday, February 15th, 2008

Если есть строки то их надо считать

$sql = "SELECT * FROM books";
$total = getRowCount($sql); 
$q = $conn->query($sql);
$q->setFetchMode(PDO::FETCH_ASSOC);
echo "Total: $total"; 
while($r = $q->fetch()){
...
} 

PDO загрузка изображений

Thursday, February 14th, 2008

Помимо чисел и строк в базу можно загружать и избражения, я таким редко пользуюсь но раз есть то надо расказать.
Загрузка:

$blob = fopen('/path/to/file.jpg', 'rb');
$stmt = $conn->prepare("INSERT INTO images(data) VALUES(:img)");
$stmt->bindParam(':img', $blob, PDO::PARAM_LOB);
$stmt->execute();

И вывод:

$id = (int)$_GET['id'];
$stmt = $db->prepare("SELECT data FROM images WHERE id=$id");
$stmt->execute();
$stmt->bindColumn(1, $blob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
$data = stream_get_contents($blob);

PDO - bing perl like

Tuesday, January 22nd, 2008

Еще один способ работы в PDO это bind, который похож на аналогичную работу в perl

$name='u00009_mymans';
$id=1;

$dbh = new PDO("mysql:dbname=rustest;host=localhost",
 "rus", "747737");
$stmt = $dbh->prepare("select * from test_table
 where name=:name and id=:id");

$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':name', $name, PDO::PARAM_STR);

$stmt->execute();

$result = $stmt->fetchAll();

foreach($result as $row){
    echo $row['ints'].'';
}

Вроде все понятно, но вот на что стоит обратить внимание так это на PDO::PARAM_STR и PDO::PARAM_INT они определяют тип входнях данных и делают работу которую раньше выполнял mysql_real_escape_string

$name="ru'sl\"an";
//DBI
$sql = "insert into test_table (name, ints) Values ('".
mysql_real_escape_string($name)."', 35)";
//PDO
$stmt = $dbh->prepare("insert into test_table (name, ints)
Values (:name, 25)");
$stmt->bindParam(':name', $name, PDO::PARAM_STR);


id | name | ints
4 | ru'sl"an | 25

PDO - свежий id

Friday, January 18th, 2008

Старый добрый mysql_insert_id() в PDO не пропал, теперь он работает так:

$dbh->exec("insert into test_table (name, ints) values ('Ira', 10);");
echo $dbh->lastInsertId();

Первое поле в таблице id стоит на auto_increment

PS В самом mysql это можно получить через select LAST_INSERT_ID();

PDO - работа с объектами

Saturday, January 12th, 2008

До это момента знакомство с PDO было на уровне стандартного драйвера, увидели как делать то, что старый драйвер и так умел, а теперь о возможностях за которые новый драйвер и завется новым.
И одна из таких возможностей это выдавать не масив вывода а объект вывода.

$db = new PDO(...);
$stm = $db->query("select * from test_table");
$obj = $stm->fetch(PDO::FETCH_OBJ);

и все, теперь объект $obj содержит нужные нам данные

echo $obj->id; // 1
echo $obj->name; // u00009_mymans

Главное обратите внимание как быстро и без лишних тело движений. Но пока не стоит раслабляться, потому что впереди еще один хук.

Что если нам не просто нужны данные ввиде класса. Создадим простой класс с одним методом.

class users{
 public function getFullname(){
  echo $this->firstname . ' ' . $this->lastname;
 }
}

а теперь

$db = new PDO(...);
$stm = $db->query("select firstname, lastname from users ...");
$user = $stm->fetchObject('users');

а теперь

echo $user->getFullname();

Конечно такую операцию мог выполнить и mysql, версию по сложнее придумаете сами. Впрочем нам не обезательно вызывать метод, надо просто переписать немного класс

class users{
 public $fullname;
 function __construct(){
   $this->fullname = $this->firstname . ' ' . $this->lastname;
 }
}

и теперь не меняя блок кода с запросом

echo $user->$fullname;

Когда PDO создает экземпляр класса он автоматом вызывает конструктор который в свою очередь может обрабатывать переменные.

PDO - быстрый query

Friday, January 11th, 2008

У PDO несколько способов получить данные из базы, какой из них использовать зависит от ситуации. Для вывода табличных данных подойдет query

$db = new PDO(...);
 foreach($db->query("select * from test_table",
    PDO::FETCH_BOTH) as $row){
  print_r($row);
 }

Без PDO::FETCH_BOTH можно обойтись, он отвечает за состояние вывода, так называемое FetchMode, без него как впрочем и с ним, вывод будет следующим

    [id] => 1
    [0] => 1
    [name] => u00009_mymans
    [1] => u00009_mymans
    [ints] => 15
    [2] => 15

но если использовать варианты:
PDO::FETCH_NUM

    [0] => 1
    [1] => u00009_mymans
    [2] => 15

PDO::FETCH_ASSOC или PDO::FETCH_NAMED

    [id] => 1
    [name] => u00009_mymans
    [ints] => 15

PDO::FETCH_COLUMN, n - номер колонки, например 1

    u00009_mymans

PDO - Проверка поддержки драйвера

Friday, January 11th, 2008

Если проект поддерживает несколько баз данных, то, это удобная возможность каккие из них поддерживает PDO с помошью метода getAvailableDrivers()
Например на поддержку mysql

if (array_search('mysql', PDO::getAvailableDrivers())){

Или получить весть список.

foreach(PDO::getAvailableDrivers() as $driver){
	    echo $driver.'';
}

PDO - PHP Data Object

Thursday, January 10th, 2008

Начиная с версии 5.1 в php появился абстрактный доступа к базам данных PDO. Мнения протеворечивые, одни хвалят другие ругают, но судя по настойчивости разработчиков старые драйвера могут уступить вскоре место новому.
Соединение с базой

try {
 $db = new PDO("mysql:dbname=dbname;host=host", "user", "passwd");
} catch (PDOException $e) {
 echo 'Ошибка соединения: ' . $e->getMessage();
}