PHP转义的数组怎么处理,关于php:PDO与内爆数组转义

我目前正在学习PDO(从MySQLi转移过来的),因为MySQLi的准备好的语句很糟糕。但是,我之前从未在此级别上完全尝试过PDO。我正在尝试创建一个包含多个常用函数的PDO数据库类,以便根据该函数的给定信息来构建查询。

这是我的delete()函数,将用于从表中删除行:

public function delete( $table, $where = array(), $limit = '' ) {

$holders = array();

$params = array();

foreach( $where as $field ) {

$holders[] = '?';

}

foreach( $where as $field => $value ) {

$value = $value;

$clause[] ="$field =" . implode( '', array_values( $holders  ) ) ."";

$params[] = $value;

}

$table = $this->prepend_table( $table );

$sql ="DELETE FROM {$table} WHERE" . implode( 'AND ', $clause );

if( !empty( $limit ) ) {

$sql .=" LIMIT {$limit}";

}

try {

$stmt = $this->connection->prepare( $sql );

$stmt->execute( $params );

return true;

} catch( PDOException $e ) {

die( 'Query Error: ' . $e->getMessage() );

exit;

}

}

如您所见,我正在从MySQL语句中的参数内嵌数组,然后准备并执行已构建的查询。

现在,在我的上一个问题中,有人提到过在准备语句中使用implode(),就像我上面提到的那样,是非常危险的,我应该对PDO使用"转义"。现在,我知道MySQLi具有real_escape_string,但是我将如何处理删除(和其他函数)并使其尽可能安全。

由于我是PDO的新手,如果我错过任何支票(或为了确保其安全性而要做的其他事情),请让我知道-完成后,我将要求代码审阅基地对我的类以确保它是安全的。

您将要验证$limit是一个数值,并且$table是一个合法的表名(您的prepend_table函数可以做到这一点吗?)。 但是在转义方面,如果您使用查询参数,则不需要转义这些字段; 多数民众赞成在使用查询参数的全部要点。 好吧,总的来说,这是很大一部分。

您尝试自己做某事真是太好了。 这让我想起了几年前的尝试(它确实起作用并且仍然起作用,但是语法很复杂;仅供参考pastebin)。 我最终编写了一个完整的新类来构建查询(类似于Laravels querybuilder类)。 我建议您研究Doctrine或将任何其他开源PDO包装器作为自己项目的参考。

请注意,因为您使用的是准备好的语句,因此您无需按照PHP文档中的引号进行操作。

If you are using this function to build SQL statements, you are strongly recommended to use PDO::prepare() to prepare SQL statements with bound parameters instead of using PDO::quote() to interpolate user input into an SQL statement. Prepared statements with bound parameters are not only more portable, more convenient, immune to SQL injection, but are often much faster to execute than interpolated queries, as both the server and client side can cache a compiled form of the query.

这样就可以避免整个转义过程。

但是,供您参考的是PDO的quote函数,

$conn = new PDO('sqlite:/home/lynn/music.sql3');

/* Simple string */

$string = 'Nice';

echo 'Unquoted string: ' . $string . '

';

echo 'Quoted string: ' . $conn->quote($string) . '

';

?>

输出量

Unquoted string: Nice

Quoted string: 'Nice'

好的,如果我理解正确,我想引用PDO引用,然后将其放入数组中吗?

他们是我的意思吗? 参数

否。再次阅读第一部分和报价! 您不需要使用它。

哦,对,这样我所做的就是安全的。

是的,我做到了。 我读到的是我不需要这样做,因为我使用了prepare()来保护查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值