$DBH = new PDO("mysql:host=localhost;dbname=DB_NAME;charset=utf8", "DB_USER", "DB_PASW");
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//$DBH->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
//$DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
global $DBH;
try
{
$DBH->beginTransaction(); // TRUE
// Insert
$u = $DBH->prepare('INSERT INTO table1 (data1,data2) VALUES (:data1,:data2)');
$u->execute(array(':id' => $id, ':data1' => $data1, ':data2' => $data2)); // Вариант для одиночного запроса
//$u->bindParam(':data1', $data1, PDO::PARAM_INT); // Вариант для многократного повторения запроса
//$u->bindParam(':data2', $data2, PDO::PARAM_STR);
//foreach(...)
//{
// $id = ...; $data1 = ...; $data2 = ...;
// if (!$u->execute())
// exit('DB insert fail'); // Error
//}
$id = $DBH->lastInsertId();
// Read
// $r = $DBH->query('SELECT * FROM table1 WHERE id=1'); // Одиночный запрос без изменяемых параметров
$r = $DBH->prepare('SELECT * FROM table1 WHERE id=:id'); // Одиночный запрос с параметрами
$r->execute(array(':id' => $id)); // Вариант для одиночного запроса с параметрами
//$r->bindParam(':id', $id, PDO::PARAM_INT); // Вариант для многократного повторения запроса
//foreach(...) { $id = ...; $r->execute(); /*fetch*/; ...; }
if ($r->rowCount() !== 1)
exit('DB read fail'); // Error
while ($d = $r->fetch(PDO::FETCH_ASSOC))
continue;
// $d = $r->fetchAll(PDO::FETCH_ASSOC); // Установить LIMIT [<offset>,]<count> (при подстановке ставить PARAM_INT)
// Update
$u = $DBH->prepare('UPDATE table1 SET data=:data WHERE id=:id');
$u->execute(array(':id' => $id, ':data' => $data)); // Вариант для одиночного запроса
//$u->bindParam(':id', $id, PDO::PARAM_INT); // Вариант для многократного повторения запроса
//$u->bindParam(':data', $data, PDO::PARAM_STR);
//foreach(...)
//{
// $id = ...; $data = ...;
// if (!$u->execute())
// exit('DB update fail'); // Error
//}
// Delete
$u = $DBH->prepare('DELETE FROM table1 WHERE id=:id');
$u->execute(array(':id' => $id)); // Вариант для одиночного запроса
//$u->bindParam(':id', $id, PDO::PARAM_INT); // Вариант для многократного повторения запроса
//foreach(...)
//{
// $id = ...;
// if (!$u->execute())
// exit('DB delete fail'); // Error
//}
// Сделать unset() для переменных, попавших в bindParam перед их повторным использованием
$DBH->commit(); // TRUE
}
catch(PDOException $e)
{
$DBH->rollBack(); // TRUE
file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
//exit('DB error: '.$e->getMessage());
}
Готовые запросы и код для MySQL
Приведенные материалы помогают вспомнить синтаксис и использовать куски кода как капипасту после допиливания под конкретную низкоуровненвую задачу, не использующую фреймворков. Не рекомендуется без понимания принципов построения и смысла конструкций.
SELECT id FROM table1 WHERE (id) NOT IN (SELECT id FROM table2)
* Таблицы должны иметь одинаковую структуру (количество, тип и порядок размещения столбцов), иначе вместо * следует подставить названия соответствующих столбцов исходной таблицы 1 в порядке их следования в таблице 2, при этом для таблицы 2 их названия не имеют значения, а важны только количество, тип и порядок перечисления.
INSERT INTO table2 SELECT * FROM table1 WHERE id<=5
INSERT INTO table2 SELECT id, data1, data2 FROM table1 WHERE id=5
* См. примечание из прерыдущего примера
INSERT INTO table1 SELECT * FROM table2 WHERE (id) NOT IN (SELECT id FROM table1)
SELECT * FROM table WHERE id=:id GROUP BY data2 ORDER BY data1 ASC, data2 DESC LIMIT 0,10
function dbGetById($table, $names, $id, $field='id')
{ // Security warning: $table, $names, $field
global $DBH;
$r=$DBH->prepare('SELECT '.$names.' FROM '.$table.' WHERE '.$field.'=:id');
if ($r->execute(array('id' => $id)) === TRUE)
if ($r->rowCount() === 1)
if ($d = $r->fetch(PDO::FETCH_ASSOC))
return $d;
return FALSE;
}
function dbSetById($table, $name, $value, $id, $field='id')
{ // Security warning: $table, $name, $field
global $DBH;
$u=$DBH->prepare('UPDATE '.$table.' SET '.$name.'=:value WHERE '.$field.'=:id');
return $u->execute(array('id' => $id, 'value' => $value));
}
UPDATE tparent,tchild SET tparent.child_id=tchild.id
WHERE tparent.child_name=tchild.child_name;