Как записать, что хорошая база данных PHP вставляет использование ассоциативного массива

Дистанционная работа в Платформе.NET 2.0 обеспечивает канал IPC для межпроцессного взаимодействия в той же машине.

11
задан Tom 18 November 2009 в 07:31
поделиться

5 ответов

Единственное, что я бы изменил, - это использовать sprintf для удобства чтения

$sql = sprintf(
    'INSERT INTO table (%s) VALUES ("%s")',
    implode(',',array_keys($_fields)),
    implode('","',array_values($_fields))
);
mysql_query($sql);

и сделать убедитесь, что значения экранированы.

22
ответ дан 3 December 2019 в 03:52
поделиться

В этом нет ничего плохого. Я делаю то же самое.

Но убедитесь, что вы mysql_escape () и указываете значения, которые вы вставляете в запрос, иначе вы столкнетесь с уязвимостью SQL-инъекции.

В качестве альтернативы вы можете использовать параметризованный запросы, и в этом случае вы можете фактически передать массив сам по себе, вместо построения строки запроса.

3
ответ дан 3 December 2019 в 03:52
поделиться

Лучше всего использовать ORM (Doctrine 2.0), реализацию ActiveRecord (Doctrine 1.0, RedBean) или реализацию шаблона TableGateway (Zend_Db_Table, Propel). Эти инструменты сделают вашу жизнь намного проще, возьмут на себя большую часть тяжелой работы и помогут защитить вас от SQL-инъекций.

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

1
ответ дан 3 December 2019 в 03:52
поделиться

Используя уловку sprintf , упомянутую Галеном в предыдущем ответе , я придумал следующий код:

$escapedfieldValues = array_map(create_function('$e', 'return mysql_real_escape_string(((get_magic_quotes_gpc()) ? stripslashes($e) : $e));'), array_values($_fields));

$sql = sprintf('INSERT INTO table (%s) VALUES ("%s")', implode(',',array_keys($_fields)), implode('","    ',$escapedfieldValues));

mysql_query($sql);

Он генерирует вставку с экранированием и кавычками. Он также работает независимо от того, включен ли magic_quotes_gpc . Код мог бы быть лучше, если бы я использовал новые анонимные функции PHP v5.3.0 , но мне нужно, чтобы он работал на старых установках PHP.

Этот код немного длиннее оригинала (и медленнее), но более безопасен.

0
ответ дан 3 December 2019 в 03:52
поделиться

Я использую это, чтобы получить часть VALUES INSERT. Но это может быть абсурдный способ делать что-то. Комментарии / предложения приветствуются.

   function arrayToSqlValues($array)
   {
      $sql = "";
      foreach($array as $val)
      {    
         //adding value
         if($val === NULL)
            $sql .= "NULL";
         else
            /*
            useless piece of code see comments
            if($val === FALSE)
               $sql .= "FALSE";
            else
            */
               $sql .= "'" . addslashes($val) . "'";

         $sql .= ", ";
      };

      return "VALUES(" . rtrim($sql, " ,") . ")";
   }
0
ответ дан 3 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: