2014-10-23 3 views
0

foreach 루프에서 CRUD를 수행하면 성공 루프가 메시지를 배열로 푸시하고, 내 함수는 푸시했는데 foreach가 올바른지 확인한 후 메시지를 푸시합니다.foreach 성공 후 PHP 오류를 처리합니다

// .. defined response_message array 

try { 
    foreach ($data as $i => $each_data) { 
    $sql = "UPDATE tag_0 SET sequence = :sequence WHERE id = :id"; 
    $stmt = $connect_db_read->prepare($sql); 
    $stmt->bindValue(':id', $each_data['id']); 
    $stmt->bindValue(':sequence', $each_data['sequence']); 
    $stmt->execute(); 
    } 

    // here 
    $success_message = 'success_message: store in database success'; 
    array_push($response_message['success_message'], $success_message); 
} catch (PDOException $e) { 
    $debug_message = $e->getMessage(); 
    array_push($response_message['debug_message'], $debug_message); 
    $error_message = "error_message: ? database"; 
    array_push($response_message['error_message'], $error_message); 
} 


$data = array(); 
$data['response_message'] = $response_message; 


return $data; 
+0

을 ?? 아니오, 위가 모두 .. – user1775888

+0

함수의 범위에서'$ response_message [ 'success_message']'는 어떨까요? '$ response_message [ 'success_message']'는'undefined'입니다. – PHPglue

+0

@ Arif_suhail_123 감사합니다! – user1775888

답변

2

$stmt->execute();은 쿼리가 성공하면 true를 반환합니다.

이것은 레코드가 업데이트되었음을 ​​의미하지는 않으며 쿼리가 오류없이 실행되었음을 의미합니다.

정말 확실히, 당신은 rowCount()

이 방법 시도해보십시오 영향을받는 행의 수를 확인해야 :

$error_counter = 0; 
$sql = "UPDATE tag_0 SET sequence = :sequence WHERE id = :id"; 
$stmt = $connect_db_read->prepare($sql); 
foreach ($data as $i => $each_data) { 
    $stmt->bindValue(':id', $each_data['id']); 
    $stmt->bindValue(':sequence', $each_data['sequence']); 
    $status = $stmt->execute(); 
    $row_count = $stmt->rowCount(); 
    if($status && $row_count > 0){ 
     $success_message = 'Successful update for sequence id ='.$each_data['id']; 
     array_push($response_message['success_message'], $success_message); 
    }else{ 
     $failed_message = 'update failed for sequence id ='.$each_data['id']; 
     array_push($response_message['fail_message'], $fail_message); 
     $error_counter++; 
    } 
} 

당신은 또한 바인딩보다 한 번 준비하고 루프에서 실행해야을, 필요 없습니다 반복 할 때마다 쿼리를 다시 db로 보냅니다. 값이 다음 갱신 0 모든 레코드 경우


는 I 변수 $error_counter으로 추적하는 다른 방법을 추가했다.

//check after the loop 
if($error_counter === 0){ 
    echo 'All UPDATES SUCCESSED !!!!'; 
}else{ 
    echo 'NOT ALL SUCCESFUL !'; 
} 

는 다른 방법으로 오류가 발생한 메시지의 수를 사용하여 동일한을 얻을 수 있습니다

(count($response_message['fail_message'])===0) 
+0

답장을 보내 주셔서 감사합니다. 매번 확인해 보았습니다 만, 하나의 성공 메시지를 푸시하거나 실패한 메시지를 푸시하는 것보다 foreach 성공 이후의 방법을 찾았습니다. – user1775888

+0

이해가되지 않습니까? 이것은 정확하게 내가 한 일입니다. 어쩌면 페이지를 새로 고침 @ user1775888 – meda

+0

mm ..'if ($ status && $ row_count> 0)'를 확인하고'$ success_message = '시퀀스 ID ='에 대한 성공적인 업데이트. $ each_data [ 'id']; foreach 루프에서 array_push ($ response_message [ 'success_message'], $ success_message);를 실행합니다. 모든 성공 또는 실패가 하나 인 경우에만 하나의 메시지 만 전달합니다. – user1775888