2012-08-27 71 views
0

我有这个疑问在这里:返回真/假从MySQL阵列

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); 

print_r($movement_performed); 
} 

返回此:

Array ( 
[COUNT(`movement`)] => 0 
) 
Array ( 
[COUNT(`movement`)] => 0 
) 

这是正确的。现在我想要做这样的事情:

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['count'], 0) == 1) ? true : false; 
} 

所以,我可以叫while循环的内部这个功能,如果它返回0 /假它就会表单数据发布到数据库。有人可以帮忙吗?这里是Im试图执行此功能的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 
    ); 

    $movement_performed = movement_performed_today($class_id, $_POST['client_id']); 
    foreach ($movement_performed as $performed){ 
    if($performed == false){ 
    completed_movement($movement_data); 
    } // if performed 
    } // foreach 
    $i++; 
    } // while 

} // if empty 
+0

在这里插入大便笑话。尽管如此,应该着眼于强化数据库约束的唯一性。仍然可以执行SELECT COUNT检查,但确保在尝试插入数据库后正确处理任何竞争条件。你能解释一下“对于一个表单而不是数组”的意思吗? – ficuscr

+0

解析脚本循环遍历表单中的行,并将每行数据插入到数据库中,每行数据表示数据库中新数据行。所以当我做检查时,我需要看看每行中的$ _POST ['movement']是否已经发布到数据库中,如果是这样,请转到数组中的下一行。那有意义吗? – Colbyd

+1

那么做同样的事情,但在一个循环?只需要在每次插入否之前在循环中调用'movement_performed_today'? – ficuscr

回答

1

您的方法movement_performed_today返回布尔值。不是你可以循环的东西。在你的主循环中进行检查。你也知道,从_POST信任用户输入是不安全的?使用mysql_query已折旧,您需要查看使用PDO和绑定的参数。

if (! empty($_POST)) { 
    $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']); 

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

     $i++; 
    }  
} 
+0

感谢您的回复。那么我的查询如何改变,如果它返回1/true,它将跳过'completed_movement'函数? – Colbyd

+0

感谢您的帮助。我的查询是否需要更改以使其正确运行? – Colbyd