【问题标题】:Table with values from sql database isn't appearing带有来自 sql 数据库的值的表没有出现
【发布时间】:2023-03-05 04:13:01
【问题描述】:

我编写了这段代码,它应该用用户已兑换的所有代金券及其价值制作一个表格,但它不起作用(根本没有出现,也没有显示任何错误)所以我很困惑我有什么这里做错了。有人可以帮忙吗?

$dsn = 'mysql:host=127.0.0.1;dbname=user_db;charset=utf8';

$conn = new PDO($dsn, $username1, $password);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stm_voucher = $conn->prepare("SELECT id FROM users WHERE username = :username");
$stm_voucher->bindParam(":username", $username, PDO::PARAM_INT);
$stm_voucher->execute();

while ($row = $stm_voucher->fetch(PDO::FETCH_ASSOC)) {
    $id = $row["id"];

    $stm_voucher2 = $conn->prepare("SELECT * FROM vouchers WHERE used_by = :id");
    $stm_voucher2->bindParam(":id", $id, PDO::PARAM_INT);
    $stm_voucher2->execute();

    $rank = 1;
    while ($row2 = $stm_voucher2->fetch(PDO::FETCH_ASSOC)) {
        echo "<tr>
            <td>{$rank}</td>
            <td>{$row2['voucher']}</td>
            <td>{$row2['value']}</td>
            <td>{$row2['used_on']}</td>
            </tr>";
        $rank++;
    }
}

【问题讨论】:

  • 没有人可以帮忙。因为缺少数据库样本和输入值。
  • 用户名真的是 int - (":username", $username, PDO::PARAM_INT)
  • SELECT v.* FROM users AS u JOIN vouchers AS v ON u.id = v.used_by WHERE u.username = :username - 单个查询
  • 当您有涉及数据库的问题时,您应该始终提供表定义。实际的CREATE DML,不是截图。很多时候,人们会在提供答案之前重新创建您的表并实际运行代码。尽你所能为他们提供便利。

标签: php sql pdo


【解决方案1】:

像这样,使用 Join 而不是 2 个查询,因为它会节省大量性能并简化您的代码。通常,您在 DB 层中可以做的越多,您在应用程序中编写的代码就越少。在这种情况下 Apx -6 行代码。

这应该替换您在问题中的所有代码:

$dsn = 'mysql:host=127.0.0.1;dbname=user_db;charset=utf8';

$conn = new PDO($dsn, $username1, $password);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $conn->prepare("SELECT v.* FROM users AS u JOIN vouchers AS v ON u.id = v.used_by WHERE u.username = :username");
$stmt->execute([":username" => $username]);

$rank = 1;
while ($row2 = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "<tr>
        <td>{$rank}</td>
        <td>{$row2['voucher']}</td>
        <td>{$row2['value']}</td>
        <td>{$row2['used_on']}</td>
     </tr>";
     $rank++;
}

不要忘记&lt;table&gt;&lt;/table&gt; 标签。我没有看到它们,或者$username 定义在哪里。但我必须假设它们是正确的。

我是这样来了解两张表之间的关系的

如果vouchers.used_by = :id-&gt;bindParam(":id", $id,..)$id = $row["users.id"]; 然后vouchers.used_by = users.id。基本上是等价原则。

如果您不知道,JOIN 允许您访问多个表,即左侧表中的一个(或多个)字段与右侧表中的字段相关(它们是相同的数据)。最重要的两个是INNER JOIN 又名JOINLEFT JOIN - JOIN 要求两个表中都有匹配的行,LEFT JOIN 只需要左手表中的匹配行。

因此,使用左联接,您可以找到仅存在于左表中的行,而 JOIN 要求两个表中都存在相关行。基于您仅使用 users 表中的 id 从 vouchers 表中提取相关记录,看起来您只需要一个常规的 JOIN,因为我们可以消除查找 users.id 的需要,因为加入就是这样做的。而且,您只需要vouchers 表中的数据。

希望这是有道理的。

在cmetsNigel Ren我认为有问题的根源:

用户名真的是一个 int - (":username", $username, PDO::PARAM_INT)

使用 PDO,您只需将输入内容放入数组中即可执行。它基本上将所有输入视为字符串类型。因此,假设$username 被正确定义,这也应该避开这个问题。人们会期望用户名类似于 myaccount 而不是 1,是字符串而不是 int。

希望对你有帮助!

【讨论】:

  • Still doesn't work; 这是什么意思,您必须提供更多信息。
  • 没关系,我必须从数据库中检索用户名,而不是这段代码中的 id,真是个愚蠢的错误。
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 2011-12-18
  • 2021-01-17
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多