-2

開発中は単純なことをしていましたINSERTが、戻ってSQL保護とプリペアドステートメントを入れています。私が受け取るエラーは次のとおりです。

警告:PDOStatement :: execute():SQLSTATE [HY093]:無効なパラメーター番号:バインドされた変数の数がトークンの数と一致しません

これが私がSOの他の人の助けから使っているコードです。

// 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

3 に答える 3

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);
于 2012-08-26T14:45:33.950 に答える
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);

すべての列の値を定義されている順序で設定すると、列の名前を省略できます。

ただし、列名を配置する値と、値を配置する疑問符を配置します。

于 2012-08-26T14:32:45.300 に答える
0

INSERT INTO tbl_name(col1、col2)VALUES(111,222)、(333,444);

于 2012-08-26T14:34:24.143 に答える