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


Using constants in a PDO connection string and calling a function with a PDO connection

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

我只在需要时使用该函数连接DB。对于不需要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();

事实上,这个问题与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();

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

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