一尘不染

在存在的列上插入表

sql

假设我为用户提供了大量信息:

$user=array(
"name"=>"john",
"ip"=>"xx.xx.xx.xx",
"email"=>"john@something.com",
//lots more values
)

我们还假设此信息需要 放入多个表中 。例如username需要进入表usersaddress需要进入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语句忽略该列?
所以,如果我插入nameemailaddress,成表users,但这个表没有地址栏,我需要它插入的名称和电子邮件行,但简单地忽略一个事实,即在地址栏是不存在的。

编辑:另一个选项是使与表的列的数组,并使用它来筛选值数组。尽管我不确定如何设置。


阅读 139

收藏
2021-03-08

共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);
    }
2021-03-08