-2

刚开始使用 PDO。请解释一下我的连接错误。它总是显示“您已连接”。

    <?php

       define('user','root');
       define('pass','');
       define('db','login_db');

       try
          {
       $dbh = new PDO("mysql:host = localhost; dbname = db",user,pass);
       echo "You are connected";
          }
       catch(PDOException $e)
          {
       echo $e -> getMessage(); 
          }
    ?>

还为您了解的 PDO 提供一些教程或电子书。提前致谢。

4

2 回答 2

1

该问题是由您的数据源名称 (DSN)(PDO 连接字符串中的第一个参数)中的 2 个语法错误引起的。

错误

  1. 您不能将 db 常量作为"...dbname = db". 由于db用双引号括起来,并将被解释为字符串而不是常量。
  2. 您的 DSN 中不能有空格。它应该是:

    "mysql:host=localhost;dbname=login_db" //no spaces.
    

我已经对此进行了测试,它表现出一些奇怪的行为:

  • 具体来说,似乎是第一个符号host和第一个=符号之间的空格导致了问题。如果有空格,"You are connected"即使“localhost”拼写错误也会回显。
  • dbname同样,如果和它的符号之间有一个空格=,即使指定的数据库名称不正确,它也会显示为连接。

我的猜测是,这是 PDO 类如何解析 DSN 的一些怪癖。

解决方案

从 DSN 中删除所有空格。

您还需要以不同的方式传入您的数据库名称。有不同的方法来解决这个问题。我建议您使用变量而不是常量定义,以免出现更多奇怪的调试错误:

$host = 'localhost';
$user = 'root';
$pass = '';
$db   = 'login_db';

try{
    $dbh = new PDO("mysql:host=$host;dbname=$db",$user,$pass);
    echo "You are connected";
}
catch(PDOException $e){
    echo $e -> getMessage(); 
}

至于好的教程,你可以看看这些:

Net.tuts+ : PHP 数据库访问

Net.tuts+ : 为什么使用 PDO

当然,不要忘记 php.net 文档。

php.net:PDO

于 2012-11-14T08:45:58.933 回答
0

常量标识符应该是大写的:

 define('USER','root');

如果你想使用常量,你可以这样做:

$dbh = new PDO("mysql:host = ". HOST .";dbname=" . DB ,USER,PASS);
于 2012-11-14T05:57:06.067 回答