Php 多行插入失败

Php 多行插入失败,php,mysql,pdo,Php,Mysql,Pdo,在我的开发过程中,我做了一个简单的插入,但我将返回并加入SQL保护和准备好的语句。我收到的错误是: 警告:PDOStatement::execute:SQLSTATE[HY093]:无效参数编号: 绑定变量的数量与令牌的数量不匹配 下面是我在别人的帮助下使用的代码 // foreach to set up variables foreach ($json as $text) { $uoid = mysql_real_escape_string($uoid); $filename

在我的开发过程中,我做了一个简单的插入,但我将返回并加入SQL保护和准备好的语句。我收到的错误是:

警告:PDOStatement::execute:SQLSTATE[HY093]:无效参数编号: 绑定变量的数量与令牌的数量不匹配

下面是我在别人的帮助下使用的代码

// 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();

从外观上看,一切都很匹配,但我仍然不知道如何解决这个问题。有人能指出我做错了什么吗?

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);
如果按照定义的顺序设置所有列的值,则可以忽略列的名称


但是,您将值放在列名应该在的位置,并将问号放在值应该在的位置。

您将值作为列名传递,但没有传递要执行的正确参数

像这样的事情会更正确

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

您看不到错误?您需要列名。您将值放在那里,而不是替换问号。请在提供给社区之前检查您的问题。我不太确定对输出的期望,因为我以前从未使用过准备好的语句。与其投反对票,为什么不尝试实际帮助?@hybrid9如果你没有看到,你的问题有三个答案。嗨,Joachim,谢谢你的意见。我想我理解你说的Joachim,但是我原来的foreach循环$json迭代了5次,所以它变成了一个数组,数组的值在$insert[]中。我有正确输出的列,但我仍然坚持在值中使用“?”。@hybrid9值中应该有问号。您使用的是PDO,因此查询中的每个问号都会被传递到execute的数组中的值替换。一个问号应与$insert数组中的一个值相对应。你试过上面的代码了吗?它将$insert数组更改为一个值数组,每个问号一个值,并将数组传递到execute。我仍然得到一个错误:values?、?、?、?、?、?、?、注意:数组到字符串的转换…警告:PDOStatement::execute:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与tokens@hybrid9听起来数组中的元素少于或多于问号。每个问号都替换为数组的一个元素,因此它们需要匹配。如果看不到您现在使用的实际代码,很难说出更多。