假设我为用户提供了大量信息:
$user=array(
"name"=>"john",
"ip"=>"xx.xx.xx.xx",
"email"=>"john@something.com",
//lots more values
)
我们还假设此信息需要进入多个表。例如,username
需要进入表users
,address
需要进入details
表等。
现在,我使用某个自制函数插入到我的表中,将数组键与列名和数组值与输入的值相匹配。类似的东西:
function insert_sql($table, arr $values){
GLOBAL $dbc;
$sql="INSERT INTO `$table` (".implode(array_keys($values), ", ").") VALUES (".implode(array_values($values), ", ").")";
$dbc->prepare($sql)->execute();
return $dbc->lastInsertId();
}
//I don't actually use this function, just trying to show you what is being accomplished.
问题是我的功能使用所有键和所有值,所以当我只需要将数组的某些部分放入多个表时,它就不会工作。
问题是:
如果列不存在,如何使INSERT语句忽略?因此,如果我将name
,email
,address
插入表users
,但是这个表没有地址列,我需要它来插入带有名称和电子邮件的行,但只是忽略了地址列不存在的事实。
编辑:另一个选项是使用表的列创建一个数组,并使用它来过滤值数组。虽然我不确定如何设置它。
答案 0 :(得分:1)
查找给定的表列名称:
SELECT
column_name
FROM
information_schema.columns
WHERE
table_name = 'tablename'
然后将$values
数组
示例:
function insert_sql($table, array $values){
global $connection;
$query = "SELECT column_name FROM information_schema.columns WHERE table_name = :tablename";
/* @var $stmt PDOStatement */
$stmt = $connection->prepare($query);
$stmt->execute(array(
'tablename' => $table
));
$columns = array_flip($stmt->fetchAll(PDO::FETCH_COLUMN, 0));
$values = array_intersect_key($values, $columns);
var_dump($values);
}
答案 1 :(得分:1)
如果列不存在,如何使INSERT语句忽略? 所以,如果我将名称,电子邮件,地址,插入表用户,但这个表 没有地址列,我需要它插入行 名称和电子邮件,但只是忽略地址列的事实 不在那里。
你不能
相反,您应该将数据映射到具有单独插入的相应表格。