7

次のコードは、配列内の各キーと値のペアをテーブル内のmathing列値に挿入する必要があります。スクリプトはエラーを返しませんが、挿入された行には配列の最後の値のみが含まれます

例えば

array('one'=>1,'two'=>2,'three'=>3);

列1、2、および3のテーブルに行を正常に挿入しますが、すべてに値3を挿入します。

    $columns = array();
    $bind = '';
    foreach($array as $key => $value){

        $columns[] = $key;

    }

    $columnString = implode($columns,',');
    $valueString = implode($columns,',:');
    $valueString = ':' . $valueString;

    $core = core::getInstance();
    $STH = $core->dbh->prepare("INSERT INTO table (" . $columnString . ") VALUES 
    (" . $valueString . ")");

    foreach($array as $key => $value){

        $STH->bindParam(':' . $key,$value);
    }
4

5 に答える 5

10

忘れてbindParam、使用executeして次の値を渡します$array

$STH->execute($array);

または、名前付きパラメーターを完全にスクラッチして、コードを少し単純化することもできます。

$columnString = implode(',', array_keys($array));
$valueString = implode(',', array_fill(0, count($array), '?'));

$STH = $core->dbh->prepare("INSERT INTO table ({$columnString}) VALUES ({$valueString})");
$STH->execute(array_values($array));
于 2012-08-18T15:55:55.077 に答える
2

多分このようなもの:

$columns = array('one'=>1,'two'=>2,'three'=>3);

$columnString = implode(',', array_flip($columns));
$valueString = ":".implode(',:', array_flip($columns));

$core = core::getInstance();
$STH = $core->dbh->prepare("INSERT INTO table (" . $columnString . ") VALUES (" . $valueString . ")");

foreach($columns as $key => $value){
    $STH->bindValue(':' . $key, $value);
}
于 2012-08-18T15:55:38.900 に答える
0
foreach($array as $key => $value){
    $STH->bindParam(':' . $key,$array[$key]);
}

それを試してみてください

于 2012-08-18T15:42:11.833 に答える
0
$conn = new PDO('mysql:host=' . $HOST . ';dbname=' . $DATABASE, $USERNAME, $PASSWORD);
$conn->exec("set names utf8");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

$ins_query = 'INSERT INTO `' . $table_name . '` ';

$columns = array();
$columns_bindings = array();
foreach ($dataArray as $column_name => $data) {
    $columns[] = $column_name;
    $columns_bindings[] = ':' . $column_name;
}

$ins_query = $ins_query . '(' . implode(', ', $columns) . ') VALUES (' . implode(', ', $columns_bindings) . ')';

$stmt = $conn->prepare($ins_query);

foreach ($dataArray as $column_name => $data) {
    $stmt->bindValue(":" . $column_name, $data);
}
if (!$stmt->execute()) {
    print_r($stmt->errorInfo());

} else {
    echo "Insertd";
}
于 2017-05-30T09:34:07.860 に答える
0

@netcoderの応答は、位置プレースホルダーを使用して目標を達成したい場合にも役立ちます。ただし、sprintf関数を使用して、名前付きプレースホルダーを使用して動的SQLクエリを準備できます。

$sql = sprintf("INSERT INTO table (%s) VALUES(%s)",
              implode(", ", array_keys($array)),
              ":" . implode(", :", array_keys($array)));

$pdo->prepare($sql);
$pdo->execute($array);

于 2021-02-26T16:17:12.977 に答える