【问题标题】:How can I solve the uncaught PDOException "SQLSTATE[HY000] [1045] Access denied for user..."?如何解决未捕获的 PDOException "SQLSTATE[HY000] [1045] Access denied for user..."?
【发布时间】:2017-11-28 05:31:23
【问题描述】:

我正在为我的 MySQL 数据库使用免费的托管解决方案。但是,当我尝试通过我的 PHP 代码连接到它时,它会抛出一个未捕获的 PDOException 错误,并且我的访问被拒绝。由于我的凭据正确,我似乎无法找到连接被拒绝的原因。

我正在使用Ionic 2 框架,如果有帮助的话。

错误:

<b>Fatal error</b>:  Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'sql10181809'@'153.92.0.10' (using password: YES) in /storage/ssd5/403/2053403/public_html/escanerproducto.php:33
Stack trace:
#0 /storage/ssd5/403/2053403/public_html/escanerproducto.php(33): PDO-&gt;__construct('mysql:host=sql1...', 'sql10181809', '\xE2\x81\xA0\xE2\x81\xA0\xE2\x81\xA0dfFf6l...')
#1 {main}
  thrown in <b>/storage/ssd5/403/2053403/public_html/escanerproducto.php</b> on line <b>33</b><br />

PHP连接代码:

<?php
    @$db = new PDO("mysql:host=sql10.freesqldatabase.com;dbname=sql10181809", "sql10181809", "PASS");

    if($db){
        $sql = "select * from producto WHERE
                    codigo_barra='" . $codigodebarra . "'";

        $query = $db->prepare($sql);
        $query->execute();
        $query->setFetchMode(PDO::FETCH_NUM);
        if($fila = $query->fetch()){
            $nombre = $fila[2];
            $resultados_finales = array("nombre"=>$nombre);
            echo json_encode($resultados_finales);
        }
        else{
            $resultados_finales = array("mensage"=>"error");
            echo json_encode($resultados_finales);
        }
    }
    else {
        $resultados_finales = array('mensage' => "ERROR.");
        echo json_encode($resultados_finales);
    };
?>

【问题讨论】:

  • 也许甚至可以遵循手册中关于测试错误或捕获异常的基本内容The manual.it should be your first port of call not you last
  • 该错误信息通常表示您的密码错误。
  • @$db = new PDO... 中的 @ 表示“静默错误”。在这种情况下它可能没有任何区别,但是当试图理解错误时,沉默是你想要的最后一件事。您的示例代码距离成为minimal reproducible example 也有很长的路要走;尽可能简化它,您将专注于实际导致问题的部分。
  • 当使用本地主机时,它连接得很好。
  • 问题在于您的密码

标签: php mysql sql


【解决方案1】:

捕获异常的最佳方法是将代码放入 try-catch 块中。但在你的情况下,我认为你输入的密码不正确。导致错误(异常)的代码应该在 try 块中,然后像这样捕获它:

try{
   $db = new PDO("mysql:host=sql10.freesqldatabase.com;dbname=sql10181809",
                 "sql10181809", "PASS");
   $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
    echo $e->getMessage() . '  ' . '   ' . getCode() . '  ' . getLine() . '
      ' . getFile();
}

您可以阅读有关异常处理的更多信息here

【讨论】:

  • 为什么在带有“getMessage”(最后一个文字字符串)的行中的一个文字字符串的中间有一个换行符?换行符应该在那里吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2020-07-14
  • 2023-03-23
  • 2020-12-18
  • 2014-09-30
相关资源
最近更新 更多