使用 bind_param() 之类的东西来设置单元格名和详细信息 [duplicate] 的安全方法

Safe way to use something like bind_param() to set cellname and detail [duplicate]

提问人:Bjorn T 提问时间:8/18/2020 最后编辑:DharmanBjorn T 更新时间:8/18/2020 访问量:34

问:

我想在类中制作一个简单的函数,可以更新数据库中的每个单元格。

就像我现在可以用来检索电子邮件一样,我想用echo $user->cell('email');

$user->update('email','[email protected]');

但据我所知,查询中不支持“?=? 有人可以安全解决这个问题吗?bind_param()

class User{
    private $details;
    private $id;
    function __construct($userId){
        $db = Database::getInstance();
        $mysqli = $db->getConnection();
        $stmt = $mysqli->prepare("SELECT * FROM users WHERE id=?");
        $stmt->bind_param("i",$userId);
        $stmt->execute();
        $result = $stmt->get_result();
        if($result->num_rows == 1){
            $this->details = $result->fetch_assoc();
            $GLOBALS['userId'] = $userId;
        }
        $stmt->close();
    }
    function cell($cell){
        return $this->details[$cell];
    }
    function update($cell,$value){
        $db = Database::getInstance();
        $mysqli = $db->getConnection();
        $stmt = $mysqli->prepare("UPDATE users SET ?=? WHER id=".$this->id);
        $stmt->bind_param("ss",$cell,$value);
        $stmt->execute();
        return true;
    }
}
php oop 安全性 mysqli bindparam

评论

2赞 Kevin 8/18/2020
您可以在类属性中有一个有效列名列表,然后从那里进行检查
1赞 deceze 8/18/2020
您尝试安全地绑定列名,但您显然将 ...!?"... id=" . $this->id
0赞 Bjorn T 8/18/2020
凯文,你的意思是在数组中设置该列名,就像我为细节所做的那样?
0赞 Kevin 8/18/2020
@BjornT是的,只需将它们声明为数组即可
0赞 Your Common Sense 8/18/2020
此更新方法效率不高。它应该接受单元格值对的数组。这样,它将能够一次更新单对或多列

答: 暂无答案