在PDO调用中使用PHP CONSTANTS

时间:2011-08-14 23:07:53

标签: php

<?php # Nettuts Tutorial using PHP Data Objects (PDO),

/**This file contains the database access information
 *This file also establishes a connection to mySQL
 *and selects the database.
 *Set the database access information as constants:
 **/
// print_r(PDO::getAvailableDrivers());

DEFINE('DB_USER', 'root');
DEFINE('DB_PASSWORD', 'root');
DEFINE('DB_HOST', 'localhost');
DEFINE('DB_NAME', 'sitename');

$php = "htmlspecialchars";
try {
    #MySQL with PDO_MYSQL
    // $DBH = new PDO("mysql:host={$php(DB_HOST)}; dbname={$php(DB_NAME)}", root, root};  
    $DBH = new PDO("mysql:host=localhost; dbname= sitename", root, root);

    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    # UH-OH! Typed DELECT instead of SELECT!
    $DBH->prepare('DELECT name FROM people');
} catch (PDOException $e) {
    echo "I'm sorry, Dave. I'm afraid I can't do that.";
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}
?>
  

OS X中的控制台返回“[14-Aug-2011 15:59:59] PHP注意:使用   未定义的常量根 - 假设为'根'   / Applications / MAMP / htdocs3 / nettuts / PHP / PDO for Database   在第20行访问/ mysql_pdo_connect.php。“

我已经“谷歌搜索”并在此处找到了部分答案。所以我希望在这里完成。

TIA

3 个答案:

答案 0 :(得分:20)

你这样做:

$DBH = new PDO("mysql:host=localhost; dbname= sitename", root, root); 

应该是:

$DBH = new PDO("mysql:host=localhost; dbname= sitename", 'root', 'root'); 

带引号。否则PHP认为它是一些常量而不是字符串。但是,通过查看您的代码,我发现您已经定义了constants来访问数据库,所以为什么不这么做呢:

$DBH = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME, DB_USER, DB_PASSWORD); 

<强>更新

我也看到你正在使用MySQL和PDO。请注意,为了safely use MySQL with PDO,您必须disable emulated prepared statements

$DBH = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);
$DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

请注意,我还在DSN字符串中设置了编码(在我的情况下为utf8)。我也想知道你的代码中是否真的需要常量,因为通常每个请求只需要一个连接(到同一个数据库),因此如果只创建一次连接并通过,则不需要让这些全局变量浮动与需要它的代码部分的连接。有关详细信息,请参阅我的related question

答案 1 :(得分:4)

您尚未在上述代码中的任何位置定义名为root的常量。相反,您已经定义了一个名为DB_USER的常量,其中为“root”,另一个名为DB_PASSWORD且值相同。请查看the PHP documentation page for define()以获取有关此类常量如何工作的更多信息。

试试这个:

$DBH = new PDO( "mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, 
                DB_USER, 
                DB_PASSWORD
              ); 

答案 2 :(得分:0)

您需要将'root' 字符串放在单引号中