PHP和MySQL数据库搜索-从PHP代码中删除数据库凭据

PHP和MySQL数据库搜索-从PHP代码中删除数据库凭据,php,mysql,mysqli,Php,Mysql,Mysqli,我找到了一些使用PHP和MySQL进行简单数据库搜索的代码,并且我能够使其正常工作。但是,我认为将数据库用户名和密码留在根文件夹中的PHP代码中可能不是一个好主意。因此,我找到了另一个代码示例,它演示了如何在根目录外创建config.ini文件,并使用dbconnect.php文件访问数据库凭据。我试图实现这一点,但我没有任何运气,想知道是否有人能告诉我我缺少什么(我只掌握了编码的基本知识,正在尝试一点一点地学习)。我已经包含了所有组件文件的代码(并且我将任何用户名/密码/服务器名更改为通用占位

我找到了一些使用PHP和MySQL进行简单数据库搜索的代码,并且我能够使其正常工作。但是,我认为将数据库用户名和密码留在根文件夹中的PHP代码中可能不是一个好主意。因此,我找到了另一个代码示例,它演示了如何在根目录外创建config.ini文件,并使用dbconnect.php文件访问数据库凭据。我试图实现这一点,但我没有任何运气,想知道是否有人能告诉我我缺少什么(我只掌握了编码的基本知识,正在尝试一点一点地学习)。我已经包含了所有组件文件的代码(并且我将任何用户名/密码/服务器名更改为通用占位符)。在代码下面,我粘贴了提交搜索表单时当前显示的错误。谢谢

index.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Search</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <form action="search.php" method="GET">
            <input type="text" name="query" />
            <input type="submit" value="Search" />
        </form>
    </body>
</html>
警告:mysql\u real\u escape\u string():拒绝用户访问 中的“root”@“localhost”(使用密码:否) /第29行的home4/cpanelusername/public_html/…../search.php

警告:mysql\u real\u escape\u string():无法创建到服务器的链接 在上的/home4/cpanelusername/public_html/…/search.php中建立 第29行

警告:mysql_query():拒绝用户“root”@“localhost”的访问 (使用密码:否)在中 /第33行的home4/cpanelusername/public_html/…./search.php

警告:mysql_query():无法建立到服务器的链接 在第33行的/home4/cpanelusername/public_html/…/search.php中 拒绝用户“root”@“localhost”的访问(使用密码:否)


这是因为mysql\u real\u escape\u字符串考虑了连接的当前字符集。因此,它需要一个连接。:-)

请尝试使用下面的代码连接数据库,如果您有任何问题,请告诉我

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

清除来自userland的字符串不足以防止SQL注入攻击。标准方法是使用准备好的查询。例如:

    $stmt = mysqli_stmt_init($this);
    $result = array();
    $okay = mysqli_stmt_prepare($stmt, "SELECT * FROM details WHERE (title LIKE ?) OR (text LIKE ?)");
    if ($okay)
        $okay = mysqli_stmt_bind_param($stmt, "ss", "%$query%", "%$text%")
    else
        [handle error]
    if ($okay)
        $okay = mysqli_stmt_execute($stmt);
    else
        [handle error]
    if ($okay)
        $okay = mysqli_bind_result($stmt, $row);
    else
        [handle error]
    if ($okay)
        while (mysqli_stmt_fetch($stmt))
            array_push($result, $row);
    else
        [handle error]
    mysqli_stmt_close($stmt);


你可能有更重要的顾虑。。。您的代码极易受到sql注入的攻击。在Google上搜索它,您将看到许多关于如何修复它的教程。关于您的主要问题,您可以使用dotenv库从名为
.env
的文件中导入环境变量(mysql凭据和任何其他变量)。代码似乎没有问题。您收到一个拒绝访问错误的事实证明您实际上正在访问DB服务器,所以这没关系。第一个问题是您试图以
根用户身份连接到数据库。默认情况下,mysql中的根用户不允许从DB服务器本身以外的任何位置连接,因此如果DB与应用程序不在同一服务器上,它将永远无法工作。另一个键是
使用密码:NO
错误。在连接SQL注入时,您似乎没有传递db用户的密码,其中有一行代码可能会阻止它,但我猜您是说这还不够。知道如何改进它超出了我的能力范围。如果有人知道我可以用于安全的数据库搜索表单的预先编写的代码示例,我将不胜感激。首先,您为什么要使用长期以来被弃用的
mysql\uuz
代码库?它在许多年前就已经停止使用,并在PHP7中被完全删除。不应使用此库编写新代码。它使您容易受到SQL注入攻击(由于缺少参数化查询支持)和潜在的其他未修补漏洞的攻击。这通常是非常正确的建议,但实际上并不能解决OP的问题或错误消息。它无法回答提出的问题。请理解。然而,对这篇文章的第一个回复指出了漏洞,OP表示缺乏知识。对他的帖子的完整回答应该能解决这个问题。他也同意。但我的观点是,你在答案部分发布了这篇文章,但这不是问题的答案……从外观上看,OP连接DB的方式没有问题。你的代码并没有改善这一点。但是您似乎没有注意到OP正在使用
mysqli.*
函数来连接,而使用
mysql.*
函数来运行查询……因此,毫不奇怪mysql.*函数不知道连接细节。您的答案本身仍在混淆这两个库。他们不能这样混在一起<代码>mysqli
应贯穿始终。
[database]
servername = localhost
username = username
password = password
dbname = username_database
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
    $stmt = mysqli_stmt_init($this);
    $result = array();
    $okay = mysqli_stmt_prepare($stmt, "SELECT * FROM details WHERE (title LIKE ?) OR (text LIKE ?)");
    if ($okay)
        $okay = mysqli_stmt_bind_param($stmt, "ss", "%$query%", "%$text%")
    else
        [handle error]
    if ($okay)
        $okay = mysqli_stmt_execute($stmt);
    else
        [handle error]
    if ($okay)
        $okay = mysqli_bind_result($stmt, $row);
    else
        [handle error]
    if ($okay)
        while (mysqli_stmt_fetch($stmt))
            array_push($result, $row);
    else
        [handle error]
    mysqli_stmt_close($stmt);