我正在将我的代码从使用mysql_*修改为PDO.在我的代码中,我有mysql_real_escape_string()个.这在PDO中的等效值是什么?

推荐答案

不,没有!

从技术上讲,有PDO::quote()个,但很少使用,也不等同于mysql_real_escape_string()

That's right!如果您已经按照使用prepared statements记录的正确方式使用了PDO,那么它将保护您免受MySQL注入.


# Example:

下面是一个使用预处理语句(pdo)的safe数据库查询示例

  try {
     // first connect to database with the PDO object. 
     $db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
       PDO::ATTR_EMULATE_PREPARES => false, 
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
     ]); 
 } catch(\PDOException $e){
     // if connection fails, show PDO error. 
   echo "Error connecting to mysql: " . $e->getMessage();
 }

现在假设连接已经建立,您可以这样执行查询.

if($_POST && isset($_POST['color'])){ 

    // preparing a statement
    $stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");

    // execute/run the statement. 
    $stmt->execute(array($_POST['color']));

    // fetch the result. 
    $cars = $stmt->fetchAll(\PDO::FETCH_ASSOC); 
    var_dump($cars); 
 }

现在,正如你可能知道的,我没有使用任何东西来逃避/净化$_POST["color"]的值.由于PDO和预先准备好的语句的强大功能,这段代码在myql注入中是安全的.


值得注意的是,出于安全考虑,您应该在DSN中传递charset=utf8 as属性,如上图所示,并始终启用

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

因此,数据库查询中的错误不会泄露敏感数据,如目录 struct 、数据库用户名等.

最后但并非最不重要的一点是,有时你不应该described in this answer%信任PDO,并且一定会采取一些额外的措施来防止sql注入,其中一种情况是,如果你使用的是过时版本的mysql [ mysql =< 5.3.6 ] as described in this answer

但是,与使用任何以mysql_开头的函数相比,使用如上所示的准备好的语句总是更安全的

好书

MySQL开发人员PDO教程

Mysql相关问答推荐

将值代入子查询

我如何才能从MySQL过程中获取LARAVEL端的数据?

使用JSON_CONTAINS搜索多个值的原理

当日期附加到MySQL后,如何按日期说明排序?

根据时间戳分组删除

MySQL - 如何根据单列查找重复行?

如何在 Shopware 6 DAL 中实施 Haversine 公式?

MySQL CHECK 约束以确保记录不使用自动增量 ID 引用自身?

MySQL:从 n 个关系表中 Select 所有具有 MAX() 值的行

如何使用同一个表在 2 个字段上左连接

在 SQL 中将列添加为 End_date,间隔为 +100 天

基于两个单元格值的 SQL 过滤表

MySQL查询根据同一表中其他字段的值更新表中的字段

获取Count(*)占GROUP BY中所有项目数的百分比

第 1 行的 CSV 输入中的列数无效错误

考虑到 NodeJS,MySQL 和 MySQL2 有什么区别

使用 mysqldriver 连接数据库时出错

mysql错误'TYPE = MyISAM'

如何将本地托管的 MySQL 数据库与 docker 容器连接

获取最后一组不同的记录