2012-08-26 5 views
-2

내 개발 과정에서 단순한 INSERT을 수행하고 있었지만 SQL 보호 및 준비 문을 다시 작성합니다. 받은 오류 :여러 MySQL 행 INSERT 실패

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

다음은 내가 다른 사람의 도움을 받아 사용하고있는 코드입니다.

// foreach to set up variables 
foreach ($json as $text) { 
    $uoid = mysql_real_escape_string($uoid); 
    $filename = mysql_real_escape_string($uoid.".jpg"); 
    $filedate = mysql_real_escape_string($datetime); 
    $imagedesc = mysql_real_escape_string($desc); 

    // array of values 
    $insert[] = array($uoid,$filename,$filedate,$imagedesc); 
} 

function placeholders($text, $count=0, $separator=","){ 
    $result = array(); 
    if($count > 0){ 
     for($x=0; $x<$count; $x++){ 
      $result[] = $text; 
     } 
    } 
    return implode($separator, $result); 
} 

foreach($insert as $d){ 
    $question_marks[] = '(' . placeholders('?', sizeof($d)) . ')'; 
}   

$pdo = new PDO('mysql:dbname=photo_gallery;host=127.0.0.1', 'myuser', 'mypass'); 
$pdo->beginTransaction(); 
$sql = "INSERT INTO wp_gallery (" . implode(',', array_values($insert)) . ") 
     VALUES " . implode(',', $question_marks); 
// reading output 
echo $sql; 

$stmt = $pdo->prepare($sql); 

try { 
    $stmt->execute($insert[0]); 
} catch (PDOException $e){ 
    echo $e->getMessage(); 
} 

$pdo->commit(); 

나는 SQL 출력 봐 :

INSERT INTO wp_gallery (10219776,10219776.jpg,my image description,2012-08-01 15:36:29) 
VALUES (?,?,?,?),(?,?,?,?),(?,?,?,?),(?,?,?,?) 

모든 단지 그것의 모양에 의해 일치하지만 난 여전히이 문제를 해결하는 방법에 관해서는 당황하고있다. 누군가 내가 잘못하고있는 것을 지적 할 수 있습니까?

+4

이 오류가 표시되지 않습니까? –

+0

열 이름이 필요합니다. 당신은 물음표를 대체하지 않고 거기에 가치를두고 있습니다. – Ryan

+0

커뮤니티에 제공하기 전에 질문을 검토하십시오. –

답변

0

당신은 열 이름으로 값을 전달하고, 당신은 실행할 수있는 올바른 매개 변수를 전달하지 않는;

이와 비슷한 것이 더 정확할 것입니다.

// Replace the $insert buildup. Array of values, you don't want an array of arrays here. 
$insert = array_merge($insert, array($uoid,$filename,$filedate,$imagedesc)); 

... 

$column_names = array("column1", "column2", "column3", "column4"); 

$sql = "INSERT INTO wp_gallery (" . implode(',', $column_names) . ") 
    VALUES " . implode(',', $question_marks); 

$stmt->execute($insert); 
+0

안녕하세요, 요아킴, 입력 해 주셔서 감사합니다. 나는 당신이 Joachim을 말하고있는 것을 이해하고 있다고 생각하지만 원래의 foreach 루프 ($ json)는 5 번 반복하므로 $ insert []에있는 값을 가진 배열의 배열이됩니다. 제대로 출력하는 열이 있지만 여전히 '?' VALUES에. – hybrid9

+0

@ hybrid9 "값"에는 물음표가 있어야합니다. PDO를 사용하고 있으므로 쿼리의 모든 물음표가 실행에 전달 된 배열의 값으로 대체됩니다. 하나의 물음표는'$ insert' 배열의 한 값과 일치해야합니다. 위의 코드를 사용해 보셨습니까? '$ insert' 배열을 물음표 당 하나의 값 배열로 변경하고 배열을 실행으로 전달합니다. –

+0

여전히 오류가 발생합니다 : VALUES (?,?,?,?,?,?,?,?,?,?,?) "}주의 : 배열을 문자열로 변환하는 중 .... 경고 : PDOStatement :: execute) : SQLSTATE [HY093] : 잘못된 매개 변수 번호 : 바인딩 된 변수 수가 토큰 수와 일치하지 않습니다. – hybrid9

0

INSERT 문은 다음과 같습니다

INSERT INTO name_of_the_table (name_of_column_1, name_of_column_2,...) VALUES 
(value_of_column_1, value_of_column_2), (value_of_column_1, value_of_column_2); 

당신은 그들이 정의 된 순서에있는 모든 컬럼의 값을 설정하면

, 당신은 열 이름을 생략 할 수 있습니다.

그러나 값을 입력해야하는 곳에 열 이름과 물음표를 넣어야합니다.