Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在存在的列上插入到表中_Php_Mysql_Sql - Fatal编程技术网

Php 在存在的列上插入到表中

Php 在存在的列上插入到表中,php,mysql,sql,Php,Mysql,Sql,假设我有一个非常大的用户信息数组: $user=array( "name"=>"john", "ip"=>"xx.xx.xx.xx", "email"=>"john@something.com", //lots more values ) 我们还假设此信息需要进入多个表中。例如,用户名需要进入表用户,地址需要进入表详细信息等 现在,我使用某个自制函数将数组键与列名匹配,并将数组值与输入的值匹配,插入到我的表中。类似于此: function insert_sql($table,

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

$user=array(
"name"=>"john",
"ip"=>"xx.xx.xx.xx",
"email"=>"john@something.com",
//lots more values
)
我们还假设此信息需要进入多个表中。例如,
用户名
需要进入表
用户
地址
需要进入表
详细信息

现在,我使用某个自制函数将数组键与列名匹配,并将数组值与输入的值匹配,插入到我的表中。类似于此:

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语句忽略该列?因此,如果我将
名称
电子邮件
地址
,插入表
用户
,但该表没有地址列,我需要它插入带有姓名和电子邮件的行,但忽略地址列不存在的事实


编辑:另一个选项是使用表的列创建一个数组,并使用它来过滤数组中的值。尽管我真的不知道如何设置它。

查找给定的表列名:

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);
    }
如果列不存在,如何使INSERT语句忽略该列? 所以,如果我在表用户中插入姓名、电子邮件、地址,但是这个表 没有地址列,我需要它插入带有 姓名和电子邮件,但忽略地址列是 不在那里

你不能


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

当然,可以使用单独的插入,我想我只是在寻找一种方法来动态拆分数组,然后获得正确的值。谢谢!我将这些列作为数组$columns的值。基于$列过滤$值的最佳方法是什么(记住数组$值的键是列)。无论如何,我找到了这个答案:@hellohellosharp我提供了一个示例,使用
array\u intersect\u key
但是array\u过滤器也很好