Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Функция insert
 
 автор: lgar   (05.06.2014 в 17:34)   письмо автору
 
 

Пишу функцию, в будущем она превратится в метод для класса. Интересует все ли я учёл для составления абстрактной функции для внесения информации в БД.




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



  Ответить  
 
 автор: confirm   (06.06.2014 в 00:59)   письмо автору
 
   для: 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);

  Ответить  
 
 автор: lgar   (28.06.2014 в 10:17)   письмо автору
 
   для: confirm   (06.06.2014 в 00:59)
 

Да, проще в том, что знаков препинания меньше, например, в Вашем примере знак ` не понятен.

  Ответить  
 
 автор: confirm   (28.06.2014 в 10:20)   письмо автору
 
   для: lgar   (28.06.2014 в 10:17)
 

Это не знак, а мера от неприятностей, которые могут возникнуть в sql, если используется зарезервировнное в sql имя для поля таблицы.

Не вижу у вас простоты, вижу лишнее и не нужное совсем.

  Ответить  
 
 автор: lgar   (28.06.2014 в 11:22)   письмо автору
 
   для: confirm   (28.06.2014 в 10:20)
 

Если используется bind*, то эти обратные апострофы тоже нужны?
Проверку (try) оставить в методе или вынести, проверять вне метода, или составить для проверки отдельные методы?

  Ответить  
 
 автор: confirm   (28.06.2014 в 13:50)   письмо автору
 
   для: lgar   (28.06.2014 в 11:22)
 

А вы думаете, что bindValue поступает как то иначе, чем execute(key=>value)? Выполните:

<?
$q 
$db->prepare('UPDATE tst SET show=:show');
$q->bindValue(':show'12PDO::PARAM_INT);
$q->execute();


Что получите?

Bind привязывает параметр запроса к именованной (не именованной) переменной, и никакого отношения к имени столбца не имеет. Единственная привязка к столбцам, это bindColumn(), но и там задается только номер столбца в запросе, а их имена указываете вы.

Чтобы не беспокоится об именах полей, можете установить глобально - PDO::ATTR_FETCH_TABLE_NAMES. Если драйвер это поддерживает, значит и беспокоится не надо (если это конечно всегда будет удобно). Но, вы не только привязываете параметр, но и указывать тип его. А всегда ли тип будет строка, число, дата и т.п.? Не зарекайтесь, вполне возможно и вам в запросе придется указывать как параметр имя столбца таблицы, и тогда подставлять параметр нужно будет как есть. Да и свое придется писать, например многострочная вставка данных, чего PDO не может. В общем об этом не стоит забывать.

Что значит вынести? Вы можете обрабатывать исключения своим методом, глобально. Но ведь и писать на каждый запрос свой класс, это вроде бы как тоже не рачительно, а значит и обработчик исключений может быть не на один запрос.

В сети есть много классов под PDO, посмотрите их, может быть что-то из этих решений как раз вы и хотите реализовать, ну или это может послужить неким примером-уроком.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования