【问题标题】:How to properly connect and retrieve data from MySQL database on Linux如何在 Linux 上正确连接和检索 MySQL 数据库中的数据
【发布时间】:2021-11-17 15:44:15
【问题描述】:

这些天我正在从 Windows 系统切换到 Linux。我安装了 LAMP 堆栈,显然似乎没有故障。 为了确保我编写了一个连接到数据库并执行简单选择查询的普通脚本。

phpconnect.php:

<html>
<head>
    <title>Test PHP Connection Script</title>
</head>
<body>

    <h3>PHP Connect Test</h3>

<?php
    $dbname = 'test';
    $dbuser = 'my_user';
    $dbpass = 'my_password';
    $dbhost = 'localhost';

    // connection to db
    $conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

    // check connection
    if ($conn->connect_errno) {
        echo "Failed to connect to MySQL: " . $conn->connect_error;
        exit();
    }

    $sql = "SELECT * FROM user";
    $result = $conn->query($sql);

    $row = $result->fetch_array();
    printf("%s %s (%s)\n", $row["firstname"], $row["lastname"], $row["age"]);

输出:

我检查了/var/log/apache2/error.log 中的日志文件,这是出现的错误:

PHP 致命错误:未捕获的错误:调用 /var/www/html/phpconnect.php:28 中 bool 上的成员函数 fetch_array():28\n堆栈跟踪:\n#0 {main}\n 抛出 /var /www/html/phpconnect.php

【问题讨论】:

  • 404 错误表示“未找到”。这意味着您的网络服务器在 URL 中找不到您请求的文件。它与您的数据库无关。
  • 但是您的屏幕截图显示的是 500 错误,而不是 404!请确保您的问题是一致的!
  • 但是...为什么要使用过时的mysql_ 代码库?它在 PHP 5.5 (2013) 中停止使用,并在 PHP 7 (2015) 中完全删除。没有应用程序应该仍在使用它。它使您容易受到 SQL 注入攻击(由于缺乏参数化查询支持)和潜在的其他未修补漏洞。尽快切换到使用mysqliPDO(均在2000 年代发布!),并学习如何编写参数化查询来保护您的数据。请参阅bobby-tables.com 以获得对风险的简单说明以及一些用于安全编写查询的示例 PHP 代码。
  • 该错误意味着您的查询由于某种原因而失败。 (这很清楚,因为根据manual,mysqli_query 在失败时返回false(这是一个布尔值)。因此在你的代码中$resultfalse,你不能调用一个错误的函数!您还需要启用 mysqli 错误报告,以便获得底层错误消息。在 new mysqli 行之前添加 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 以启用它。然后您将获得更有用的错误消息。另见 stackoverflow.com/a/58808333/5947043跨度>
  • @ADyson 正如你所说,我检查了error.log。问题在于用户权限,现在 sn-p 可以工作。无论如何,我的项目仍然存在问题,但我认为最好打开一个新帖子,因为我必须分享更多代码。

标签: php mysql linux lamp


【解决方案1】:

如果遇到相同问题的人正在寻找解决方案,我会回答我的问题。感谢 @ADyson 帮助寻找解决方案,请阅读他的 cmets 了解详情。

问题源于在 mysql 中创建的新用户没有访问数据库表所需的权限。 因此,当到达启动查询的语句时,它返回一个布尔值,即false。 修改用户与要查询的数据库相关的权限就足够了。 您可以通过运行以下命令来执行此操作:

mysql> GRANT ALL ON database.table TO 'username'@'localhost';

地点:

  • database 是数据库名称;你可以写*来引用所有数据库(不推荐)
  • table 是表名;你也可以写*来引用所选数据库中的所有表

之后,运行命令FLUSH PRIVILEGES;将重新加载mysql数据库中的授权表,使更改生效,而无需重新加载或重新启动mysql服务。

mysql> 刷新权限;

【讨论】:

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