2

假设我有一个非常大的用户信息数组:

$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 语句忽略该列? 因此,如果我将name, email, address, 插入 table users,但该表没有地址列,我需要它来插入包含名称和电子邮件的行,但只需忽略地址列不存在的事实。

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

4

2 回答 2

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);
    }
于 2013-01-10T00:41:08.927 回答
1

如果某个列不存在,如何使 INSERT 语句忽略该列?因此,如果我在表用户中插入姓名、电子邮件、地址,但该表没有地址列,我需要它来插入包含姓名和电子邮件的行,但忽略地址列不存在的事实。

你不能

相反,您应该使用单独的插入将数据映射到适当的表。

于 2013-01-10T00:43:38.437 回答