2014-01-03 2 views
10

В настоящее время я работаю над скриптом Perl, и я очень к нему знаком. Я столкнулся с проблемой с Perl, потому что я привык к синтаксису PHP Php, в котором вы создаете требуемый оператор, а затем выполняете его, а затем отправляет информацию на сервер.Почему Perl DBI требует от оператора подготовки перед выполнением?

Однако с Perl и модулем DBI требуется, чтобы вы создали инструкцию, подготовили оператор и затем выполнили оператор, отправляющий информацию на сервер.

Это потому, что Perl аналогичен высокоуровневому языку программирования и имеет внутри него практический компилятор, который требует выполнения этой инструкции подготовки перед выполнением?

Я использую инструкцию для обновления MySQL, является ли она конкретной для операторов (обновление vs select)?

Когда я говорю «создать заявление» я имею в виду что-то вроде:

$query = "UPDATE table SET column = value"; 

Может быть, я не сделал достаточно исследований по этой теме?

+4

Вы также должны использовать метод создания, подготовки, выполнения mysqli или PDO в вашем PHP-коде. –

ответ

19

Вы на самом деле не должны использовать prepare напрямую (есть некоторые ярлыки.) Но, используя это позволяет сказать, драйвер базы данных об одном заявлении, которое может быть повторно выполнено без базы данных перекомпиляции его каждый раз. Например

my @records = ([ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8 9 ]); 
my $sth = $dbh->prepare("INSERT INTO foo VALUES (?, ?, ?)"); 
foreach my $record(@records) { 
    $sth->execute(@$record); 
} 

Это будет выполнять тот же подготовленный оператор в три раза, по одному для каждого набора из трех значений в @records. Это также демонстрирует использование заполнителей ?, которые вы всегда должны использовать вместо интерполяции переменных непосредственно в строки SQL.

Если вам нужно только выполнить инструкцию один раз, вы можете объединить подготовить и выполнить операторы в один шаг:

$dbh->do("INSERT INTO foo VALUES (?, ?, ?)", undef, 1, 2, 3); 

Первый аргумент является SQL строка (предпочтительнее с заполнителями) секунды является необязательные атрибуты hash (слева здесь undef), а остальные параметры заменяются заполнителями.

+0

Это также имеет большой смысл! Благодарю! – BuddhistBeast

+0

Простые, прямые и понятные объяснения. +1. – slayedbylucifer

+0

Также стоит упомянуть о различных удобных 'select * _ *()' методах, которые обеспечивают простой способ подготовки, выполнения и выборки данных за один раз. Например, '$ dbh-> selectall_arrayref (" SELECT ... WHERE foo =? ", Undef, $ foo)'. –

8

Вам нужно всего лишь подготовить(), если вы хотите выполнить запрос несколько раз, не разыгрывая его каждый раз.

Для вашего простого случая я использовал бы метод do.

$query = "UPDATE table SET column = value"; 
$rows = $dbh->do($query) or die $dbh->errstr; 
+0

Спасибо, что в десять раз больше смысла! – BuddhistBeast

+2

Хотя даже с помощью метода 'do' использование значений привязки * намного безопаснее, чем интерполяция данных в строку запроса. – tjd

+0

@tjd, да, я поддерживаю использование параметров запроса, а метод 'do' делает это легко. –

Смежные вопросы