【问题标题】:Returning a value 0 from a database row in PHP/MySQL after a query查询后从 PHP/MySQL 中的数据库行返回值 0
【发布时间】:2020-04-02 09:34:41
【问题描述】:

我正在尝试创建一个页面,我可以在其中获取数据库的记录值。我的查询是这样的:

所以我需要从 tableexample 中获取状态值 1 的数量(作为计数),如果它们存在并计算它们,如果它们不存在,我需要从中获取值为 0。为了获得值,我使用了这段代码,它工作得很好,但如果没有找到结果,我的 PHP 代码似乎无法让值返回 0。我有点迷茫。

$user = $_SESSION["user"];
$systems = mysqli_connect("localhost", "root", "", "testdatabase");
$query = "SELECT SUM(count) AS value_sum FROM tableexample WHERE user = '$user' AND status = '1'";
$request = mysqli_query($systems, $query);
if (mysqli_num_rows($request) > 0) {
    while ($row = mysqli_fetch_array($request)) {
        echo '' . $row["value_sum"] . '';
    }
} else {
    echo '0';
}

所以这段代码可以毫无问题地获取值,但是当我放置“else”时,它应该给我值 0,但没有给我任何东西。

知道如何在不更改代码的情况下解决这个问题吗?

【问题讨论】:

  • 不要将外部的值直接用于查询。否则,您将面临 SQL 注入。
  • @Chemaclass 抱歉,我需要添加代码更新,因为由于某种原因显示不正确。顺便说一句,谢谢你的建议。

标签: php mysql pdo


【解决方案1】:

使用 PDO 会是这样吗:

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";

$pdo = new PDO($dsn, "username", "password", [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);

$stmt = $pdo->prepare('
    SELECT SUM(count)
    FROM `table_example` 
    WHERE `user` = :user 
    AND `status` = "1"'
);

$stmt->bindParam(':user', $_SESSION["user"], PDO::PARAM_STR);
$stmt->execute();
$sum = $stmt->fetchColumn();
echo $sum;

您无需编写任何循环或先前的检查即可获得 SUM 值。

【讨论】:

  • 此代码在我的本地主机中测试后返回空白。但是看起来非常直接和简单,但是如果查询的结果不存在,我该如何添加值?
  • 即使0 是一个不代表任何内容的数字,但查询将始终返回一个数字。至少是那个,因为您正在选择某物的总和,还是我在这里遗漏了什么?
  • 我明白这一点,但是在对我测试它的空白后,我没有从你的代码中得到任何输出.. :(
  • 什么是空白?日志文件说什么?如果你var_dump($row);,你会得到什么?
  • 如果表为空,我的代码没有结果,应该显示 0,但我什么也没有得到,我的错误日志中也没有任何内容
【解决方案2】:

您正在执行SUM 查询,该查询将始终有一个结果行。

SELECT SUM(count) AS value_sum FROM tableexample WHERE user = '$user' AND status = '1'

您可能需要检查SUM(count) = 0,您可以在 while 循环中执行此操作

while ($row = mysqli_fetch_array($request)) {
    if (!empty($row[0])) {
        echo $row[0]; // sum not 0
    } else {
        echo '0';
    }
}

【讨论】:

  • mmmm 我得到一个空的或空白的输出.. 它可能是我的本地主机吗?
  • 更新了答案,如果您没有选择任何行,它将是null。演示db-fiddle.com/f/krZkjT8LmvvDGVSqZ4p6hp/0
  • 非常感谢,这真的很有帮助,一个问题我如何做一个 SUM(count) = 0 while 循环?在我的查询中?
【解决方案3】:

您正在使用mysqli_fetch_array,它返回具有数字和关联索引的数组,而不仅仅是关联数组。如文档中所述,您应该使用 mysqli_fetch_assocmysqli_fetch_array 和第二个参数 resulttype

resulttype 此可选参数是一个常数,指示应从当前行数据生成哪种类型的数组。这 此参数的可能值是常量 MYSQLI_ASSOC, MYSQLI_NUM 或 MYSQLI_BOTH。

通过使用 MYSQLI_ASSOC 常量,此函数将运行 与 mysqli_fetch_assoc() 相同,而 MYSQLI_NUM 将表现 与 mysqli_fetch_row() 函数相同。最后的选择 MYSQLI_BOTH 将创建一个具有两者属性的数组。

https://www.php.net/manual/en/mysqli-result.fetch-array.php

https://www.php.net/manual/en/mysqli-result.fetch-assoc.php

根据 OP 的要求。 这是您的代码,有一些更改。

<?php
$user = $_SESSION["user"];
$systems = mysqli_connect("localhost", "root", "", "testdatabase");
$query = mysqli_real_escape_string($systems, "SELECT SUM(count) AS value_sum FROM tableexample WHERE user = '$user' AND status = '1'");
$request = mysqli_query($systems, $query) or die(mysqli_error($systems)); // Added die for dev env. You can choose how you want to deal with db query error.
if (mysqli_num_rows($request) > 0) {
    // Just replaced mysqli_fetch_array with mysqli_fetch_assoc
    while ($row = mysqli_fetch_assoc($request)) {
        echo '' . $row["value_sum"] . '';
    }
} else {
    echo '0';
}

此外,当您收到0 时,您的if (mysqli_num_rows($request) &gt; 0) 似乎没有返回true。可能是由于数据库查询中的一些错误,您可能需要再次检查。

编辑 04-04-2020:

  1. mysqli_fetch_array 返回的array 更新了有关indexes 的信息。
  2. $query 添加了mysqli_real_escape_string

【讨论】:

  • 你能提供一个使用我的代码的例子吗?提前谢谢你
  • 您的代码运行良好,但查询后返回时没有显示 0,但它确实有效,但如果没有找到结果,我将一无所获
  • mysqli_fetch_array() 返回关联数组。
  • 在代码中使用die(mysqli_error($conn)); 是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die?
  • @UmairKhan 没有意义两次完成这项工作,编写两个版本的代码,一个用于开发环境,一个用于生产环境。
猜你喜欢
  • 2018-11-19
  • 2015-09-17
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 2016-01-05
  • 2019-02-25
  • 2017-02-10
  • 2011-09-19
相关资源
最近更新 更多