2013-08-01 2 views
1

그래서이 문제로 인해 혼란 스럽습니다. 나는 AJAX을 사용하여이 PHP 파일에 대한 게시물을 보내고 있으며, 배열을 반대로하고 청크로 사용하고 값을 바인딩하는 데 사용합니다. 각 청크는 업데이트 할 행 정보를 보유하므로 for 루프의 각 반복은 행을 업데이트합니다.PDO 업데이트 하나의 행만 업데이트

처음 시도했을 때 다음 코드를 사용했습니다.

if(isset($_POST['saveEdits'])) { 
    $i = 0; 
    $j = 1; 
    $update = array();   
    $update = $_POST['saveEdits']; 
    $chunk_count = count($update)/7;  
    $backwards = array_reverse($update); 
    $chunks = array_chunk($backwards, 7);    

    try { 
     for($i; $i < $chunk_count; $i++) { 
      $update_project = $db->prepare(' 
       UPDATE projects 
       SET comments = ?, 
        contact = ?, 
        est_end = ?, 
        est_start = ?, 
        apm = ?, 
        pm = ?        
       WHERE id = ? 
      '); 

      foreach ($chunks[$i] as $field => $val) {       
       $update_project->bindValue($j++, $val, PDO::PARAM_STR);         
      }   
      $update_project->execute(); 

     } 

     echo 'Projects Updated';   

    } catch(PDOException $e) { 
     die($e->getMessage()); 
    } 
} else {  
    echo 'could not update projects table'; 
} 

와 나는 내가이 어떻게 든 작동

$i = 0; 

$i = 1; 

에 변경하는 것이 다음과 같은 오류를
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\core\functions\update_projects.php on line 31 

그래서이 제안 될 때마다 얻을 것입니다. 이렇게하면 데이터를 한 번만 삽입 할 수 있지만 모든 데이터를 삽입하지는 않습니다. 이게 작동한다는 사실은 입니다.은 저에게 당혹 스럽습니다. $ i는 루프 색인과 청크 색인의 소유자입니다. 그것은 0에서 무엇이든 갈 필요가 있습니다. 나는 어떻게 1에서 시작하는 것이 어떤 식 으로든 도움이되는지 이해하지 못합니다. $ j는 param 바인더 홀더입니다. 부터 시작해야합니다.

일부 추가 정보. 내가 위해서 var_dump 경우 (덩어리 [0])와 위해서 var_dump (덩어리 [1]) 나는 다음과 같은

array(7) { [0]=> string(13) "more comments" [1]=> string(9) "jimmy doe" [2]=> string(6) "1-1-14" [3]=> string(7) "12-1-13" [4]=> string(9) "janey doe" [5]=> string(9) "jonny doe" [6]=> string(2) "17" } 
array(7) { [0]=> string(13) "some comments" [1]=> string(7) "jim doe" [2]=> string(6) "1-1-14" [3]=> string(7) "12-1-13" [4]=> string(8) "jane doe" [5]=> string(7) "jon doe" [6]=> string(2) "16" } 

그래서 검토를 참조하십시오. $i = 0 그리고 위로 오류가 발생합니다. $i = 1 한 행을 삽입하면 끝납니다. 누군가 여기서 무슨 일이 일어나는지 말해 주실 수 있습니까? 어떤 도움을 주신 경우

+0

에 간다? HTML? – Konsole

+1

나는 내 자신의 질문에 대답 한 후에 설명이없는 투표를 얻는 것을 좋아한다. –

+0

param이 정의되지 않았습니다. 너는 무엇을 더 필요로 하는가? –

답변

2

코드에 여러 문제가 있습니다. 하지만 주요 문제는 배열을 청크로 분할하려고 시도하는 것입니다. 배열에 10 개의 항목이 있다고 가정하면 코드 $chunk_count = count($update)/7;을 사용하면 1.4285 ..., 1보다 크지 만 2 미만의 청크 수가됩니다. 그러면 루프에서 한 번만 실행되기를 기대합니다. $i = 1; 루프를 처음 사용하기 때문에 1 < 1.x이지만 두 번째 시간은 2> 1.x입니다.

이 배열을 분할하여 수행하려는 작업은 무엇입니까? 그냥 바로 처리하십시오. 가능한 경우 간단하게 유지하십시오.

+0

이 배열은 항상 7의 배수가됩니다. 그래서 나는 7로 나눕니다. 나머지는 절대로 존재하지 않습니다. 항상 정수입니다. 이 피들 http://jsfiddle.net/NuLPC/8/에서 프로세스를 볼 수 있습니다. 기본적으로 나는 편집 가능한 테이블을 가지고 있는데, 사용자가 루프를 완료하면 모든 데이터가 배열에 저장됩니다. 그런 다음 값을 바인딩 할 수 있도록 배열을 분리해야합니다. 더 나은 해결책이 있다면 알려주십시오.나는 이것이 이상하다고 생각하지 않는다. 단지 –

+0

일을해야한다. * 작동해야한다. * –

+0

플러스 이유를 설명하지 않는다. * 왜 * 한 번에 값을 넣을 것이고 다른 것은 루프를 시작하면된다. 0 대신에 1을 쓰면 꽤 문제가됩니다.이 문제에 대해 저를 괴롭히는 것은 –

1

간단하게 유지. 여기 나를 위해 일한 것이 있습니다. 이것은 여전히 ​​원래의 문제에 대해 궁금해했지만 오. 이 답변에

$backwards = array_reverse($update); 
$chunks = array_chunk($backwards, 7); 
$n = 0;   

try { 
    $update_project = $db->prepare(' 
     UPDATE projects 
     SET comments = ?, 
      contact = ?, 
      est_end = ?, 
      est_start = ?, 
      apm = ?, 
      pm = ?        
     WHERE id = ? 
    '); 

    foreach ($chunks as $chunk) { 
     $update_project->execute($chunk); 
     $n += $update_project->rowCount(); 
    } 

    echo 'Projects Updated, affected ' . $n . ' rows';   

} catch(PDOException $e) { 
    die($e->getMessage()); 
} 

신용은 전체 코드를 붙여 넣을 수 있습니다 빌 Karwin here

+0

왜이 투표에 투표하지 않았습니까? 그것은 효과가있을뿐만 아니라 유일하게 다른 대답이 제시하는 것을 수행합니다. –

관련 문제