2013-11-25 2 views
0

Я относительно новичок в подготовленных отчетах PDO.PHP: лучший способ подготовить инструкцию базы данных PDO?

Я не могу не чувствовать, что должен быть более простой и быстрый способ сделать следующее: я все равно загружаю все в массив, а затем должен переписать всю вещь в набор ': blah' => $ found ['blah'] ерунда.

Что может быть сделано более аккуратным способом?

$stmt = $db->prepare("UPDATE googleplay SET name=:name, releasedate=:releasedate, version=:version, image=:image, url=:url, rating=:rating WHERE id=:id"); 
$stmt->execute(array( 
    ':id'=>$found['id'], 
    ':name'=>$found['name'], 
    ':releasedate'=>$found['releasedate'], 
    ':version'=>$found['version'], 
    ':image'=>$found['image'], 
    ':url'=>$found['url'], 
    ':rating'=>$found['rating'] 
    )); 
+1

Вот что ОРМ был построен. Вы использовали структуру ORM раньше в PHP? – SixteenStudio

ответ

4

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

$stmt->execute($found); 

И даже если вы должны были сделать это, сделать это автоматически:

$found = array_combine(array_map(function ($key) { return ":$key"; }, array_keys($found)), $found); 
+0

Очень приятный: простой и простой! Я знал, что есть лучший способ. Спасибо. – jamescridland

2

Есть и другие способы сделать это посыпают по документации PDO, некоторые аккуратнее некоторые нет. И вы можете написать php-функцию, которая сделает это за вас, чтобы сделать ее более аккуратной.

Эта же функция позволяет использовать ? для обозначения аргементов. Для многих запросов с одним выстрелом он чище.

Однако самым простым является использование ORM (Object Relational Mapper), такого как Doctrine или любое количество клонов ActiveRecord (например, Laravel).

+0

Вытащить полностью жизнеспособную систему, чтобы заменить ее совершенно другой, которая может или не может быть подходящей вообще для ситуации, является самым опрятным решением ...? Хмм ... – deceze

+0

Вырваться из попкорна, отбросить назад и посмотреть, как он летает. – Strawberry

+0

@Strawberry: нет, он технически корректен, когда вы хорошо знаете PHP. Но если ОП задается вопросом, как он может сделать свою функцию более чистым, он, вероятно, не знает, что он изобретает колесо, развивая свои собственные рамки, так что небольшое толчок в правильном направлении не может быть плохим. –

0
$allowed = array('name', 'releasedate', 'version', 'image', 'url', 'rating'); 
$sql = "UPDATE users SET ".pdoSet($allowed, $values, $found)." WHERE id = :id"; 
$stm = $dbh->prepare($sql); 
$values["id"] = $found['id']; 
$stm->execute($values); 

где pdoSet() функция производить SET заявление из прилагаемым массива (с проверкой ввода массива от списка разрешенных полей)

Однако, лучший способ будет реализации другого типа заполнитель, который будет сделать код опрятным в мире:

$db->query("UPDATE users SET ?u WHERE id = ?i", $found, $id); 

предполагая $found уже проверена (средства приходят не из пользовательского ввода, но зашита на месте или filtere d out) и $id не является частью массива.

0
// a closure that, given a key, returns a SET subclause for an UPDATE statement 
$cl_set = function($k) { 
    if (!preg_match('/^[[:alnum:]_]+$/', $k)) 
    throw new Exception('Key cannot be used as a placeholder name'); 
    return "$k = :$k"; 
}; 

// use our closure to generate the SQL 
$stmt = $db->prepare(
    'UPDATE googleplay SET ' . implode(', ', array_map($cl_set, array_keys($found))) 
); 

// execute - this works because of the observation in @deceze's answer : 
$stmt->execute($found); 
+0

Ради всего святого, не называйте его «опрятным»%) –

+0

oh, и это не с условием WHERE –

Смежные вопросы