【问题标题】:MySQL won't read password from configuration fileMySQL 不会从配置文件中读取密码
【发布时间】:2012-08-27 19:20:06
【问题描述】:

我的网站上有一个 html 表单,我正在尝试处理数据,然后将其存储在我服务器上的 mysql 数据库中。为了通过 php 安全地连接到 mysql,我已按照 here 的建议将登录信息放在主 webroot 之外的配置文件中。

这样编写的代码可以无缝执行:

<?php
$mysqli = mysqli_init( );
$mysqli->options(MYSQLI_READ_DEFAULT_FILE, "/this/is/the/filepath/to/my.cnf");
$mysqli->real_connect(NULL, NULL,'*********',NULL );  

if (mysqli_connect_errno()) {
    printf("Connect failed: ", mysqli_connect_error());
    exit();
}

$email = $mysqli->real_escape_string($_POST['email']);

$mysqli->query("INSERT INTO subscribetest (email) VALUES ('$email')");  
?>

但是当我取出密码时,像这样:

<?php
$mysqli = mysqli_init( );
$mysqli->options(MYSQLI_READ_DEFAULT_FILE, "/this/is/the/filepath/to/my.cnf");
$mysqli->real_connect(NULL,NULL,NULL,NULL ); 

if (mysqli_connect_errno()) {
    printf("Connect failed: ", mysqli_connect_error());
    exit();
}

$email = $mysqli->real_escape_string($_POST['email']);

$mysqli->query("INSERT INTO subscribetest (email) VALUES ('$email')");
?>

代码崩溃,我收到错误消息:'警告:mysqli::real_connect()。 'user'@'webaddress.net' 的访问被拒绝(使用密码:NO)'

为什么我的 php 脚本可以读取除了配置文件中的密码之外的所有内容?它能够从配置文件中读取用户名、主机和数据库;密码是唯一一个被遗漏的密码。我到处寻找,花了几个小时,但我找不到任何解决方案。有没有其他人有这个问题?我能做什么?

【问题讨论】:

  • 由于错误状态,您需要检查连接。您正在传递NULL 的所有内容,您有没有密码的有效用户吗?

标签: php mysql html forms mysqli


【解决方案1】:

documentation 表示将real_connect() 中的密码参数设置为NULL 表示“用户不需要密码”。如果你不带任何参数调用它是否有效(它们都是可选的)?

【讨论】:

  • 我尝试在没有任何参数的情况下调用它,我得到的错误与所有参数设置为 NULL(也就是从配置文件中读取)时得到的错误相同,除了密码。您参考了 real_connect(); 的 php 文档; real_connect (dev.mysql.com/doc/refman/5.0/en/mysql-real-connect.html) 的 mysql 文档说,您可以通过将这些参数设置为 NULL 来指示 real_connect() 从选项文件中读取参数:“可以从选项文件中获取值,而不是从mysql_real_connect() 调用中的显式值。"
  • 好的,所以您的选项文件可能有问题。可以发一下吗?
  • 配置文件内容如下: '[client] host = host.com user = newsletter password = ******** database = ed_newsletter' 我知道密码和主机名是正确的因为当我将它们显式地放在 real_connect() 调用中时(也就是将它们写在 php 代码中),MySQL 语句就会正确执行。
  • 奇数。如果您在服务器上有一个 shell,运行 mysql 没有任何参数会登录吗?您能否将密码更改为仅 ASCII 字符以测试 PHP 解析选项文件是否有问题(可能引用密码有帮助,例如 password="blahblah")?
  • 更好的是,你可以创建一个空的选项文件并逐行添加,看看PHP是否被冒犯了?
【解决方案2】:

这个错误似乎仍然存在:https://bugs.php.net/bug.php?id=43812

解决方法:

$iniData = file_get_contents('/etc/mysql/debian.cnf');
$iniData = preg_replace('/#.*$/m', '', $iniData);
$mysqlConfig = parse_ini_string($iniData, true);
$mysqli = new mysqli( $mysqlConfig['client']['host'], $mysqlConfig['client']['user'], $mysqlConfig['client']['password'] );
if ( $mysqli->connect_error ) {
    die(sprintf("MySQL Connect Error: %s", $mysqli->connect_error));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    相关资源
    最近更新 更多