2011-08-14 24 views
8
<?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); 
} 
?> 

控制檯[08月14日2011年15點59分59秒] PHP公告:未定義的常量根使用 - 假設 '根' 在 /應用程序/ MAMP/htdocs3/nettuts/PHP/PDO for Database Access/mysql_pdo_connect.php on line 20.「在PDO使用PHP常量在OS X的回報「要求

我已經「谷歌搜索」,並找到了部分答案。所以我希望在這裏完成。

TIA

+1

你也不要使用'$ PHP = 「用htmlspecialchars」'解決方法進行插值常數。這是可能的,但不是其中一個有用的特殊情況。通常情況下,PDO DSN初始化字符串和concat常量:'= new PDO(「mysql:host =」。DB_HOST。「dbname =」。DB_NAME。「;」)' – mario

回答

17

你這樣做:

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

UPDATE

我也看到你正在使用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

0

你需要把你的'root'在單引號

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 
      ); 
+0

這些引號的排列正是我需要。我有...新的PDO(「mysql:host = DB_SERVER ...」),這對我造成了一個錯誤。 – Mark