mysql_query для PDO и подготовленные заявления - PullRequest
3 голосов
/ 20 августа 2011

У меня есть эта функция в моей 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 выглядело как отличный способ сделать это.

1 Ответ

4 голосов
/ 20 августа 2011

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);
}
...