【问题标题】:Silently fails when truly prepared, works when emulated真正准备好时静默失败,效仿时有效
【发布时间】:2015-07-04 20:47:56
【问题描述】:

出于安全考虑,我将 ATTR_EMULATE_PREPARES 选项设置为 false。 而在开发环境中,ATTR_ERRMODE 为 ERRMODE_EXCEPTION。

但是这段代码:

// $this->bdd is juste a regular PDO instance with some options
$req = $this->bdd->prepare('INSERT INTO users VALUES(NULL, :login, :passwd, :email, :firstname, :lastname, :role, :token_id, :confirmed, :registration_date, :last_connexion_date)');

$req->bindValue(':login', $login, PDO::PARAM_STR);
$req->bindValue(':passwd', $passwd, PDO::PARAM_STR);
$req->bindValue(':email', $email, PDO::PARAM_STR);
$req->bindValue(':firstname', $firstname, PDO::PARAM_STR);
$req->bindValue(':lastname', $lastname, PDO::PARAM_STR);
$req->bindValue(':role', $role, PDO::PARAM_INT);
$req->bindValue(':token_id', $token_id, PDO::PARAM_INT);
$req->bindValue(':confirmed', $confirmed, PDO::PARAM_BOOL);
$req->bindValue(':registration_date', $registration_date, PDO::PARAM_STR);
$req->bindValue(':last_connexion_date', $last_connexion_date, PDO::PARAM_STR);

return $req->execute() ? true : $req->errorInfo();

只是静默失败,错误代码为 00000。 在浏览stackoverflow和其他平台时,我发现了一些与“真正准备好的语句”相关的类似错误,可以解决(对我不起作用)。我决定打开仿真,它运行良好。

我的问题:我想保留真正准备好的陈述,我不知道有什么问题......

编辑: 我只是出于测试目的从 PDO 更改为 MySQLi,MySQLi 工作,PDO 不要(并且仍然失败)这里的脚本:

http://pastebin.com/jvjsfFVC

MySQLi 总是做真正准备好的语句

【问题讨论】:

    标签: php mysql pdo prepared-statement


    【解决方案1】:

    如果我们遇到错误,可以在您的代码之间进行 try catch,我们可以看到错误数组而不是空白。

     try {
        $req = $this->bdd->prepare('INSERT INTO users VALUES(NULL, :login, :passwd, :email, :firstname, :lastname, :role, :token_id, :confirmed, :registration_date, :last_connexion_date)');
    
        $req->bindValue(':login', $login, PDO::PARAM_STR);
        $req->bindValue(':passwd', $passwd, PDO::PARAM_STR);
        $req->bindValue(':email', $email, PDO::PARAM_STR);
        $req->bindValue(':firstname', $firstname, PDO::PARAM_STR);
        $req->bindValue(':lastname', $lastname, PDO::PARAM_STR);
        $req->bindValue(':role', $role, PDO::PARAM_INT);
        $req->bindValue(':token_id', $token_id, PDO::PARAM_INT);
        $req->bindValue(':confirmed', $confirmed, PDO::PARAM_BOOL);
        $req->bindValue(':registration_date', $registration_date, PDO::PARAM_STR);
        $req->bindValue(':last_connexion_date', $last_connexion_date, PDO::PARAM_STR);
    $execute = $req->execute();
     } catch (PDOException $error) {
    print_r($error);
    die();
    
    
    }
    

    【讨论】:

    • "display_errors" 为 1,"error_reporting" 为 32767 (E_ALL),所以它应该在失败的情况下显示一些东西,但它没有。只是为了确定,我按照你说的做了,没有发生任何事情......
    • 这个问题你成功了吗?@Petitkoalak
    • 不,我一直问我认识的每个人,我没有得到有效的答案......我必须强制模拟准备好的语句,即使它是潜在的安全漏洞
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多