Php 在存在的列上插入到表中
假设我有一个非常大的用户信息数组:Php 在存在的列上插入到表中,php,mysql,sql,Php,Mysql,Sql,假设我有一个非常大的用户信息数组: $user=array( "name"=>"john", "ip"=>"xx.xx.xx.xx", "email"=>"john@something.com", //lots more values ) 我们还假设此信息需要进入多个表中。例如,用户名需要进入表用户,地址需要进入表详细信息等 现在,我使用某个自制函数将数组键与列名匹配,并将数组值与输入的值匹配,插入到我的表中。类似于此: function insert_sql($table,
$user=array(
"name"=>"john",
"ip"=>"xx.xx.xx.xx",
"email"=>"john@something.com",
//lots more values
)
我们还假设此信息需要进入多个表中。例如,用户名
需要进入表用户
,地址
需要进入表详细信息
等
现在,我使用某个自制函数将数组键与列名匹配,并将数组值与输入的值匹配,插入到我的表中。类似于此:
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语句忽略该列?因此,如果我将名称
,电子邮件
,地址
,插入表用户
,但该表没有地址列,我需要它插入带有姓名和电子邮件的行,但忽略地址列不存在的事实
编辑:另一个选项是使用表的列创建一个数组,并使用它来过滤数组中的值。尽管我真的不知道如何设置它。查找给定的表列名:
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);
}
如果列不存在,如何使INSERT语句忽略该列?
所以,如果我在表用户中插入姓名、电子邮件、地址,但是这个表
没有地址列,我需要它插入带有
姓名和电子邮件,但忽略地址列是
不在那里
你不能
相反,您应该使用单独的插入将数据映射到相应的表。当然,可以使用单独的插入,我想我只是在寻找一种方法来动态拆分数组,然后获得正确的值。谢谢!我将这些列作为数组$columns的值。基于$列过滤$值的最佳方法是什么(记住数组$值的键是列)。无论如何,我找到了这个答案:@hellohellosharp我提供了一个示例,使用
array\u intersect\u key
但是array\u过滤器也很好