用户'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()
。这是我以前见过的功能。确保它是您包含的文件的一部分,因为我在您发布的代码中没有看到任何其他提及它。
DanFromGermany
对header
提出了一个很好的观点
将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->query(...)
。
@tadman 好点,将编辑。【参考方案2】:
您不能混合使用 mysqli
和 mysql
。我强烈建议使用mysqli
(带有i),因为mysql
已被弃用。此外,它与 PostgreSQL 兼容,自从 Oracle 接管 Sun Microsystems 以来,我们中的许多人都在转用这种方式。
【讨论】:
以上是关于用户'root'@'localhost'的访问被拒绝(使用密码:否)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
错误 1698 (28000): 拒绝用户 'root'@'localhost' 的访问
用户'root'@'localhost'的MYSQL访问被拒绝
用户'root'@'localhost'的访问被拒绝(使用密码:YES)