Как я могу вставить строки с кавычками в запросы Perl DBI?

Каков предпочтительный способ вставки строк, которые могут содержать как одинарные, так и двойные кавычки (", '), в MySql с помощью DBI? Например, $val1 и $val2 могут содержать кавычки:

my $dbh = DBI->connect( ... );
my $sql = "insert into tbl_name(col_one,col_two) values($val1, $val2)";
my $sth = $dbh->prepare($sql);
$sth->execute();
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
6
0
21 445
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Используйте связанный запрос, используя

$sth = $dbh->prepare("insert into tbl_name(col_one,col_two) values(?,?)");
$sth->execute($val1, $val2);

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

Обновление: изменен мой пример, чтобы он соответствовал примеру, отредактированному в вопросе.

Обновление: я не знаю, почему Адам удалил свой ответ, но если по какой-то причине вы не можете использовать связанные переменные (также известные как «заполнители»), вы также можете использовать $dbh->quote($var) для переменной. Например:

$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
    $dbh->quote(q("Don't"));

Обычно это называется использованием заполнителей.

Mr. Muskrat 12.11.2008 23:03

Заполнители также обладают очень полезным свойством защиты от атак с использованием SQL-инъекций. Используй их. Всегда. Никогда помещает данные, предоставленные пользователем, непосредственно в ваши запросы.

Dave Sherohman 13.11.2008 03:30

«executeUpdate» должно быть просто «execute» (и это в любом случае вставка, а не обновление :-) Кстати, Адам, quote () тоже хороший ответ, бывают случаи, когда это предпочтительнее заполнителей. Но да, никогда не используйте данные, предоставленные пользователем, непосредственно в своих запросах и не подвергайтесь гневу Bobby Tables.

runrig 13.11.2008 04:04

@ Адам, ты не должен был удалять свой ответ. Это была обычная информация.

Paul Tomblin 13.11.2008 05:17

Используйте метод quote(). Он будет грамотно обрабатывать расценки за вас. Пример из документы:

$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
            $dbh->quote("Don't");

Немного изменены, чтобы иметь оба типа котировок:

$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
            $dbh->quote(q("Don't"));

Не помню, почему я удалил этот ответ. Так что я восстанавливаю его. :)

Adam Bellaire 07.10.2009 21:58

Одно небольшое предостережение по поводу связанных заполнителей: я создаю довольно большой скрипт загрузки базы данных, который изначально использовал связанные заполнители в более старой версии Perl / DBI и обнаружил утечку памяти в реализации заполнителя, поэтому, если вы ищете при использовании их в постоянном процессе / демоне или в контексте большого объема вы можете убедиться, что размер процесса не становится проблемой. Переход к построению строк запроса с использованием метода quote () устранил для меня проблему.

Интересно, хотя, возможно, именно тот факт, что объекты дескриптора операторов были созданы явно, вызывал проблемы с управлением памятью в Perl, то есть фрагментацию памяти. Perl действительно не очень хорош для восстановления освобожденной памяти ...

mjy 30.12.2008 22:52

Заполнители DBI потрясающие. Они светятся, когда вам нужно выполнить один и тот же запрос в цикле. Учти это:

  my $dbh = DBI->connect(...);
  my $name_pairs = get_csv_data("data.csv");
  my $sth = $dbh->prepare("INSERT INTO t1 (first_name, last_name) VALUES (?,?)");
  for my $pair (@$name_pairs) {
     unless ($sth->execute(@$pair)) {
         warn($sth->errstr);
     }
  }

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

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

   # Here, I am confident about the hash keys, less so about the values
   $sql = sprintf("INSERT INTO t1 (%s) VALUES (%s)",
                    join(",", keys(%hash)),
                    join("," map { $dbh->quote($_) } values(%hash))
                  );
   $sth = $dbh->prepare($sql);
   unless ($sth->execute) {
     warn($sth->{Statement});
   }

Обратите внимание, что вы должны установить RaiseError => 0 в $ dbh, чтобы вы могли видеть сбой SQL, но это очень помогло мне в прошлом.

Ваше здоровье.

Непонятно, почему этот точный и вежливый ответ был отвергнут, но что-то не так.

jjohn 31.03.2019 19:06

Другие вопросы по теме