2014-10-03 2 views
-3

PDO 기능을 사용하여 데이터베이스를 업데이트하려고하는데 비밀 번호는 아직 업데이트되지만 사용자 이름은 변경되지 않지만 이름이 변경되는 대신 내용이 0으로 업데이트됩니까?필드에 0을 삽입하십시오.

public function insert($table, $fields = array()){ 

    $keys = array_keys($fields); 
    $values = ''; 
    $x = 1; 

    foreach($fields as $field) { 
     $values .="?"; 
     if($x < count($fields)) { 
      $values .= ', ';  
     } 
     $x++; 
    } 


    $sql = "INSERT INTO users (`" . implode('`, `', $keys) . "`) VALUES ({$values})"; 

    if(!$this->query($sql, $fields)->error()) { 
     return true; 
    } 

    return false; 
} 

여기에 데이터를 표시 : 당신은 당신이 떨어져 "일명 (A fencepost 오류 앓고있는 의미, $x = 1에서 계산 배열을 시작하는 동안

$user = DB::getInstance()->update('users', 1, array(
     password => 'erwrwe', 
     name => 'Dan' 
)); 
+0

문제점을 명확히 할 수 있습니까? 당신이 묘사하고있는 것을 이해하는 것은 어렵습니다. 암호를 변경하기 만하면 사용자 이름이 0으로 변경됩니까? – Grice

+0

죄송합니다. 제대로 설명하지 못해 죄송합니다. 사용자 이름, 암호 및 이름 필드를 변경하고 싶지만 사용자 정보를 변경하면 암호가 변경되고 사용자 이름은 바뀌지 만 이름이 테이블의 0으로 변경됩니까? – Dan

답변

0

배열은 0에서 시작 -by-one ").

if($x <= count($fields)) { 
      ^--- 

에 코드를 변경하거나 대신 $x = 0로 시작

.


코멘트 후속 : 코드가 무엇을하고 있는지 봐 :

$ 필드 = 배열 ​​('이름'=> 'foo는', '비밀'=> '바');

field -> name, $x -> 1, count -> 2 
    $x < count --> 1 < 2 --> TRUE 
     ... add a ? 
     $x++ 

번째 반복에서 :

두 항목 배열되므로 count($files)

첫번째 반복에서 2

$x = 1; 
foreach($fields as $field) { 
    if ($x < count(fields) { ... } 
} 

이다

field -> password, $x -> 2, count -> 2 
    $x < count --> 2 < 2 --> FALSE 

루프 중단하고 한 번만 ?에 넣어주세요. $values 목록.

세 항목 테스트의 경우 $ x = 1 및 $ x = 2를 성공적으로 처리하지만 $x < 3은 거짓이므로 루프가 세 번째 항목에서 중단됩니다.

예, off-by-one 오류입니다. $x <= 3이 있거나 $ x를 0으로 시작한 경우 해당 배열의 마지막 항목을 올바르게 처리 할 수 ​​있습니다.

+0

세 개의 삽입을 모두 추가하면 사용자 이름, 암호 및 이름 2가 채워지지만 세 번째는 0으로 설정되므로 매우 이상한 일이 발생합니다. – Dan

+0

"3 번째"가 아니며 n-1입니다. 당신은 n-1 항목에 대해 일을 설정하지만 마지막 항목에 대한 n 항목은 항상 삭제됩니다. –

+0

그래서 순서에 따라 이름과 암호를 입력하면 첫 번째 문자 만 삽입되기 때문에 어디서 어떻게 잘못 될까요? 귀하의 제안을 시도했지만 그 오류를 해결하지 못했습니다. – Dan

0

Marc B 답변 외에. 데이터베이스에 텍스트를 삽입하는 경우 주위의 따옴표가 필요합니다.

$sql = "INSERT INTO users (`" . implode('`, `', $keys) . "`) VALUES ('{$values}')"; 
+0

세 개의 삽입을 모두 추가하면 사용자 이름, 암호 및 이름 2가 채워지지만 세 번째 값은 0으로 설정되므로 매우 이상한 일이 발생합니다. – Dan

+0

세 번째 값은 평가되지 않습니다. –

+0

하지만 3 분의 1을 가져 가면 그 중 하나만 평가됩니다 ...? 또한, 순서를 변경하면 그들은 다르게 평가합니다. – Dan

관련 문제