在存在的列上插入表
Posted
技术标签:
【中文标题】在存在的列上插入表【英文标题】:INSERT into Table On Columns That Exist 【发布时间】:2013-01-10 00:35:28 【问题描述】:假设我有一个非常大的用户信息数组:
$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
中,但是此表没有地址列,我需要它来插入包含姓名和电子邮件的行,但忽略地址列不存在的事实。
编辑:另一个选项是使用表的列创建一个数组,并使用它来过滤值数组。虽然我不太确定如何设置。
【问题讨论】:
【参考方案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);
【讨论】:
谢谢!我将列作为数组 $columns 的值。根据 $columns 过滤 $values 的最佳方法是什么(记住数组 $values 的键是列)。 没关系,我找到了这个答案:***.com/questions/4260086/… @hellohellosharp 我已经提供了一个示例,使用array_intersect_key
但 array_filter 也可以【参考方案2】:
如果某列不存在,如何让 INSERT 语句忽略该列? 所以如果我在表用户中插入姓名、电子邮件、地址,但是这个表 没有地址列,我需要它来插入带有 姓名和电子邮件,但忽略地址列是 不在那里。
你不能
相反,您应该使用单独的插入将数据映射到适当的表。
【讨论】:
当然,可以使用单独的 INSERTS,我想我只是在寻找一种方法来动态拆分数组然后获得正确的值。以上是关于在存在的列上插入表的主要内容,如果未能解决你的问题,请参考以下文章