"致命错误:捕获到PDOException异常,信息为"

3
我正在尝试运行一个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;
        ?>

2
在testdb_connect()函数中,$username和$password的变量作用域...不要将try/catch放在函数定义周围,而是放在对该函数的调用周围。 - Mark Baker
1
$username$password不在函数testdb_connect()的作用域内。要么将它们作为参数传递给该函数,要么不必使用该函数,直接调用new PDO(...)即可。 - Michael Berkowski
@bobafart - 将它们作为参数传递给testdb_connect()函数。 - Mark Baker
Michael,我需要创建这个函数,否则我将会遇到一个作用域问题,因为我不想使用全局的$dbh。你能告诉我正确的代码结构吗?谢谢!并且最高效的方式是什么?这是我第一次使用PDO。 - bobafart
学习以 E_ALL 错误报告级别编程。 - Your Common Sense
显示剩余2条评论
1个回答

6
/*** 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();
}

我刚刚完成了这个Mark。谢谢你的帮助。与旧的MYSQL查询相比,PDO的方式非常冗长。一定有更好的方法来构建PDO查询的代码结构。这是您这些专业程序员构建简单PDO查询的方式吗? - bobafart
使用Mark的上述代码可以消除致命错误问题。谢谢Mark。然而,现在我的ECHO输出没有返回任何内容。查询是有效的,因为mySQL表中包含数据,字段不为空。有什么想法为什么没有输出? - bobafart
大多数人会使用PDO的包装类,采用面向对象的方法... 实例化类时,将连接细节作为参数传递,并提供getconnection()方法;然后可以将该类注入到任何其他需要它的函数/方法中。 - Mark Baker
你能给我一个包装类的例子吗?是时候学习更多了,谢谢。 - bobafart
http://codereview.stackexchange.com/questions/29362/very-simple-php-pdo-class - Mark Baker
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接