mysql_query для PDO и подготовленных операторов

У меня есть эта функция в моей CMS, которая вставляет список переменных полей и значений в две разные таблицы; одна – статическая таблица индексов, а одна – динамическая. Это функция:

function insertFields($fields) { $stdfields = array(); $extfields = array(); /* Separate the fields based on if the fields is standard or extra. $this->fields is a csv list of the defined extra fields */ foreach($fields as $field => $value) { $fields[mysql_real_escape_string($field)] = mysql_real_escape_string($value); if(strstr($this->fields, $field)) $extfields[$field] = $value; else $stdfields[$field] = $value; } //Build the 2 queries -- Maybe there is a better way to do this? $extfieldcount = count($extfields); $stdfieldcount = count($stdfields); $stditers = 0; $extiters = 0; foreach($extfields as $field => $value) { if($extiters != $extfieldcount) { $extfields.= $field.", "; $extvalues.= "'".$value."', "; } else { $extfields.= $field." "; $extvalues.= "'".$value."' "; } $extiters++; } foreach($stdfields as $field => $value) { if($stditers != $stdfieldcount) { $newfields.= $field.", "; $newvalues.= "'".$value."', "; } else { $newfields.= $field." "; $newvalues.= "'".$value."' "; } $stditers++; } //Inset the standard fields $stdquery = "INSERT INTO masteridx (".$newfields.") VALUES (".$newvalues.")"; $this->dbQuery($stdquery); /* not perfect. I need a better way to find the id that was inserted, so I can combine three queries into at least two */ $findlastquery = "SELECT `id` FROM `masteridx` WHERE `slug`='".$fields['slug']."' LIMIT 1"; $result = $this->dbQuery($findlastquery); $result = mysql_fetch_assoc($result); $tempfield = "id, "; $tempvalue = "'".$result['id']."', "; //Insert the extra fields $extquery = "INSERT INTO ".$this->type." (".$tempfield.$extfields.") VALUES (".$tempvalue.$extvalues.")"; $this->dbQuery($extquery); } 

Итак, для подготовленного заявления я не могу привязать поля, просто значения, не так ли? Поэтому мне все равно придется скрывать поля, если я сделал что-то вроде:

 for ($i = 0; $i <= $stdfieldcount; $i++) { if($i < $stdfieldcount) $qs.= '?, '; else $qs.= '? '; } $sth = $dbh->prepare("INSERT INTO masteridx ({$stdfields}) VALUES ({$qs})"); $sth->execute($array_of_stdfield_values); 

Какой смысл здесь, если мне еще нужно покинуть поля? Эта функция в конечном итоге возьмет массив из нескольких статей и их полей. Поля сами тоже будут разными. Я понял, что, когда я впервые посмотрел на подготовленные заявления, я мог бы просто передать ему массив полей и массив значений, но я думаю, что это не так.

Мой вопрос действительно, как бы вы все это сделали? Я хотел бы начать быть агностиком базы данных, и PDO выглядел как отличный способ сделать это.

Solutions Collecting From Web of "mysql_query для PDO и подготовленных операторов"

PHP предоставляет довольно много удобных функций, которые делают многое из того, что вы делаете вручную.

  • PDO поддерживает именованные параметры в ваших операторах SQL, поэтому вы можете передать массив ключей / значений, где ключи соответствуют вашим именованным параметрам.
  • Функция join() очень полезна для создания списков, разделенных запятыми.
  • Существует множество функций для управления массивами .
  • Некоторые функции позволяют вызывать обратный вызов (который может быть закрытием в PHP 5.3) для динамического преобразования массивов.

Пример (не проверен):

 function insertFields($fields) { $columns = join(",", array_map( function($col) { return "`".preg_replace("/`/gu","``",$col)."`"}, array_keys($fields))); $params = join(",", array_map( function($col) { return ":".preg_replace("/[`\s]/gu","",$col)}, array_keys($fields))); $stdquery = "INSERT INTO masteridx ({$columns}) VALUES ({$params})"; $stmt = $pdo->prepare($stdQuery); $stmt->execute($fields); }