繁体   English   中英

PDO :: ATTR_EMULATE_PREPARES =>否

[英]PDO::ATTR_EMULATE_PREPARES => false

我是php和PDO的新手,所以我读了类似的post->

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

不能从SQL注入中保护准备好的语句,如果从'true'-> false更改,为什么还要更改? 什么是纯模式?

从那以后我改变了主意。

首先,每种模式都同样安全。
不是本机绑定使准备好的语句变得安全,而是参数化语句的一般原理 ,它可以完成格式并因此产生无害的查询。

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

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

取决于对您最重要的内容-易于编码,只需几行代码或执行此操作的正确方法即可避免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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM