4

我是 php 和 PDO 的新手,所以我阅读了对类似帖子的回复->

PDO真的不使用mysql准备好的语句吗?是的,默认情况下(至少在我测试的版本中),但是可以手动打开本机模式。如果没有,是否可以通过使用 PDO::ATTR_EMULATE_PREPARES 设置强制执行此操作,名称非常不言自明。$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 你应该这样做吗?这是所有问题中最难的问题。好吧,我会说 - 是的,你应该。如果您选择 PDO 作为您的数据库驱动程序,那么在仿真模式下使用它是没有意义的。
你的常识

准备好的语句是否不受 SQL 注入的影响,如果从 'true'->false 进行更改,为什么要更改?什么是原生模式??

4

2 回答 2

3

从那以后我改变了主意。

首先,每种模式都同样安全。
使准备好的语句安全的不是本机绑定,而是参数化语句的一般原则,它完成了格式化,从而产生了无懈可击的查询。

所以,我宁愿保持 emulation mode on,因为它对一般的 Web 使用更有意义,并且允许一些小便利,例如更明智的错误消息(在查询中实际替换数据)或多个具有相同名称的占位符。

从模拟更改为本机模式的唯一原因是准备好的语句的另一个好处 - 可以多次执行一次准备好的语句。但是,如上所述,它很少需要。

于 2013-11-01T21:50:46.097 回答
-5

取决于对您来说最重要的是什么 - 简单的编码和几行或正确的方法来避免 sql 注入。只要您不使用庞大的数据库,它对速度没有影响,所以最好不要使用它,您可以编写如下代码

$result = $this->db->select('SELECT * FROM tbl_users WHERE login = :login AND password = :password', $arraiul);

或者像那样

function editusers(){
        $id = $_POST['id'];
        $name = $_POST['name'];
        $login = $_POST['username'];
        $password = $_POST['password'];
        $email = $_POST['email'];
        $power = $_POST['power'];
        if ($password ==''){
            $sqlstm = "UPDATE tbl_users SET name='$name', login='$login', email='$email', power='$power' WHERE id='$id'";
        } else {
            $sqlstm = "UPDATE tbl_users SET name='$name', login='$login', password=MD5('$password'), email='$email', power='$power' WHERE id='$id'";
        }
        $sth = $this->db->prepare($sqlstm);
        $sth->execute();        
    }
enter code here
于 2013-11-01T21:54:29.283 回答