【问题标题】:MySQL - select count returns trueMySQL - 选择计数返回真
【发布时间】:2016-10-21 01:34:35
【问题描述】:

我正在尝试确定电子邮件是否在我的数据库中。为此,我编写了这段代码:

$query_checkmail = "SELECT COUNT(*) FROM user WHERE email = ?;";
if($stmt = mysqli_prepare($connection, $query_checkmail))
{
    mysqli_stmt_bind_param($stmt, "s", $_POST["email"]);
    $result = mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
}

echo "<pre>";
var_dump($result, mysqli_fetch_all($result));
echo "</pre>";

由于我希望查询返回 0,因为电子邮件不应该在数据库中,所以输出是这样的(来自 var_dump):

bool(true)
NULL

我不明白为什么我没有得到值为 0 的 mysqli 结果对象,而是布尔值 true,如果我想检查它,它总是会在日志中触发 PHP 警告。

我之前有一个正常的SELECT id FROM user WHERE email = ?;"; 并得到了相同的结果。我认为使用 COUNT 可以防止这种情况发生,但我的尝试显然失败了。

我也发现了这个Stackoverflow Link,但不幸的是它并没有帮助我解决我的问题,即了解该值是否已经存在。

非常感谢任何帮助。如果这些信息还不够,我会立即提供缺失的部分。

【问题讨论】:

  • 只是出于好奇,确定邮件是否存在后,你会怎么做?
  • 这是添加新用户的过程。我不能有具有此特定电子邮件地址的用户,因为它必须是唯一的,因为它是登录凭据的一部分,因此我必须检查是否已经存在具有此电子邮件地址的用户。如果是,我返回一个错误,如果不是,我可以继续。结果我得到了TRUE,即使没有人知道这个邮件地址而不是我需要的0
  • 只需建立一个唯一的密钥并提交电子邮件。插入的结果会告诉你电子邮件是否存在
  • 你得到true 因为mysqli_stmt_execute() 返回一个布尔值。这仅意味着查询已成功执行,它与该查询中获取的结果无关(请参阅documentation,特别是在“返回值”下)。 NULL 值来自您将布尔值放入 mysqli_fetch_all(),它需要一个 mysqli_result,而不是布尔值。
  • 我明白了 Qirel 的观点,顺便说一句,好名字。我非常喜欢这个,如果它有效,请将其作为答案发布,以获得支持和接受 :) 验证它。我很乐意接受这个作为你的答案:)

标签: php mysql select return return-value


【解决方案1】:

我建议你使用 PDO 而不是 mysqli。先建立连接,然后:

    $stm = $pdo->prepare("select count(*) from user where email = :email");
    $stm->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
    if ($stm->execute()) {
        $c = $stm->fetchColumn();           
    echo $c;       
    }

【讨论】:

  • 这可能有效,但我不喜欢 PDO 并且从不使用它,并且为了在我的许多代码行中保持一致,我不能将它用于这个特定问题。
【解决方案2】:

可以使用 MeekroDB,是完美的 php-mysql 库。例如,使用此代码行,您会得到类似的结果:

$user = DB::query("SELECT UserId FROM user WHERE email = %s",$email);
$count = DB::count();

如您所见,代码更简洁且易于编写。 Meekro 是免费和开源的:http://meekro.com/quickstart.php

【讨论】:

    【解决方案3】:

    计数本身不返回布尔值 true 或 false,您正在检查从 mysqli_stmt_execute() 分配的变量,该变量返回布尔值。这与查询的结果无关。如果您阅读有关此函数的文档,特别是 mysqli_stmt_execute() 的返回值,您会看到它们要么是 true 要么是 false,所以毫无疑问 var_dump() 会返回一个布尔值。

    如果要实际计数,则必须使用mysqli_stmt_bind_result()mysqli_stmt_fetch() 来获取计数结果。这将产生正确的结果。如果您不确定如何使用这些功能,本手册将显示示例。

    至于NULL,这是因为您将布尔值传递给mysqli_fetch_all() 函数,该函数需要一个mysqli_result,而您根据上述原因给它一个布尔值。

    【讨论】:

      【解决方案4】:

      mysqli_stmt_execute 返回真或假,你应该在执行后使用mysqli_stmt_get_result 来检索数据

      我从 PHP.NET 复制了示例代码

      $result = mysqli_stmt_get_result($stmt);
      while ($row = mysqli_fetch_array($result, MYSQLI_NUM))
      {
      foreach ($row as $r)
      {
      print "$r ";
      }
      print "\n";
      }
      

      【讨论】:

      • 虽然您的代码对我没有帮助,但文本可以。请参阅我对 Quirels 答案的编辑,以获取解决我问题的代码。但感谢您的回答 :) 我建议您更新代码以匹配问题
      猜你喜欢
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2012-04-27
      • 2012-03-05
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多