在PDO连接字符串中使用常量并使用PDO连接调用函数

时间:2013-04-23 08:18:16

标签: php pdo constants

我在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();

2 个答案:

答案 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();