<?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
你可以:
$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。请注意,为了安全地使用MySQL与PDO,你必须禁用模拟预处理语句:
$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)。我也想知道你是否真的需要常量在你的代码,因为通常你将只需要一个连接每个请求(到同一个数据库),所以你不需要有那些全局浮动,如果你只是创建连接一次,并将连接传递到需要它的代码部分。
在上面的代码中没有定义一个名为root
的常量。相反,您定义了一个名为DB_USER
的常量,其值为"root",另一个名为DB_PASSWORD
的常量具有相同的值。查看define()
的PHP文档页面,了解该类常量如何工作的更多信息。
试试这个:
$DBH = new PDO( "mysql:host=" . DB_HOST . "; dbname=" . DB_NAME,
DB_USER,
DB_PASSWORD
);
你需要把你的'root'
字符串放在单引号