在 AJAX 查询之后使用 jQuery 解释 PDO 错误

Posted

技术标签:

【中文标题】在 AJAX 查询之后使用 jQuery 解释 PDO 错误【英文标题】:Interpret PDO errors with jQuery after an AJAX query 【发布时间】:2014-04-01 10:30:24 【问题描述】:

我正在为我当前的项目编写一个小安装脚本。该脚本的第一个“步骤”要求用户提供他的 mysql 凭据并对其进行测试。一切都是通过使用 jQuery 的 $.ajax 的 AJAX 查询完成的。

我的客户端脚本如下所示:

      <section class="col-md-6" style="display: none;" id="pane2">
            <h1 style="text-align: center;">MySQL Setup</h1>
            <form method="POST" action="stuff.php" role="form" class="installform">
                <input type="text" class="form-control" placeholder="Host" name="host" id="host">
                <input type="text" class="form-control" placeholder="Database Name" name="dbname" id="dbname">
                <input type="text" class="form-control" placeholder="Username" name="sqlusername" id="sqlusername">
                <input type="password" class="form-control" placeholder="Password" name="sqlpassword" id="sqlpassword">
            </form>
            <a><button class="btn btn-primary btn-lg btn-block" id="sqlbutton">Next</button></a>
            <script>
                $(function() 
                    $('#sqlbutton').click(function() 
                        var host = $('#host').val();
                        var dbname = $('#dbname').val();
                        var username = $('#sqlusername').val();
                        var password = $('#sqlpassword').val();

                        var credentials = "host=" + host + "&dbname=" + dbname + "&username=" + username + "&password=" + password;
                        $.ajax(
                            type: "POST",
                            url: "sqlchecker.php",
                            data: credentials,
                            success: function(data) 
                                if (data == 'success') 
                                    $('#sqlbutton').html("All right.");
                                

                                else 
                                    $('#sqlbutton').html("Something is wrong");
                                
                            
                        );
                    );
                );
            </script>

而我的 sqlchecker.php 脚本目前是这样的:

<?php
    $host = $_POST['host'];
    $dbname = $_POST['dbname'];
    $username = $_POST['username'];
    $password = $_POST['password'];

    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');

    // Opens a connection to the database using PDO
    try 
        $db = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password, $options);

    

    catch(PDOException $ex)
    
        die("Couldn't connect to the database. Error code: " . $ex->getMessage());
    

    echo('success');
?>

当然,目前,它绝对不区分错误,如果没有,它会显示“好的”。如果有,则显示“有问题”。但我希望它更具体一点,并告诉用户查询中到底出了什么问题。

我正在寻找一种“解析” PDO 异常,问题是它们返回了一个几乎不可能在 if 语句中使用的完整句子。有没有办法在连接上配置 PDO,所以它只返回一个错误代码,使用 jQuery 更容易解释?

非常感谢您的回答!

【问题讨论】:

我个人建议使用 json (json_encode) 返回信息以供使用。您可以发送一个名为“error”的参数,0 表示没有错误,任何其他值都表示错误。您可以传递错误描述。 感谢您的回答@galchen!那么解释 PDO 错误代码的 PHP 代码会是什么样子呢?我的意思是如果例如 0 表示“无错误”,1 表示“错误的用户名”等,我如何解释 PHP 中的 PDO 异常以将它们“转换”为这些数字? $ex->getMessage() 怎么样? 好吧 getMessage() 输出一个完整的句子,但我只想获取错误代码本身。 Steve B 在他的回答中建议我使用 getCode() 但它输出的字符串与 getMessage() 完全相同... 【参考方案1】:

在异常上调用 getCode 应该会为您提供可以使用的代码。然后,您可以打开它并给您的用户一些适当的反馈。这肯定比试图操纵返回的字符串消息更干净。

$errorCode = $ex->getCode();
switch($errorCode) 
    case 1000:
        //...
        break;
    default:
        //...
        break;

对于我的sql,我相信错误代码会列在这里:

https://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html

【讨论】:

非常感谢,这正是我想要的! 抱歉,您的代码不起作用,当我回显 $errorcode 时,它​​给了我与 $ex->getMessage() 完全相同的句子。 你确定吗?我在这里检查过,对于 PDOExceptions,我在调用 getCode() 时会得到一个数字。这也是手册所说的:uk1.php.net/PDOException 是的,我 100% 确定。仔细检查我的代码,当我在输入错误的用户名后回显 $errorcode 时,它​​输出以下字符串而不是错误代码:“无法连接到数据库。错误代码:SQLSTATE [28000] [1045] 用户拒绝访问'grrggrg'@'localhost'(使用密码:YES)"。 问题已解决。我忘记删除“die(”无法连接到数据库。错误代码:“。$ex->getMessage());”在写这段代码之前......现在我感觉很愚蠢哈哈。

以上是关于在 AJAX 查询之后使用 jQuery 解释 PDO 错误的主要内容,如果未能解决你的问题,请参考以下文章

jquery+ajax实现查询数据时,JSP页面显示“正在加载中...” ,查询完了之后在页面显示查询出来的数据。

jQuery Ajax应用之--天气预报

从 nodeJS 解释器使用 jQuery ajax

用JQuery实现ajax删除数据

如何使用 $.ajax 发送 JSON 而不是查询字符串?

Ajax 跨域和同源策略的解释和使用,使用jQuery跨域,模板引擎artTemplate的使用详细解释+案例