【问题标题】:Fatal error: Uncaught exception 'PDOException' with message [duplicate]致命错误:带有消息的未捕获异常“PDOException”[重复]
【发布时间】:2014-07-14 08:45:50
【问题描述】:

我正在尝试运行 MySQL PDO 查询。我不确定为什么会出现致命错误。我检查了其他帖子,但他们的答案似乎没有解决我的问题。

脚本连接数据库正常。用户名和密码是正确的,我已经在下面的脚本中删除了它们。

我的输出:

Connected to database
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[28000] [1045] Access denied for user 'nobody'@'localhost' (using password: NO)' in /home/a/public_html/d/inc/header.php:34 Stack trace: #0 /home/a/public_html/d/inc/header.php(34): PDO->__construct('mysql:host=;dbn...', NULL, NULL) #1 /home/a/public_html/d/inc/header.php(43): testdb_connect() #2 /home/a/public_html/d/article.php(3): include('/home/a/p...') #3 {main} thrown in /home/a/public_html/d/inc/header.php on line 34

我的代码:

<?php
    /*** MySQL  hostname ***/
    $hostname = 'localhost';
    /*** MySQL  username ***/
    $username = 'removed';
    /*** MySQL  password ***/
    $password = 'removed';
    try {
        function testdb_connect(){
            $dbh = new PDO("mysql:host=$hostname;dbname=removed", $username, $password);
            return ($dbh);
        }
            echo 'Connected to database';
        }
    catch(PDOException $e) {
        echo $e->getMessage();
    }

    $dbh = testdb_connect();

    $id = $_GET[id];
    echo 'dfsdfs ' . $id;
    var_dump($dbh);
    $sql = "SELECT * FROM 'radiologyArticles' WHERE 'id' = :id";
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(':id', $id);
    $stmt->execute();
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

?>

        <section>
            <header>
                <h2><?php echo $row['articleTitle']; ?></h2>
                <h3>A generic two column layout</h3>
            </header>
            <p>
                <?php echo $row['articleBody']; ?>
            </p>
        </section>

        <?php
    }
            // Close the PDO connection
            $link = null;
        ?>

【问题讨论】:

  • 但是您没有成功连接。 echo 'Connected to database'; 被称为你调用你的连接testdb_connect()
  • testdb_connect() 函数中 $username 和 $password 值的变量范围......并且不要将 try/catch 放在函数定义周围,将其放在对函数的调用周围
  • $username$password 不在函数 testdb_connect() 的范围内。要么将它们作为参数传递给该函数,要么不理会该函数而直接调用new PDO(...)
  • Mark Ba​​ker,我应该在哪里放置 $username 和 $password 以防止范围界定问题?谢谢
  • @bobafart - 将它们作为参数传递给 testdb_connect() 函数

标签: php mysql pdo


【解决方案1】:
/*** MySQL hostname ***/
$hostname = 'localhost';
/*** MySQL username ***/
$username = 'removed';
/*** MySQL password ***/
$password = 'removed';

function testdb_connect ($hostname, $username, $password){
    $dbh = new PDO("mysql:host=$hostname;dbname=removed", $username, $password);
    return $dbh;
}

try {
    $dbh = testdb_connect ($hostname, $username, $password);
    echo 'Connected to database';
} catch(PDOException $e) {
    echo $e->getMessage();
}

【讨论】:

  • 我刚刚做了这个标记。谢谢您的帮助。与旧的 MYSQL 查询相比,PDO 方式非常冗长。必须有更好的方法来构造 PDO 查询的代码。这就是你们专家编码人员构建简单 PDO 查询的方式吗?
  • 使用 Mark 的上述代码消除了 FATAL ERROR 问题。谢谢马克。但是,现在我的 ECHO 输出状态什么也不返回。该查询有效,因为 mySQL 表中包含数据,字段不为空。知道为什么没有输出吗?
  • 大多数会使用 PDO 的包装类,采用 OO 方法...实例化类,将连接详细信息作为参数传递,并提供 getconnection() 方法;然后该类可以在任何需要的地方注入到任何其他函数/方法中
  • 你能指出一个包装类的例子吗?是时候了解更多了。。谢谢
  • 此外,有没有一种方法可以使用 PDO 对原始 mySQL 查询进行错误检查?在旧方法中,我可以简单地回显 $sql,然后将输出剪切并粘贴到 mySQL 中以测试查询以确保它是准确的。似乎无法用准备好的语句做到这一点,有没有办法做到这一点?谢谢
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多