【问题标题】:Does the PHP's define() not work with PDO connection string?PHP 的 define() 是否不适用于 PDO 连接字符串?
【发布时间】:2019-07-04 12:59:45
【问题描述】:

我使用 PHP 的 define() 来为我的 PDO 连接字符串定义常量,即。在 mysqli 中。但是,它似乎不起作用。当我使用下面的代码时,我不断收到错误:Connection failed: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)

当我不使用 PHP 的 define() 函数传入我的连接变量时,PDO 连接字符串将起作用。我正在使用 PHP 7、MySQL 8 和 Apache 2.4。

问题代码如下:

error_reporting(E_ALL); //check all type of errors
ini_set('display_errors', 1); // display those if any happen

//Database Connection Constant
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', 'root');
define('DB_NAME', 'gallery_db');

echo DB_PASS;
//phpinfo();

//$conn = mysqli_connect(DB_HOST,DB_USER,DB_PASS,DB_NAME);


try {
    $dbc = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . "," . DB_USER, DB_PASS);
    // set the PDO error mode to exception
    $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    if ($dbc) {
        echo "connected";
    }
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

工作连接代码:

$servername = 'localhost';
$username = 'root';
$password = 'root';
$dbn = 'gallery_db';

//phpinfo();

try {
    $dbc = new PDO("mysql:host=$servername;dbname=$dbn", $username, $password,
        array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_PERSISTENT => false
        ));
    // set the PDO error mode to exception
    $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    if ($dbc) {
        echo "connected";
    }
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

为什么 PHP define() 在 PDO 的连接字符串中不起作用?

【问题讨论】:

  • 您已在 DSN 中包含最后一个逗号:DB_NAME.",". DB_USER

标签: php pdo


【解决方案1】:

首先你试试这个:

$dbc = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.",". DB_USER, DB_PASS);

这只有两个参数,但是PDO需要3个:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>

https://php.net/manual/en/pdo.connections.php

发生的情况是您的密码常量有效,但进入了连接的用户名部分。

修复:

$dbc = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS);

【讨论】:

  • 确实如此。不过它不应该污染问答网站
【解决方案2】:

改变

$dbc = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.",".DB_USER, DB_PASS);

$dbc = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS);

【讨论】:

    猜你喜欢
    • 2017-10-15
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2016-09-06
    • 1970-01-01
    • 2015-09-16
    相关资源
    最近更新 更多