2014-12-15 4 views
-1

Это может быть очень простой вопрос.Экранирование одной кавычки внутри переменной перед обновлением базы данных

У меня есть переменная $ name, которая вводится через форму с html-страницы. Теперь мне нужно обновить значение этого $ name в таблице базы данных, используя sql-запрос.

Когда $ name имеет одинарные кавычки в нем, обновление базы данных выходит из строя. Например. Джеймс О'Хара , когда он не имеет одинарных кавычек, обновление работает нормально.

Есть ли способ избежать этой отдельной цитаты внутри переменной перед обновлением базы данных.? Я не хочу снимать одну цитату. просто хотите избежать этого, так что обновление проходит через точное и фактическое имя обновляется в базе данных.

Пожалуйста, дайте мне знать. Благодарю.

ответ

5

Как правило, наилучшим подходом к этому является подготовка запроса и использование заполнителя. Затем передайте данные в базу данных, чтобы заполнить подготовленный запрос.

ORM, такой как DBIx::Class, сделает это за вас автоматически.

Если вы используете DBI напрямую, то вы могли бы сделать something like this:

$sth = $dbh->prepare("SELECT * FROM users WHERE email = ?"); 
foreach my $email (@emails) { 
    $sth->execute($email); 
    $row = $sth->fetchrow_hashref; 
    [...] 
} 
+2

Заполнители имеют дополнительное преимущество для защиты этого запроса от атак SQL Injection. – tjd

-1

Используйте предоставленную ссылкой функции

$dbh->do(" 
    UPDATE `MyTable` 
     SET `MyField` = ".$dbh->quote($my_value)." 
    WHERE `id` = ".$dbh->quote($id)." 
"); 

или использовать заполнители

my $sth = $dbh->prepare(" 
    UPDATE `MyTable` 
     SET `MyField` = ? 
    WHERE `id` = ? 
"); 

$sth->execute($my_value, $id); 

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

+0

Что такое downvotes? – ikegami