问题
希望由一个字段名数组构造一个INSERT或UPDATE查询。例如,希望在数据库中插入一个新用户。不是硬编码写入用户信息的各个字段(如用户名、email地址、邮编、出生日期等),可以把这些字段名放在一个数组中,并使用这个数组建立查询。这样更易于维护,特别是如果需要根据条件用相同的字段集进行插入(INSERT)或更新(UPDATE
时,这种方法就很有用。
解决方案
要构造一个UPDATE查询,需要建立字段/值对的一个数组,然后使用implode()把这个数组的各个元素连接起来。
建立一个UPDATE查询
$user = 'admin';
$password = '123456';
$db = new PDO('mysql:host=127.0.0.1;port=3306;dbname=dvwa', $user, $password);
//字段名列表
$fields = array('symbol','planet','element');
$update_fields = array();
$update_values = array();
foreach($fields as $field){
$update_fields[] = "$field = ?";
//假设数据来自一个表单
$update_values[] = $_POST[$field];
}
$st = $db->prepare("UPDATE zodiac SET " . implode(',', $update_fields) . " WHERE sign = ?");
//将'sign'增加到值数组
$update_values[] = $_GET['sign'];
// 执行查询
$st->execute($update_values);
对于INSERT查询,也要做同样的工作,不过SQL语法有一点不同
建立一个INSERT查询
$fields = array('symbol','planet','element');
$placeholders = array();
$values = array();
foreach($fields as $field){
// 每个字段一个占位符
$placeholders[] = "?";
// 架设数据来自一个表单
$values[] = $_POST[$field];
}
$st = $db->prepare("INSERT INTO zodiac (" . implode(',',$fields) . ") VALUES (" . implode(',', $placeholders) .")");
执行查询
$st->execute($values);