2013-04-23 52 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