插入存在的列中的表

时间:2013-01-10 00:35:28

标签: php mysql 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,但是这个表没有地址列,我需要它来插入带有名称和电子邮件的行,但只是忽略了地址列不存在的事实。

编辑:另一个选项是使用表的列创建一个数组,并使用它来过滤值数组。虽然我不确定如何设置它。

2 个答案:

答案 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语句忽略?   所以,如果我将名称,电子邮件,地址,插入表用户,但这个表   没有地址列,我需要它插入行   名称和电子邮件,但只是忽略地址列的事实   不在那里。

你不能

相反,您应该将数据映射到具有单独插入的相应表格。