-2

SQLクエリが動的に生成されている場合でもpdoを使用するため、正常に機能する次のコードがあります(私は思います)。

$fields = array(
    'col1'  => 'radiobutton1',
    'col2'  => 'radiobutton2'
);

$parts = array();

foreach($fields as $dbfield => $field){
    $parts[] = '`' . $dbfield . '` = :' . $dbfield;
}

$DBH = new PDO( "mysql:host=localhost;dbname=database", "user", "pass" );
$DBH -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$STH = $DBH -> prepare( 'UPDATE `table1` SET ' . join(', ', $parts) . ' WHERE `id`= :id' );

$STH -> bindParam( ':id', $some_id_here, PDO::PARAM_INT, 4 );

foreach($fields as $dbfield => $field) {
    $value = isset($_POST[$field]) ? 1 : 0;
    $STH -> bindValue( ':' . $dbfield, $value, PDO::PARAM_INT);
}

$STH -> execute();

私の質問は、これを変更して、更新の代わりにSQL挿入を行うにはどうすればよいですか?

4

4 に答える 4

1

あなたはこのようにそれを行うことができます:

'INSERT INTO `table1` SET `id`= :id, ' . join(', ', $parts)

idに自動インクリメントがある場合:

'INSERT INTO `table1` SET ' . join(', ', $parts)
于 2013-03-27T09:21:46.277 に答える
1

このコードはチェックボックスでのみ機能することを意図しているようです。すべてのフィールドタイプで機能させる場合は、2番目のforeachを次のように変更する必要があります

foreach($fields as $dbfield => $field) {
    if (isset($_POST[$field])) {
        $STH -> bindValue( ':' . $dbfield,$_POST[$field] );
    }
}

残りは単純です。UPDATEをINSERTに置き換えて、クエリからWHERE部分を削除するだけです(明らかにバインディングIDを削除します)。

于 2013-03-27T10:22:18.537 に答える
0

私はこのようなものがうまくいくと思います:(私はjoin()の代わりにimplode()を使用しますが、それは本質的に同じです)。代わりにimplode()を使用する理由は、join()をSQLステートメントと一緒に使用するのが混乱していると思うからです(SQLかPHPかをよく考える必要があります)。私はコードをテストしていませんが、あなたが写真を撮ってくれることを願っています。

<?php
//...some code...
$dbValues = array();

foreach($fields as $dbfield => $field) {
    $dbValues[] = isset($_POST[$field]) ? 1 : 0;
}

$STH = $DBH -> prepare( 'INSERT INTO `table1` (' . implode(', ', $parts) . ') VALUES(' . implode(', ', $dbValues) . ')' );

//..more code...
?>
于 2013-03-27T09:38:39.630 に答える
-1

これは、MySQL/PDOを使用した動的挿入に使用する関数です。

function DB_Insert($table, $data) {
    $bind = ':'.implode(',:', array_keys($data));
    $sql  = 'INSERT INTO ' . $table . '(' . implode(',', array_keys($data)) . ') ' . 'VALUES (' .$bind. ')';
    $stmt = $DBH->prepare($sql);
    $stmt->execute(array_combine(explode(',',$bind), array_values($data)));
}

$ tableは、テーブルの単なる文字列です。

$ dataは、$ data ['column1']=value1の形式を使用するキー/値配列です。

上記の関数にはデータ検証が含まれていないことに注意してください。これは個別に行います。

于 2013-03-27T10:08:36.767 に答える