未捕获的异常“PDOException”消息“无效的数据源名称”

Posted

技术标签:

【中文标题】未捕获的异常“PDOException”消息“无效的数据源名称”【英文标题】:Uncaught exception 'PDOException' message 'invalid data source name' 【发布时间】:2013-11-13 11:37:16 【问题描述】:

我正在尝试使用 PDO 连接到我的数据库并在页面上显示一些博客文章。 但是我收到此错误消息:

致命错误:未捕获异常“PDOException”,消息“无效” 第 61 行 index.php 中的数据源名称...

我一直在寻求帮助,但真的不知道出了什么问题,所以如果有人有任何想法,非常感谢!

我有一个单独的 connect.inc.php 文件,它包含在 index.php 文件中。

这是 connect.inc.php 文件:

<?php
class DB extends PDO

function database_connection() 
   $db_host = "localhost";
   $db_name = "blogdata";
   $db_user = "username";
   $db_pass = "password";
   try 
   global $db_host, $db_name, $db_user, $db_pass;
   $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
   
   catch(PDOException $e) 
   die( 'Query failed: ' . $e->getMessage() );



?>

这是 index.php 文件中错误消息中指出的部分:

<?php
    require 'connect.inc.php';  
    $db = new DB('blogdata');

    $query = "SELECT * FROM blogposts";
    if ($result = $db->query($query)) 
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) 
        echo ' 
            <section id="content">
            <article class="post_title"><h3> ', $row['title'],' </h3></article>
            <article class="post_message"> ', nl2br ($row['message']),' </article>
            <article class="post_time"> ',$row['time'],' </article>
            </section>
            ';
        
     ;
    ?>

【问题讨论】:

首先,这段代码极其不一致。 DB 类有 database_connection() 方法,该方法无处调用。您使用 'blogdata' 参数调用它,但再次没有使用它。它是真的你运行的实际代码吗? 【参考方案1】:

明白了。

出于某种原因,您正在从 PDO扩展您的课程。因此,您的“博客数据”被视为 DSN。

摆脱你的 DB 类并使用原始 PDO

connect.inc.php:

<?php 
$db_host = "localhost";
$db_name = "blogdata";
$db_user = "username";
$db_pass = "password";
$db = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

index.php:

<?php
require 'connect.inc.php'; 

$query = "SELECT * FROM blogposts";
$result = $db->query($query);
while ($row = $result->fetch(PDO::FETCH_ASSOC)) 

【讨论】:

谢谢!最后!这解决了问题!但是,我明白您对上述评论的意思。一段时间以来,我一直在尝试使用连接代码,首先我有一个更好的一致代码,当我不知道自己在做什么时,我搞砸了:/将连接包装在一个函数中比使用原始 PDO 更好吗? 只有当你知道你在做什么的时候。事实上,PDO就是已经是这样一个连接处理类了。它几乎拥有普通用户所需的一切。因此,最好保留原始 PDO。 @YourCommonSense,我按照建议做了。但是,它没有从 connect.inc.php 文件中获取内容。例如:我在类中的 index.php 处创建了 2function。一种功能用于插入,另一种功能用于选择。插入工作正常。但是,选择无法获取连接。那么您对此有什么建议吗?【参考方案2】:

为什么在初始化数据库变量后将它们声明为全局变量?我无法对其进行测试,但如果内存服务会从全局中提取现有值,覆盖您刚刚声明的值。

我不同意不使用继承类 - 能够编写自定义构造函数意味着您可以设置所有模式和属性一次,然后只需调用自定义构造函数即可自动完成。比每次都做要干净得多。

【讨论】:

【参考方案3】:

为了以后的参考,可以保留DB类,参考下面与php类关系不大的解决方案:

enter link description here

【讨论】:

以上是关于未捕获的异常“PDOException”消息“无效的数据源名称”的主要内容,如果未能解决你的问题,请参考以下文章

带有消息“SQLSTATE [42000]”的未捕获异常“PDOException”:语法错误或访问冲突:

致命错误:未捕获的异常“PDOException”和消息“找不到驱动程序”

致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE [42000]:语法错误或访问冲突 PHP 和 PDO

致命错误:未捕获PDOException:SQLSTATE [HY093]:参数号无效:无参数

致命错误:第 19 行的 C:\xampp\htdocs\register.php 中抛出未捕获的异常“PDOException”

日期时间格式无效:1292 日期时间值不正确 [重复]