У меня есть эта функция в моей 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 выглядел как отличный способ сделать это.
PHP предоставляет довольно много удобных функций, которые делают многое из того, что вы делаете вручную.
join()
очень полезна для создания списков, разделенных запятыми. Пример (не проверен):
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); }