【问题标题】:Why is this returning bool(false)?为什么返回 bool(false)?
【发布时间】:2012-08-24 06:08:33
【问题描述】:

我有这个查询来检查运动是否存在并且应该返回真或假。这个查询

function movement_performed_today($class_id, $client_id){
$class_id = (int)$class_id;
$client_id = (int)$client_id;



$query = mysql_query("SELECT COUNT(`movement`) FROM `completed_movements` WHERE `class_id` = '$class_id' AND `client_id` = '$client_id' AND `date` = CURDATE()");

$movement_performed = mysql_fetch_assoc($query);

$return = (mysql_result($movement_performed, 0) == 1) ? true : false;   
    var_dump ($return);
}

返回:

bool(false) 
bool(false)

如果我替换此代码:

$return = result(mysql_result($movement_performed, 0) == 1) ? true : false; 
    var_dump ($return);

有了这个:

print_r ($movement_perfomed);

返回:

Array ( [COUNT(`movement`)] => 2 ) 
Array ( [COUNT(`movement`)] => 3 )

我的想法是否完全错误,因为这些数字不是零,它应该返回 true?

【问题讨论】:

  • 为什么人们会做(condition) ? true : false之类的事情?您的 condition 已经是一个布尔值,除了迷惑其他人查看您的代码之外,这样做没有任何意义。更严重的是,不要使用 mysql_* 函数,它们已被弃用。使用mysqli_* 或 PDO。
  • 我编辑了代码,因为结果不应该在那里。我对此很陌生,这个查询是基于我已经完成或被展示如何做的其他查询。
  • 关于 PDO,我是否必须将我的数据库连接切换到 PDO 才能开始使用 PDO 查询?
  • @Colbyd 是的,当您创建一个新的 PDO 对象时,它会建立一个新的连接。在此处阅读文档:php.net/manual/en/class.pdo.php
  • @NullUserException 我正计划将我的所有 mysql 切换到 PDO,但认为我需要从我的 connect.php 文件开始并将其更改为 PDO,然后才能使用我的任何 PDO 查询。

标签: php mysql boolean


【解决方案1】:

回答你的问题:

mysql_result 出错时返回 FALSE。您从mysql_fetch_assoc 传递数组,而不是mysql_result 函数签名所要求的mysql 资源:

string mysql_result ( resource $result , int $row [, mixed $field = 0 ] )

因此它返回FALSE,因为它有一个错误。


更好的方法:

// Change
$movement_performed = mysql_fetch_assoc($query);
$return = result(mysql_result($movement_performed, 0) == 1) ? true : false;

// to
$movement_performed = mysql_fetch_row($query);
return $movement_performed[0] > 0;

这会获取 count 语句的结果并对其进行> 0 检查。 > 0 检查并不是真正需要的,但有助于显示意图而不是依赖真实值。


旁注:mysql_* 函数已被弃用。您应该迁移您的代码以使用MySQLiPDO。不幸的是,您正在使用许多mysql_* 函数不需要mysql 资源的事实。迁移代码会很痛苦,因为您必须更改一堆函数或声明全局变量。我推荐前一个选项,但需要花费大量精力来修复。

【讨论】:

  • @LeviMorrison 感谢您的帮助。我在上面发布了 php 循环,我在其中调用了这个函数以及我试图完成的事情。你能看看并告诉我调用这个函数时我做错了什么吗?
  • 现在,当我执行var_dump ($return) 时,它会得到bool(true) bool(true),这是正确的,因为这一天这个班级中的这个用户确实存在movement。当我从 while 循环中执行 var_dump (isPerformed) 时,它返回 NULL,因此如果返回 true,则执行我不希望它执行的函数。
  • 你能告诉我这条线是做什么的$return = $movement_performed[0] > 0;
  • @Colbyd 你真的在你的函数中说return $return;吗?您必须从函数返回结果。我编辑了我的代码示例以反映这一点。
  • 我的代码目前看起来像这样$return = $movement_performed[0] > 0;
【解决方案2】:

我觉得应该是

(count(mysql_fetch_assoc ) >0 ) ? true : false; 

而不是

result(mysql_result($movement_performed, 0) == 1) ? true : false; 

【讨论】:

猜你喜欢
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 2013-09-18
  • 2011-12-03
相关资源
最近更新 更多