我有从CSV导入数据库的未知密钥和值 我的代码是
while($data = fgetcsv($handle,1000,",",'"'))
{
$data=array_map('addslashes',$data); // apply addslashes() to all values
$data=array_combine($csv_fields,$data); // csv fields assoc (key=>value)
$data=array_intersect_key($data,$tbl_fields); // discard redundant
$tbl_fields_str=implode("`,`",array_keys($data));
$tbl_vals_str=implode("','",array_values($data));
$q="INSERT INTO `cmid` (`cmid`,`$tbl_fields_str`) VALUES ('$cmidtrenutni','$tbl_vals_str') ON DUPLICATE KEY UPDATE (`$tbl_fields_str`) VALUES ('$tbl_vals_str')";
$conn->query($q);
}
我需要插入,如果存在,请更新。 我尝试上面的代码,但不起作用 我找到类似http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html的东西 但这对我的方式没有帮助,因为我的表没有定义字段。每个输入的键和值都不同 任何解决方案如何做到这一点?
答案 0 :(得分:2)
这是您的查询:
INSERT INTO `cmid` (`cmid`, `$tbl_fields_str`)
VALUES ('$cmidtrenutni', '$tbl_vals_str')
ON DUPLICATE KEY UPDATE (`$tbl_fields_str`) VALUES ('$tbl_vals_str');
问题在于UPDATE
部分。您需要拆分值,使其如下所示:
INSERT INTO `cmid` (`cmid`, `$tbl_fields_str`)
VALUES ('$cmidtrenutni', '$tbl_vals_str')
ON DUPLICATE KEY UPDATE
col1 = newcol1val,
col2 = newcol2val,
. . .
您使用的简写语法无效。
答案 1 :(得分:1)
试试这个:
$q="INSERT INTO `cmid` (`cmid`,`$tbl_fields_str`) VALUES ('$cmidtrenutni','$tbl_vals_str') ON DUPLICATE KEY UPDATE cmid=cmid";
但我更喜欢使用INSERT IGNORE
来解决您的问题:
$q="INSERT IGNORE INTO `cmid` (`cmid`,`$tbl_fields_str`) VALUES ('$cmidtrenutni','$tbl_vals_str')";
答案 2 :(得分:0)
要从csv文件导入,请查看LOAD DATA INFILE语句或mysqlimport实用程序。
答案 3 :(得分:0)
你不能拥有"未知" mysql DB中的列。如果你想在mysql表中存储键值对,你应该有一个包含两列的表:一个名为" key"而另一个"价值"。添加一个额外的列" cmid"把你的对分组。
此表应具有" cmid"的主索引。和"关键"列。
然后您应该使用如下查询插入值:
$sqlVals = "";
foreach ($data as $key => $val) {
$sqlVals .= "($cmidtrenutni, $key, $val),";
}
$sqlVals = substr($sqlVals, 0, -1); //remove last comma.
$query = "REPLACE INTO `myTable` (`cmid`, `key`,`value`) VALUES $sqlVals";