3

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

2 回答 2

2

事实上,这个问题与 PDO 无关,而与 PHP字符串有关。

所以,问题是,“如何在字符串中使用常量?”。

答案很简单——用字符串连接它们。

此外,您连接的方式是错误的。参考标签wiki了解正确方法

您的第二个问题再次与 PDO 无关,只是变量范围问题。只需让你的函数返回$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();
于 2013-04-23T08:59:51.560 回答
2

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

$conn = new PDO('mysql:host='. DB_HOST .';dbname='. DB_NAME , DB_USER,DB_PASSWORD);
于 2013-04-23T08:21:28.507 回答