2013-04-23 47 views
3

我在使用PDO连接中的常量以及调用包含PDO连接的函数时遇到问题。在PDO连接字符串中使用常量并使用PDO连接调用函数

我正在使用函数仅在需要时连接数据库。在不需要数据库工作的页面上,不需要连接。

我试了很多,但不能确定我要去哪里错了。

<?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

你要串联这样的'$康恩=新PDO(“mysql的字符串: host ='。DB_HOST。'; dbname ='.DB_NAME。',DB_USER,DB_PASSWORD);' – HamZa 2013-04-23 08:20:42

+0

哦!旧的东西不需要连接''$ link = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);''所以我认为它在这里是一样的。 – Norman 2013-04-23 08:22:26

+0

那么,PHP会如何判断'echo'DB_HOST';'是一个字符串还是常量?这是一个字符串:-) – HamZa 2013-04-23 08:23:20

回答

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(); 
2

更好的方法是直接使用connect语句,在你的情况下不需要函数。

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

实际上,我想使用该功能,因此只有在需要时才能连接。这个问题我把它放在一起。否则,常量在一个文件中,在另一个文件中连接。即使不需要,连接也会运行。 – Norman 2013-04-23 08:29:30