Использовать готовые операторы везде в PHP? (ПДО) - PullRequest
4 голосов
/ 19 июля 2011

Я собираюсь переключить свой класс базы данных, который я использую в нескольких сайтах / проектах, с использования собственного метода mysql_query * на использование PDO и подготовленных операторов. Однако сначала у меня возникает вопрос - хочу ли я использовать готовые операторы везде ? Даже в тех местах, где запрос будет запущен только один раз? Как насчет ситуаций, когда мне нужно сделать что-то вроде:

INSERT INTO `table` (`column`, `column`) VALUES ('value','value'), ('value','value'),('value','value'), etc.

Должен ли я использовать один подготовленный оператор (и одно ЗНАЧЕНИЕ), но каждый раз выполнять его с разными переменными, или мне следует использовать стиль выше? Если я воспользуюсь здесь подготовленным утверждением, о каком плохом влиянии мы говорим? Нужно ли использовать транзакции в этой ситуации?

* Мой метод mysql_query похож на подготовленный оператор в том, что пользователь может вызвать $mysql->Query("SELECT * FROM% s WHERE '%s'='%s'", $var, $var, $var), а метод автоматически экранирует все с помощью mysql_real_escape_string.

Ответы [ 3 ]

6 голосов
/ 19 июля 2011

Подготовленные операторы обеспечивают хорошую степень защиты от внедрения SQL, а также обеспечивают повышение производительности для некоторых типов запросов. Лично я бы использовал их повсюду.

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

Что касается транзакций, просто используйте их, когда они вам нужны. Например, когда вам нужно выполнить последовательность обновлений «все или ничего», где, если произойдет сбой одного из них, вся партия должна выйти из строя. Они могут быть полезны для таких вещей, как отношения «многие ко многим», когда необходимо обновить три таблицы, и вы не хотите, чтобы при возникновении сбоя оставались частичные отношения.

3 голосов
/ 19 июля 2011

Используйте только параметры PDO для передачи переменных в запрос.

Вы также можете использовать подготовленный оператор для нескольких вставок:

$insertQuery = 'INSERT INTO table (col1, col2) VALUES ';
$insertQueryData = array();
$insertData = array();

foreach ($data as $record) {
  $insertQueryData[] = '(?, ?)';
  $insertData[] = $record['col1'];
  $insertData[] = $record['col2'];
}

$insertQuery .= implode(', ', $insertQueryData);

$statement = $db->prepare($insertQuery);
$statement->execute($insertData);
1 голос
/ 19 июля 2011

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

...