在数据库更新之前转义变量内的单引号

时间:2014-12-15 19:07:34

标签: mysql perl

这可能是一个非常基本的问题。

我有一个变量$ name,它是通过html页面中的表单输入的。 现在我必须使用sql查询将此$ name的值更新到数据库表中。

当$ name中包含单引号时,数据库更新失败。例如。詹姆斯奥哈拉 当它没有单引号时,更新工作正常。

在更新数据库之前,有没有办法在变量中转义这个单引号。 我不想剥去单引号。只是想逃避它,所以更新通过精细,实际名称在数据库中更新。

请告诉我。感谢。

2 个答案:

答案 0 :(得分:5)

通常,最好的方法是准备查询并使用占位符。然后将数据传递给数据库以填充准备好的查询。

DBIx::Class之类的ORM会自动为您执行此操作。

如果您直接使用DBI,那么您可以执行something like this

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

答案 1 :(得分:-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);

后者更漂亮,但在某些情况下,前者可以更快(因为DB可以更好地优化查询,更好地了解表达式的类型)。