Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$count = ORM::for_table('contact')->count();
$contact_list = ORM::for_table('contact')->find_many();
$rows = $DB->select('
SELECT *
FROM
goods g
{ JOIN category c ON c.id = g.category_id AND 1 = ? }
WHERE
1 = 1
{ AND c.name = ? }
LIMIT ?d
',
(empty($_POST['cat_name'])? DBSIMPLE_SKIP : 1),
(empty($_POST['cat_name'])? DBSIMPLE_SKIP : $_POST['cat_name']),
$pageSize
);
foreach ($array as $item) {
// DbSimple понимает, что prepare нужно выполнить всего один раз!
$DB->query('INSERT INTO tbl(field) VALUES(?)', $item);
}
$ins = array();
foreach ($data as $row) {
$ins[] = $db->parse("(NULL,?s,?s, NOW())",$row['name'],$row['lastname']);
}
$instr = implode(",",$ins);
$db->query("INSERT INTO table VALUES ?p",$instr);
$join = '';
$where = '';
if(!empty($_POST['cat_name'])) {
$join = $db->parse('JOIN category c ON c.id = g.category_id AND 1 = 1', 1);
$where = $db->parse('AND c.name = ?', $_POST['cat_name']);
}
$sql = 'SELECT * FROM goods g ?p WHERE 1 = 1 ?p LIMIT ?i';
$rows = $DB->getAll($sql, $join, $where, $pageSize);
$sqlpart = '';
if (!empty($var)) {
$sqlpart = $db->parse(" AND field = ?s", $var);
}
$data = $db->getAll("SELECT * FROM table WHERE a=?i ?p", $id, $sqlpart);
$sql = "SELECT * FROM news WHERE theme IN(?a) ORDER BY ?n";
$data = $db->getAll($sql,$_GET['themes'],$_GET['order']);
$in = trim(str_repeat('?,',count($_GET['themes'])).",");
$order = str_replace('`','``',$_GET['order']);
$stmt = $db->prepare("SELECT * FROM news WHERE theme IN($in) ORDER BY `$order`");
$stmt->execute($_GET['themes']);
$data = $stmt->fetchAll();
$ids = array(1, 2, 3, 7, 8, 9);
$inQuery = implode(',', array_fill(0, count($ids), '?'));
$db = new PDO(...);
$stmt = $db->prepare(
'SELECT *
FROM table
WHERE id IN(' . $inQuery . ')'
);
// bindvalue is 1-indexed, so $k+1
foreach ($ids as $k => $id)
$stmt->bindValue(($k+1), $id);
$stmt->execute();
SELECT * FROM `news` WHERE `theme` IN('1,2,3') ORDER BY `'comments'`
SELECT * FROM `news` WHERE `theme` IN(?,?,?) ORDER BY `comments`
Да и вообще тут надо было просто использовать mysql_escape_string.
Тут тоже вижу выход.
чтобы подставить в конец строки правильный order by
БД простила мне запрос с ORDER BY '`comments`'
… наличие плейсхолдеров для любого типа данных...
и в итоге код без prepare statement? В чем соль?
как только вы начнете поддерживать «любой тип данных»
$some_id может быть равно 'title'Так оно же не может, мы же там предполагаем идентификатор, вы же сами написали:
И, следовательно, являться как именем поля, так и его содержанием.
Я составляю SQL запрос, и, разумеется, я знаю, в какое место запроса идут те или иные данные.
Вопроса, «а куда собственно должны быть вставлены данные?» я не понял
Который может предназначаться как для оператора IN, так и для оператора SETуловили?
Тот же эскейпинг защиту не гарантируети рассказали про то чем хорош prepared statement и placeholders, но почему теперь пишете про то что:
prepared statements не нужны. Они усложняют код, но не дают никакой пользы на практике. Да ещё и затрудняют отладку.
но почему теперь пишете
По поводу типов: а как же enum, datetime, timestamp
Они усложняют код, но не дают никакой пользы на практике. Да ещё и затрудняют отладку.По каждому пункту могу высказать совершенно обратное, поэтому без аргументов это всего лишь слова…
SELECT * FROM table WHERE my_date_field > FROM_UNIXTIME(?i)По каждому пункту могу высказать совершенно обратное, поэтому без аргументов это всего лишь слова…
Ну вот вам пример с датами: в базе поле datetime а вы в скрипте оперируете unix_timestamp-ом
SELECT ?p FROM table ?p WHERE ?p GROUP BY ?p ORDER ?p LIMIT ?p и само WHERE Это что то вида ?p ?p ?p ?p или $previous_where = '1=1';// какое то предустановленное условие
$where = $db->prepare('some_condition AND ?p', $previous_where);
//... 100500 строк логики
$where = $db->prepare('(?p) OR another_condition', $where);
//... 100500 строк логики
$where = $db->prepare('yet_another_condition AND((?p) OR another_condition2)', $where);
$stmt = new QueryBuilder();
$stmt->where('1=1');
$stmt->where('some_condition');
//... 100500 строк логики
$stmt->orWhere('another_condition');
//... 100500 строк логики
$stmt->orWhere('another_condition');
$stmt->where('yet_another_condition', QueryBuilder::prepend);
А определить тип данных (is_numeric, is_array etc) и вставить вместо? какой нибудь ?i или ?s не большая проблема.
Развивая эту концепцию далее, мы приходим к мысли, что пейсхолдеры ...
PHP класс для удобной и безопасной работы с MySQL