假设我为用户提供了大量信息:
$user=array( "name"=>"john", "ip"=>"xx.xx.xx.xx", "email"=>"john@something.com", //lots more values )
我们还假设此信息需要 放入多个表中 。例如username需要进入表users,address需要进入details表,等等。
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,但这个表没有地址栏,我需要它插入的名称和电子邮件行,但简单地忽略一个事实,即在地址栏是不存在的。
name
email
编辑:另一个选项是使与表的列的数组,并使用它来筛选值数组。尽管我不确定如何设置。
查找给定的表列名称:
SELECT column_name FROM information_schema.columns WHERE table_name = 'tablename'
然后只需将$values阵列中的密钥列入白名单
$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); }