0

Laravel PHP フレームワークの Fluent クエリ ビルダーを使用して、あるテーブルから別のテーブルに行を移動しています。PDOが使用されています。raw query を使用しているDB::query()ときに、次のエラーが表示されます。

エラー

SQLSTATE[21S01]: Insert value list does not match column list: 
1136 Column count doesn't match value count at row 1

SQL: INSERT IGNORE into listings_archive VALUES (?, ?)

クエリ

// Get rows from first table
$rows = DB::table('table_1')
        ->where('id', '>', '12345')
        ->get();

// Copy rows to second table
foreach($rows as $row) {
    $listing = get_object_vars($row);
    DB::query('INSERT IGNORE into table_2 VALUES (?, ?)', $row);
}

$row の var_dump

array(39) {
    ["id"]=>
    string(7) "2511877"
    ["name"]=>
    string(2) "AB"
    ["color"]=>
    NULL
    ["type"]=>
    NULL
    ...

エラーの原因と修正方法を教えてください。要素をNULLs で削除しようとしましたが、それでも同じエラーが発生します!


アップデート

これは、 に渡される配列に問題がある可能性がありDB::query()ます。これらの非常に単純な例では、同様のエラーが発生しました。

$row = array('id', 123);
DB::query('INSERT IGNORE into table_2 VALUES (?, ?)', $row);

$row = array('id' => 123);
DB::query('INSERT IGNORE into table_2 VALUES (?, ?)', $row);

エラー

SQLSTATE[21S01]: Insert value list does not match column list: 
1136 Column count doesn't match value count at row 1
4

2 に答える 2

0

列数が値の数と一致していません。どの列を指定しない場合、デフォルトですべてに設定されるため、次のようになります。

Insert IGNORE into table_2(Column1,Column2) Values (?, ?)

Column1、Column2、Table_1の値を入れるtable_2の2つの列の名前です。

于 2012-09-27T15:14:51.977 に答える
0

同じエラー メッセージが表示されましたが、php で mysqli を使用しました

  • 基本的に上記のように、テーブルの構造が同一でない場合は、フィールドに名前を付ける必要があります

いくつかのいじくり回して解決しました:

$stmt = $con->prepare("INSERT INTO table2
                              (field1, field2, ..., )
                              SELECT
                              field1, field2, ..., 
                              FROM
                              table1 WHERE field = ? ");
于 2013-12-05T11:20:34.577 に答える