【问题标题】:Using PHP CONSTANTS in PDO calls在 PDO 调用中使用 PHP CONSTANTS
【发布时间】:2011-10-26 23:36:33
【问题描述】:
<?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 用于数据库 在第 20 行访问/mysql_pdo_connect.php。”

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

TIA

【问题讨论】:

  • 您也不应该使用$php = "htmlspecialchars" 变通方法来插入常量。这是可能的,但不是有用的特殊情况之一。而是分解您的 PDO DSN 初始化字符串并正常连接常量:= new PDO("mysql:host=".DB_HOST." dbname=".DB_NAME.";")

标签: php


【解决方案1】:

你这样做:

$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); 

更新

我还看到您正在使用带有 PDO 的 MySQL。请注意,要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 了解更多信息。

【讨论】:

    【解决方案2】:

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

    试试这个:

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

    【讨论】:

    • 这些引号的排列正是我所需要的。我有 ...new PDO("mysql:host=DB_SERVER..."),这对我造成了错误。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 2012-02-26
      • 2012-03-07
      • 2014-03-11
      • 2015-04-29
      • 1970-01-01
      相关资源
      最近更新 更多