Я хочу автоматически добавлять одинарные кавычки в мои запросы MySQL

0

У меня есть несколько запросов mysql в perl, но некоторые из значений предложения where содержат пробел между словами, например. Гамбия. Когда мои скрипты работают с аргументами where where, содержащими пробел, они игнорируют второе слово.

Я хочу знать, как я могу решить эту проблему, например, если я набираю гамбию, ее следует рассматривать в Гамбии, а не в.

Теги:

2 ответа

6

Если вы используете DBI, вы можете использовать заполнители для отправки произвольных данных в базу данных, не заботясь об экранировании. Заполнитель является вопросительным знаком в выражении prepare, фактическое значение присваивается execute:

use DBI;

$dbh = DBI->connect("DBI:mysql:....",$user,$pass)
    or die("Connect error: $DBI::errstr");

my $sth = $dbh->prepare(qq{ SELECT something FROM table WHERE name = ? });
$sth->execute('the gambia');

# fetch data from $sth

$dbh->disconnect();

Изменить: Если вы составляете запрос (как вы предложили в комментариях), вы можете использовать метод quote:

my $country = "AND country = " . $dbh->quote('the gambia');
my $sth = $dbh->prepare(qq{ SELECT something FROM table WHERE name = ? $country});
  • 0
    @Sheriffo Ceesay - обновляется в соответствии с вашими комментариями.
  • 0
    Просто чтобы быть точным, заполнители не избегают значений данных. При использовании подготовленного оператора структура команд SQL и данные, используемые этими командами, отправляются в базу данных совершенно отдельно, что исключает необходимость полного экранирования данных. Вот почему заполнители / подготовленные операторы превосходят экранирование: поскольку данные отправляются отдельно от команд, нет способа обмануть базу данных, интерпретируя данные как команды.
Показать ещё 2 комментария
2

Ну, во-первых, вы должны посмотреть на использование DBIx:: Class вместо необработанного SQL в вашем приложении.

Но если вы застряли в сыром SQL, то (если вы, по крайней мере, используете DBI), вы должны использовать точки привязки в своих SQL-операторах. Это поможет вам решить все ваши проблемы с кавычками.

$sth = $dbh->prepare('select something from somewhere where country = ?');

$sth->execute('The Gambia');

Дополнительную информацию о привязке см. в DBI docs.

  • 0
    @bvr @davorg Спасибо за ваш ответ, но чтобы вы поняли больше, позвольте мне прикрепить фрагмент кода. Я делаю что-то подобное, но присваиваю переменную, и мой запрос также содержит предложение like. ниже приведен код $ sel = $ dbh-> prepare ("SELECT id , date как день, time , one , one_r , two , two_r , лига, страна, подробности ОТ футбола ГДЕ (одна LIKE TRIM (?) или две LIKE TRIM" (?)) $ страна $ лига $ дата $ лимит "); $ Sel-> выполнить ( "% $% команды", "% $% команды"); $ row = $ sel-> fetchrow_hashref (); $ Sel-> отделка ();
  • 1
    @Sheriffo Ceesay - Пожалуйста, добавьте код в свой вопрос. Также, пожалуйста, предоставьте код, где вы строите $country и $league .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню