2017-02-22 2 views
0

Подготовленные утверждения подходят для защиты от SQL-инъекции, но если в SQL-запросе нет переменных, есть ли какие-либо преимущества в используя подготовленное заявление? особенно если запрос будет использоваться только один раз?Есть ли преимущество в использовании подготовленных операторов в PDO, когда нет переменных, входящих в запрос sql.

например. есть ли преимущество в использовании методов prepare() и execute() с использованием только запроса() или есть ли преимущество использования только запроса в этом случае? например Производительность benfit

+0

Последовательность возможно? Возможно, с использованием общего интерфейса? –

+0

Я думаю, я тоже думал, есть ли какие-либо преимущества для использования запроса в этом случае. Я отредактировал вопрос, чтобы уточнить. – ceteri

+0

Какие модели и модели СУБД? У Oracle и SQL-сервера есть прекомпиляция. MySQL, нет. –

ответ

0

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

class MyPDO extends PDO 
{ 
    public function run($sql, $args = NULL) 
    { 
     if (!$args) 
     { 
      return $this->query($sql); 
     } 
     $stmt = $this->prepare($sql); 
     $stmt->execute($args); 
     return $stmt; 
    } 
} 

теперь вы получили PDO, который может решить, будет ли работать подготовленное заявление или нет:

$pdo = new MyPDO(...); 
$count = $pdo->run("SELECT count(*) FROM t")->fetchColumn(); // no prepare 
$user = $pdo->run("SELECT * FROM t WHERE id=?",[$id])->fetch(); // prepare 
0

Если вы используете запрос только один раз, то это будет без разницы, за исключением того, что подготовленный оператор создаст метаплан выполнения (но это не заметная разница в производительности). Если вы используете запрос с подготовленными инструкциями несколько раз с разными параметрами, вы получаете небольшое улучшение производительности, потому что оператор скомпилируется только один раз на стороне сервера, а затем вы можете передавать разные параметры несколько раз. Запрос будет скомпилирован только при использовании реальных подготовленных операторов, если вы используете эмулированные подготовленные инструкции, тогда он не будет скомпилирован, и, кроме того, защита sql-вреда не будет иметь разницы в производительности.

+0

, так что нет никакой пользы от использования запроса при подготовке и выполнении, например меньше нагрузки на сервере (компиляция запроса) – ceteri

+0

, если вы будете использовать sql только один раз без параметров, просто используйте запрос, я отредактировал свой ответ с помощью метаплана – Eimsas

+0

разных параметров? OP говорит, что переменные не используются. –