MySQL PDO INSERT动态生成查询

时间:2013-03-27 09:05:19

标签: php mysql pdo

我有以下代码可以正常工作,因为它使用了pdo,即使sql查询是动态生成的(我认为)。

$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 个答案:

答案 0 :(得分:1)

你可以这样做:

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

如果您在ID上有自动增量:

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

答案 1 :(得分:1)

似乎此代码仅用于复选框。如果您希望它适用于所有字段类型,则必须将第二个foreach更改为

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

其余的很简单,只需用INSERT替换UPDATE并从查询中删除WHERE部分(显然摆脱绑定id)

答案 2 :(得分:0)

我认为这样的事情会起作用:(我使用implode()而不是join()但它基本上是相同的)。我使用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...
?>

答案 3 :(得分:-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

的键/值数组

请注意,上述功能不包括任何数据验证,我单独执行此操作。