PHP: при загрузке файла данных с помощью sprintf возникла проблема с ‘%’ при преобразовании формата даты

#php #mysql

#php #mysql

Вопрос:

Я пытаюсь загрузить 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, и я уже пытался изменить escape, enclosed и terminated по-прежнему не работает.

Есть ли другой альтернативный способ преобразовать эти даты ‘дд-мм-гг’ в ‘ГГГГ-мм-дд’ или вставить без sprintf?

Ответ №1:

Используйте %% для буквенных % символов в 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));