为什么这回归bool(假)?

Col*_*byd 1 php mysql boolean

我有这个查询,检查是否存在移动并且应该返回true或false.这个查询

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);
}
Run Code Online (Sandbox Code Playgroud)

返回:

bool(false) 
bool(false)
Run Code Online (Sandbox Code Playgroud)

如果我替换此代码:

$return = result(mysql_result($movement_performed, 0) == 1) ? true : false; 
    var_dump ($return);
Run Code Online (Sandbox Code Playgroud)

有了这个:

print_r ($movement_perfomed);
Run Code Online (Sandbox Code Playgroud)

返回:

Array ( [COUNT(`movement`)] => 2 ) 
Array ( [COUNT(`movement`)] => 3 )
Run Code Online (Sandbox Code Playgroud)

我认为完全错误,因为这些数字不是零,它应该返回真实吗?

Lev*_*son 7

回答你的问题:

mysql_result返回FALSE错误.您正在mysql_fetch_assoc根据mysql_result函数签名的要求传递数组而不是mysql资源:

string mysql_result ( resource $result , int $row [, mixed $field = 0 ] )
Run Code Online (Sandbox Code Playgroud)

因此它会返回,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;
Run Code Online (Sandbox Code Playgroud)

这会抓取count语句的结果并对其进行> 0检查.该> 0检查是不是真的需要,而且有利于表明意图,而不是依靠上truthy值.


附注:这些mysql_*功能已被弃用.您应该将代码迁移到使用MySQLiPDO.遗憾的是,许多mysql_*函数不需要mysql资源这一事实.迁移代码将是一件痛苦的事情,因为您必须更改一堆函数或声明全局变量.我推荐前一个选项,但需要花费很多精力才能修复.