我在PDO连接中使用常量以及调用包含PDO连接的函数时遇到问题。
我正在使用该功能仅在需要时连接数据库。在不需要DB工作的页面上,无需连接。
我已经尝试了很多,但无法想象我哪里出错了。
<?php
/** The name of the database */
define('DB_NAME', 'dev-db');
/** MySQL database username */
define('DB_USER', 'root');
/** MySQL database password */
define('DB_PASSWORD', 'dxdb');
/** MySQL hostname */
define('DB_HOST', 'localhost');
function connect(){
try
{**//Here's where the first problem is**
$conn = new PDO('mysql:host=DB_HOST;dbname=DB_NAME',DB_USER,DB_PASSWORD);
$conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e)
{
echo 'ERROR: ' . $e->getMessage();
}
}
connect();// Here's where it fails again
$sql = 'insert into names (names) values (:what)';
$what = "testValue";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':what', $what, PDO::PARAM_STR, 5);
$stmt->execute();
答案 0 :(得分:2)
更好的方法是直接使用connect语句,在你的情况下不需要函数。
$conn = new PDO('mysql:host='. DB_HOST .';dbname='. DB_NAME , DB_USER,DB_PASSWORD);
答案 1 :(得分:2)
事实上,这个问题与PDO无关,而是与PHP 字符串无关。
所以,问题是,“如何在字符串中使用常量?”。
答案很简单 - 用字符串连接它们。
此外,您连接的方式是错误的。请参阅tag wiki了解正确的方法
你的第二个问题与PDO无关,仅仅是variable scope问题。只需让你的函数返回$conn
变量,然后调用它
$conn = connect();
此外,在使用PDO的情况下为主机和数据库定义单独的常量没有意义 - DSN是一个独特的实体,类似于其他驱动程序中的HOST。
所以,代码可能是(虽然我不确定dev-db是否是有效的数据库名称):
define('DB_DSN', 'mysql:host=localhost;dbname=dev-db;charset=utf8');
define('DB_USER', 'root');
define('DB_PASSWORD', 'dxdb');
function connect()
{
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
return new PDO(DB_DSN,DB_USER,DB_PASSWORD, $opt);
}
$conn = connect();