【问题标题】:Can't properly connect to MySql with PDO无法使用 PDO 正确连接到 MySql
【发布时间】:2013-06-23 21:39:12
【问题描述】:

首先,我刚刚将所有PHP 文件切换为使用PDO,这很高兴。但是我对PHP 不是很有经验,更不用说PDO 所以我遇到了问题。我在 SQL 数据库中运行以下查询,它返回正确的值。

SELECT * 
FROM table_gon_0621_516
WHERE id =  '1'

现在我在我的PHP 中使用它

require_once ("../Android/connect_db.php");

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$table_name = 'table_gon_0621_516';

try { 

    $names = $db->query("
        SELECT * 
        FROM `".$table_name."` 
        WHERE `id` = '1'
        ");

    $rows = $names->fetchAll(PDO::FETCH_ASSOC);
    $col_map = array_flip($rows);
    echo '<pre>', print_r($rows, true), '</pre>';
} catch (PDOException $e){
    die($e->getMessage());
}    

我在浏览器中收到此错误

SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected

这是我的连接代码

<?php

$config['db'] = array (
    'host'      => 'localhost',
    'username'  => 'admin',
    'password'  => 'xxxx', //checked and correct
    'dbname'    => 'xxxx_beta' //checked and correct
);

$db = new PDO(
    'mysql:host = '.$config['db']['host'].';
    dbname = '.$config['db']['dbname'], 
    $config['db']['username'], 
    $config['db']['password']
);
?>

此页面加载正确,没有错误,我连接成功。我做错了什么?

编辑

我变了

$data = $names->fetchAll(PDO::FETCH_ASSOC);

$data = $names->fetch(PDO::FETCH_ASSOC);

我仍然遇到同样的问题。我还更新了上面的代码以显示此更改

第二次编辑

我更改了上面的代码,现在收到一条新消息,我假设我没有连接?

【问题讨论】:

  • 是否有完整的错误报告和显示?
  • 由于您将$table_name 粘贴到查询中,您可以将FROM `".$table_name."` 替换为FROM `$table_name`
  • @mzedeler 很好,我不知道,我会试试的。谢谢!
  • 找出问题所在的一种方法是将die("HERE");放在第一行之后。如果您看到 HERE 则不是,您继续将 die("HERE"); 向下移动一行,直到您看到服务器错误,这就是该行。在没有错误报告的情况下进行调试有点慢,但它可以工作。
  • 显示您创建 PDO 对象的connect_db.php 的内容

标签: php mysql pdo


【解决方案1】:

改变

$db = new PDO(
    'mysql:host = '.$config['db']['host'].';
    dbname = '.$config['db']['dbname'], 
    $config['db']['username'], 
    $config['db']['password']
);

$db = new PDO('mysql:host='.$config['db']['host'].';dbname='.$config['db']['dbname'], 
    $config['db']['username'], 
    $config['db']['password']
);

$db = new PDO(
    "mysql:host={$config['db']['host']};dbname={$config['db']['dbname']}",
    $config['db']['username'], 
    $config['db']['password']
);

显然 MySql PDO 驱动程序不喜欢 DSN 中的空格

mysql:host='.$config['db']['host'].';dbname='.$config['db']['dbname']
          ^^                               ^^

【讨论】:

  • 不开玩笑?我只是想让它易于阅读……哈哈。我会试试这个,我真诚地希望你是对的
  • 成功了!我不敢相信这是问题所在,对于易于阅读的代码来说非常重要。从现在开始,如果必须的话,我会把它放在一条线上。非常感谢。
  • @i_me_mine 您仍然可以使其易于阅读。只需将单引号和分号移到下一行,就在“dbname”之前
  • 快速更正,它可能是 MySQL 驱动程序解释 DSN,而不是 PDO 本身。奇怪的是,即使在像 PDO 这样的抽象层中,这些字符串也没有标准格式,不同的数据库驱动程序对细节的解释也不同。
  • @IMSoP 够公平的。由于我无法检查其他驱动程序,因此我在答案中明确说明了 mysql pdo 驱动程序。谢谢。
猜你喜欢
  • 2022-01-18
  • 2014-05-21
  • 2012-05-21
  • 2013-02-14
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2023-04-09
  • 2017-12-06
相关资源
最近更新 更多