用户'root'@'localhost'的访问被拒绝(使用密码:否)[关闭]

Posted

技术标签:

【中文标题】用户\'root\'@\'localhost\'的访问被拒绝(使用密码:否)[关闭]【英文标题】:Access denied for user 'root'@'localhost' (using password: NO) [closed]用户'root'@'localhost'的访问被拒绝(使用密码:否)[关闭] 【发布时间】:2014-11-19 10:46:18 【问题描述】:

求助,无法访问数据库。它不能引导我到我的数据库不能使用 mysql_query 进行数据检索。我认为它在我新创建的数据库中系统找不到?但托管网站让我别无选择重命名我的数据库

db_connect.php

<?php

include_once 'psl-config.php';   // As functions.php is not included
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);

?>

我在哪里调用我的用户和数据库。 psl_config.php

<?php
define("HOST", "localhost");     // The host you want to connect to.
define("USER", "xxx");    // The database username. 
define("PASSWORD", "xxx");    // The database password. 
define("DATABASE", "xxx");    // The database name.

define("CAN_REGISTER", "any");
define("DEFAULT_ROLE", "member");

define("SECURE", FALSE);  

?>

$name = $_SESSION ['username'];
$result = mysql_query(" select score1 from members where username = '$name'");

用户名表述正确。 mysql查询代码第14行是bug所在。

<?php
include_once 'includes/db_connect.php';
include_once 'includes/functions.php';

sec_session_start();

if(!isset($_SESSION['username']))
         header("Location: director.php");
    



$name = $_SESSION ['username'];
$result = mysql_query(" select score1 from members where username = '$name'");


?>

我认为它在我新创建的数据库中系统找不到?但托管网站让我别无选择重命名我的数据库

【问题讨论】:

您将mysqli_mysql_ 混合在一起。您还与我们共享您的凭据,这是您不应该这样做的。 请don't use mysql_* functions in new code。 它们不再被维护并且是officially deprecated。看到red box?改为了解prepared statements,并使用PDO 或MySQLi。 This article 将帮助您决定哪个。 这个问题似乎是题外话,因为它没有显示先前的研究,也没有对正在解决的问题的了解最少 使用mysqli 时,您应该使用参数化查询和bind_param 将用户数据添加到您的查询中。 请勿使用字符串插值来完成此操作,因为您将创建严重的SQL injection bugs。 如果标题位置更改后不exit;,脚本将继续... 【参考方案1】:

这一行:

$result = mysql_query(" select...

应该是

$result = $mysqli->query("select...

并将数据库连接传递给查询。

将其用作object oriented style,这就是您的数据库连接。

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);

您目前正在混合使用 MySQL API。这两者不能混用。

仅使用mysqli_。不要在代码或包含的文件中的任何位置包含任何 mysql_ 函数。所需文件也是如此。


我注意到您使用的是sec_session_start()。这是我以前见过的功能。确保它是您包含的文件的一部分,因为我在您发布的代码中没有看到任何其他提及它。


DanFromGermanyheader 提出了一个很好的观点

exit; 放在标题之后,否则您的代码将继续运行:

header("Location: director.php");
  exit;

您当前的密码对SQL injection开放。使用prepared statements

这里是一个使用parametrized 方法的例子:

$name = $_SESSION ['username'];

$stmt = $mysqli->prepare("select score1 from members where username = ?");

$stmt->bind_param('s', $name);

    if (!$stmt->execute()) 
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
    

另一个例子:

if($statement=$mysqli->prepare("select score1 from members where username = ?"))

 $name = $_SESSION ['username'];
 $statement-> bind_param("s", $name);

// Execute
 $statement-> execute();

// Bind results
 $statement-> bind_result($name);

// Fetch value
 while ( $statement-> fetch() ) 
 echo $name . "<br>";
 

// Close statement
 $statement-> close();
 

// Close entire connection
 $mysqli-> close();

【讨论】:

应该是$mysqli-&gt;query(...) @tadman 好点,将编辑。【参考方案2】:

您不能混合使用 mysqlimysql。我强烈建议使用mysqli(带有i),因为mysql 已被弃用。此外,它与 PostgreSQL 兼容,自从 Oracle 接管 Sun Microsystems 以来,我们中的许多人都在转用这种方式。

【讨论】:

以上是关于用户'root'@'localhost'的访问被拒绝(使用密码:否)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

错误 1698 (28000): 拒绝用户 'root'@'localhost' 的访问

用户'root'@'localhost'的MYSQL访问被拒绝

用户 'root'@'localhost' 的访问被拒绝

用户'root'@'localhost'的访问被拒绝(使用密码:YES)

#1045 - 用户 'root'@'localhost' 的访问被拒绝(使用密码:否)

使用密码拒绝用户'root'@'localhost'的访问:否