|
|
|
| Пишу функцию, в будущем она превратится в метод для класса. Интересует все ли я учёл для составления абстрактной функции для внесения информации в БД.
function insert($db, $table, array $fields = array())
{
$query = "INSERT INTO $table (";
$query .= implode(',', array_keys($fields));
$query .= ") VALUES (";
$query .= implode(',', array_map("placeholder", $fields)); //заменю на array_fill
$query .=")";
$db->prepare("$query"); //->execute(array_values($fields));
try {
$stmt = $db->prepare($query);
}
catch (Exception $e)
{
$stmt = false;
}
if (false === $stmt)
{
throw new Exception('The database cannot successfully prepare the statement');
}
$success = $stmt->execute(array_values($fields));
if (!$success)
{
throw new Exception(sprintf('Error executing query "%s"', $query));
}
}
insert($db, 'hosts', $fields);
|
| |
|
|
|
|
|
|
|
для: lgar
(05.06.2014 в 17:34)
| | Вопрос отвлеченный, вот такая запись из 5 строк:
$query = "INSERT INTO $table (";
$query .= implode(',', array_keys($fields));
$query .= ") VALUES (";
$query .= implode(',', array_map("placeholder", $fields)); //заменю на array_fill
$query .=")";
|
для чего, она делает код более понятным или что? Это конечно как нравится так и пишите, но на мой взгляд это излишество распыляет внимание, не более.
И каким боком здесь array_fill может пригодиться?
Если $fields, это массив имен полей таблицы (не думаю, что хорошо, если они есть и поля имен формы), а $values, это соответствующие этим полям данные, то передавать в функцию нужно итоговый массив для execute(ключ=>значение), работая с именованными переменными. Поэтому:
<?
$fields = array_combine($fields, $values);
$db->prepare('INSERT INTO ' . $table . ' (`' . implode('`,`', array_keys($fields)) . '`) VALUES (:' . implode(',:', array_keys($fields)) . ')');
$db->execute($fields);
|
| |
|
|
|
|
|
|
|
для: confirm
(06.06.2014 в 00:59)
| | Да, проще в том, что знаков препинания меньше, например, в Вашем примере знак ` не понятен. | |
|
|
|
|
|
|
|
для: lgar
(28.06.2014 в 10:17)
| | Это не знак, а мера от неприятностей, которые могут возникнуть в sql, если используется зарезервировнное в sql имя для поля таблицы.
Не вижу у вас простоты, вижу лишнее и не нужное совсем. | |
|
|
|
|
|
|
|
для: confirm
(28.06.2014 в 10:20)
| | Если используется bind*, то эти обратные апострофы тоже нужны?
Проверку (try) оставить в методе или вынести, проверять вне метода, или составить для проверки отдельные методы? | |
|
|
|
|
|
|
|
для: lgar
(28.06.2014 в 11:22)
| | А вы думаете, что bindValue поступает как то иначе, чем execute(key=>value)? Выполните:
<?
$q = $db->prepare('UPDATE tst SET show=:show');
$q->bindValue(':show', 12, PDO::PARAM_INT);
$q->execute();
|
Что получите?
Bind привязывает параметр запроса к именованной (не именованной) переменной, и никакого отношения к имени столбца не имеет. Единственная привязка к столбцам, это bindColumn(), но и там задается только номер столбца в запросе, а их имена указываете вы.
Чтобы не беспокоится об именах полей, можете установить глобально - PDO::ATTR_FETCH_TABLE_NAMES. Если драйвер это поддерживает, значит и беспокоится не надо (если это конечно всегда будет удобно). Но, вы не только привязываете параметр, но и указывать тип его. А всегда ли тип будет строка, число, дата и т.п.? Не зарекайтесь, вполне возможно и вам в запросе придется указывать как параметр имя столбца таблицы, и тогда подставлять параметр нужно будет как есть. Да и свое придется писать, например многострочная вставка данных, чего PDO не может. В общем об этом не стоит забывать.
Что значит вынести? Вы можете обрабатывать исключения своим методом, глобально. Но ведь и писать на каждый запрос свой класс, это вроде бы как тоже не рачительно, а значит и обработчик исключений может быть не на один запрос.
В сети есть много классов под PDO, посмотрите их, может быть что-то из этих решений как раз вы и хотите реализовать, ну или это может послужить неким примером-уроком. | |
|
|
|