Почему Perl DBI требует инструкции подготовки перед выполнением?
В настоящее время я работаю над Perl script, и я очень к этому знаком. Я столкнулся с проблемой с Perl, потому что я привык к синтаксису PHP PHP, в котором вы создаете требуемый оператор, а затем выполняете его, а затем он отправляет информацию на серверную сторону.
Однако с Perl и модулем DBI требуется, чтобы вы создали инструкцию, подготовили оператор и затем выполнили оператор, отправляющий информацию на сервер.
Это потому, что Perl аналогичен высокоуровневому языку программирования и содержит внутри него практический компилятор, который требует выполнения этой инструкции подготовки перед выполнением?
Я использую инструкцию по обновлению MySQL, она специфична для операторов (update vs select)?
Когда я говорю "создаю выражение", я имею в виду что-то вроде:
$query = "UPDATE table SET column = value";
Возможно, я не сделал достаточно исследований по этой теме?
Ответы
Ответ 1
На самом деле вам не нужно напрямую использовать 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 (предпочтительнее с заполнителями), секундами является необязательный атрибут хэша (слева undef
здесь), а остальные параметры - это то, что заменяется на заполнители.
Ответ 2
Вам нужно только подготовить(), если вы хотите выполнить запрос более одного раза, не разыгрывая его каждый раз.
В вашем простом случае я бы использовал метод do.
$query = "UPDATE table SET column = value";
$rows = $dbh->do($query) or die $dbh->errstr;