我有以下代码可以正常工作,因为它使用了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插入而不是更新?
答案 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
的键/值数组请注意,上述功能不包括任何数据验证,我单独执行此操作。