PDO :: ATTR_EMULATE_PREPARES =>假

时间:2013-11-01 21:43:15

标签: php pdo

我是php和PDO的新手,所以我读了这篇关于类似帖子的回复>

  

PDO真的不使用mysql准备好的语句吗?是的,通过   默认(至少在我测试的版本中),但可以启用纯模式   手动。如果不是,可以通过雇用来强制这样做   PDO :: ATTR_EMULATE_PREPARES设置,名称很漂亮   不言自明的。 $ dbh-> setAttribute(PDO :: ATTR_EMULATE_PREPARES,   错误的);你应该这样做吗?这是他们所有人最难的问题。   好吧,我会说 - 是的,你应该。如果选择PDO作为数据库驱动程序,   在仿真模式下使用它没有意义。   
- Your Common sense

没有准备好的语句是否可以安全地从SQL注入,为什么从'true'改变 - > false?什么是原生模式?

2 个答案:

答案 0 :(得分:3)

从那时起我就改变了主意。

首先,每种模式都同样安全。
本地绑定不是使预处理语句安全,而是参数化语句的一般原则,它执行完整格式化,从而产生无法查询。

所以,我宁愿在上保持仿真模式,因为它对平均网络使用更有意义,并允许一些小的便利,例如更明智的错误消息(在查询中实际替换了数据)或多个具有相同名称的占位符。

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

答案 1 :(得分:-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