【发布时间】:2011-01-13 12:57:23
【问题描述】:
能否告诉我是否有一个函数与来自DBI 模块的 Perl 的 PHP 的 mysql_real_escape_string() 相同?
【问题讨论】:
标签: perl dbi mysql-real-escape-string
能否告诉我是否有一个函数与来自DBI 模块的 Perl 的 PHP 的 mysql_real_escape_string() 相同?
【问题讨论】:
标签: perl dbi mysql-real-escape-string
数据库句柄方法“引用”
my $dbh = DBI->connect( ... );
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");
【讨论】:
不要。逃脱。 SQL。
不要。引用。 SQL。
使用 SQL 占位符/参数 (?)。 SQL语句的结构和占位符表示的数据值是完全分开发送到数据库的,所以(除非数据库引擎或DBD模块有bug)数据值绝对不能解释为SQL命令。
my $name = "Robert'); DROP TABLE Students; --";
my $sth = $dbh->prepare('SELECT id, age FROM Students WHERE name = ?');
$sth->execute($name); # Finds Little Bobby Tables without harming the db
另外一个好处是,如果您重复使用 SQL 语句(它只需要准备一次),使用占位符也会更有效,如果您不这样做(如果您不显式调用 prepare,在执行查询之前它仍然会被隐式调用)。
【讨论】:
IN ('a', 'b', 'c') 子句。在这里,我需要自己逃避这些价值观。能写会很棒:... where ID IN ?, ->execute(\@someIDs) 但那是不可能的......
ID IN ?,但您可以说 'ID IN (' . join(',', ('?')x@someIDs) . ')' 以动态创建一个查询,其中包含正确数量的占位符数据。
喜欢quote?
如果您担心 utf8,我还建议您阅读 DBD::MySQL 的文档。
【讨论】:
【讨论】:
DBH->bind() 是直接等价的,但就像思南所说,不要那样做。正确使用占位符和绑定值。
【讨论】: