我正在尝试使用此加载 csv 文件,但日期格式不正确,我需要在插入数据库之前重新格式化
if (is_array($file)) {
foreach ($file as $key => $value) {
$loadData = sprintf("
LOAD DATA local INFILE '%s' IGNORE INTO TABLE pos_vs_cognizant CHARACTER SET UTF8 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n' IGNORE 1 LINES
(
@store,
@business_date,
@ns_pos,
@ns_cognizant,
@ns_variance,
@tc_pos,
@tc_cognizant,
@tc_variance
)
SET
id=null,
store=@store,
business_date=STR_TO_DATE(@business_date, '%d-%b-%y'),
ns_pos=@ns_pos,
ns_cognizant=@ns_cognizant,
ns_variance=@ns_variance,
tc_pos=@tc_pos,
tc_cognizant=@tc_cognizant,
tc_variance=@tc_variance,
unique_row=CONCAT(STR_TO_DATE(@business_date, '%d-%b-%y'),'_',@store,'_',@ns_pos,'_',@tc_pos),
created_at=now()
", addslashes($value));
if (DB::connection()->getpdo()->exec($loadData)) {
$response['status'] = 'success';
//echo'tes';
} else {
$response['status'] = 'error';
//echo'ayaw';
}
}
}else{
//echo'wala nangyre';
}
发生的情况是“%”与 sprintf 有问题,所以我所做的是在没有 sprintf 的情况下尝试它,但它抛出了 mysql 语法错误,我已经尝试更改转义,封闭和终止仍然不起作用。
是否有其他替代方法将这些日期“dd-mm-yy”转换为“YYYY-mm-dd”或不使用 sprintf 插入?
最佳答案
使用 %%
表示 sprintf()
格式字符串中的文字 %
字符。
$loadData = sprintf("
LOAD DATA local INFILE '%s' IGNORE INTO TABLE pos_vs_cognizant CHARACTER SET UTF8 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n' IGNORE 1 LINES
(
@store,
@business_date,
@ns_pos,
@ns_cognizant,
@ns_variance,
@tc_pos,
@tc_cognizant,
@tc_variance
)
SET
id=null,
store=@store,
business_date=STR_TO_DATE(@business_date, '%%d-%%b-%%y'),
ns_pos=@ns_pos,
ns_cognizant=@ns_cognizant,
ns_variance=@ns_variance,
tc_pos=@tc_pos,
tc_cognizant=@tc_cognizant,
tc_variance=@tc_variance,
unique_row=CONCAT(STR_TO_DATE(@business_date, '%%d-%%b-%%y'),'_',@store,'_',@ns_pos,'_',@tc_pos),
created_at=now()
", addslashes($value));
关于PHP:转换日期格式时,使用 sprintf 加载数据文件中出现 '%' 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55152965/