我正在学习PDO(从MySQLi转移),因为MySQLi的准备好的陈述是,让我们说“sucky'”。但是,我之前从未在此级别上完全尝试过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()编写语句 - 就像我上面所说的那样,非常危险,而且我应该使用' escape'对于PDO。现在,我知道MySQLi有real_escape_string,但是如何使用我的删除(以及其他功能)并保持尽可能安全。
由于我是PDO的新手,如果我错过任何支票(或其他任何我可以做的以保证其安全),请告诉我 - 一旦完成,我会问代码审查基础,以审查我的类,以确保它是安全的。
答案 0 :(得分:1)
请注意,因为您使用的是PHP文档中不需要的预编译语句。
如果您使用此函数构建SQL语句,强烈建议您使用PDO :: prepare()来准备带有绑定参数的SQL语句,而不是使用PDO :: quote()将用户输入插入到SQL语句中。带有绑定参数的预处理语句不仅更易于移植,更方便,不受SQL注入的影响,但执行速度通常比内插查询快得多,因为服务器端和客户端都可以缓存查询的编译形式。
所以你可以避免整个逃避过程。
但是,供您参考的是PDO的quote
功能,
<?php
$conn = new PDO('sqlite:/home/lynn/music.sql3');
/* Simple string */
$string = 'Nice';
echo 'Unquoted string: ' . $string . '\n';
echo 'Quoted string: ' . $conn->quote($string) . '\n';
?>
<强>输出强>
Unquoted string: Nice
Quoted string: 'Nice'