【问题标题】:Perform function in a while loop在while循环中执行函数
【发布时间】:2012-08-24 11:37:55
【问题描述】:

如果movement 存在,我有这个函数返回 bool(true) 或 bool(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_row($query);
return ($movement_performed[0] > 0);

}

我有这个 while 循环,我想在其中调用这个函数,如果它返回 false,则执行函数 completed_movement。我尝试了许多不同的方法,但我似乎无法让它发挥作用。任何信息将不胜感激。

if (empty($_POST)=== false){
$i = 0;
while (isset($_POST["first_name"][$i])) {
    $movement_data = array(   
    'user_id'       => $session_user_id,   
    'class_id'      => $class_id,   
    'class_name'    => $class_name,
    'client_id'     => $_POST['client_id'][$i],    
    'first_name'    => $_POST['first_name'][$i],   
    'last_name'     => $_POST['last_name'][$i],   
    'nickname'      => $_POST['nickname'][$i],   
    'order'         => $_POST['order'][$i],   
    'movement'      => $_POST['movement'][$i],   
    'rep_set_sec'   => $_POST['rep_set_sec'][$i],   
    'rest'          => $_POST['rest'][$i],   
    'date'          => $today   
    );  

 //assign variable to the function
    $isPerformed = movement_performed_today($class_id, $_POST['client_id'][i]);

    //if return false perform this function
    if(! $isPerformed){ completed_movement($movement_data);}

   $i++; 
   } 

} // if empty   

我在这里尝试做的是每次循环检查函数 move_performed_today 是真还是假。如果返回 false,则将此 _POST 数据插入到数据库中。不确定我是否正确执行此操作,因为即使该函数返回 true,它仍会调用 completed_movement 函数并将信息发布到 db。

我相信问题可能就在这里。早些时候,这将返回 true 或 false,但现在即使 movement 存在,也只会返回 false。这段代码:

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

返回这个:

array(1) { [0]=> string(1) "0" } 
array(1) { [0]=> string(1) "0" }

如果存在movement,则“0”不应为“1”或更高,具体取决于它与查询匹配的次数。

这是有效的查询:

function movement_performed_today($class_id, $client_id, $movement){
$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 `movement` = '$movement' AND `date` = CURDATE()");

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

}

这是正在工作的 while 循环。

if (empty($_POST)=== false){
$i = 0;
while (isset($_POST["first_name"][$i])) {
    $movement_data = array(   
    'user_id'       => $session_user_id,   
    'class_id'      => $class_id,   
    'class_name'    => $class_name,
    'client_id'     => $_POST['client_id'][$i],    
    'first_name'    => $_POST['first_name'][$i],   
    'last_name'     => $_POST['last_name'][$i],   
    'nickname'      => $_POST['nickname'][$i],   
    'order'         => $_POST['order'][$i],   
    'movement'      => $_POST['movement'][$i],   
    'rep_set_sec'   => $_POST['rep_set_sec'][$i],   
    'rest'          => $_POST['rest'][$i],   
    'date'          => $today   
    );  

 //check not already performed today
    $isPerformed = movement_performed_today($class_id, $_POST['client_id'][$i], $_POST['movement'][$i]);

    //if not performed then do insert
    if (! $isPerformed){ completed_movement($movement_data);}

   $i++; 
   } 

} // if empty   

感谢大家的帮助!

【问题讨论】:

  • 您似乎没有将正确的变量发送到movement_performed_today$_POST['client_id'] 不应该是 $_POST['client_id'][$i] 吗?
  • 这确实有帮助,但如果 $isPerformed 返回 true,它仍然会调用函数 completed_movement
  • 您是否检查过您的查询是否正常?你试过echo吗?您是否尝试转储$movement_performed 以查看结果是否符合预期?我们指出了一些错误,但我们无法为您调试此脚本。为什么
  • @MathieuImbert 是的,我可以执行 var_dump 并返回 bool(false) 或 bool(true),具体取决于 movement 是否存在。
  • @MathieuImbert 是的,检查执行正常,但是当我在 while 循环中调用它并且如果它返回 false(未找到移动)以执行功能 movement_completed 但无论我尝试什么,它都会执行 @987654340 @ 即使$isPerformed 返回 true。

标签: php mysql sql


【解决方案1】:

我可能误读了这一点,但看起来您将 $return 设置为 true 或 false,而不是实际返回值。我相信你想改变:

$return = $movement_performed[0] > 0;

if($movement_performed[0] > 0) return true;
else return false;

【讨论】:

  • 这有助于部分问题,但如果$isPerfomed 返回true,它仍然会执行函数complete_movement
  • 用 if 语句试试,而不是直接返回条件结果。
【解决方案2】:

编辑:

听起来您的 SQL 查询也有问题。试试:

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

由于列 class_id 和 client_id 似乎是整数,请删除它们的值周围的单引号。

编辑:更正语法,先将 SQL 结果转换为整数。

return ((int)$movement_performed[0] > 0 ? true : false);

如果您使用此返回行,函数completed_movement() 将只返回布尔值。

在这种情况下,您需要在为调用函数进行比较逻辑时严格。

你会想要这样做:

//if return false perform this function
if ($isPerformed === false) {
    completed_movement($movement_data);
}

【讨论】:

  • @Colbyd 检查我的编辑。变量 $session_user_id、$class_id、$class_name、$today 来自哪里?如果它们来自 POST,则需要将 POST 中的值提取到变量中。
  • $class_id 实际上是在页面前面分配的,它是一个 _GET 变量。
  • @Colbyd 嗯,在这种情况下,先尝试将DB返回的值转换为整数与0进行比较。
  • @Colbyd 不用担心,请查看我在答案中编辑的代码行。我在 SQL 结果值之前添加了 (int),以便将其转换为整数。
  • 我在上面添加了代码以显示它出于某种原因返回 false,即使 movement 存在。
猜你喜欢
  • 2016-04-30
  • 2019-10-12
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
相关资源
最近更新 更多