|
|
|
| Доброе всем время суток.
Поставлена задача записать данные из CSV файла в конкретную, уже созданную БД. Код скрипта:
<?php
$filearr=file("63.csv");
$db = mysql_connect("localhost","root","")or die ('Ошибка 1:' . mysql_error());
mysql_select_db("ATS",$db)or die ('Ошибка 2:' . mysql_error());
@mysql_query("SET NAMES 'utf8'");
$elements= array();
foreach($filearr as $line)
{
$elements[]=explode(";",$line);
}
//удалить первый элемент массива
unset ($elements[0]);
//print_r($elements);
//Запрос на виборку по номеру и дате
foreach ($elements as $line)
{
$res=mysql_query("SELECT * FROM `measure_all` where `number` = ".$line[0]." and `date` = ".$line[1]."'")or die ('Ошибка 3:' . mysql_error());
if ($record=mysql_fetch_assoc($res)){
//Если запись есть--- обновить
mysql_query('update measure_all set `number`='.$line[0].', `date`='.$line[1].', `udcag`='.$line[2].', `udcbg`='.$line[3].', `uacag`='.$line[4].', `uacbg`='.$line[5].', `rxag`='.$line[6].', `rxbg`='.$line[7].', `rxab`='.$line[8].', `cxab`='.$line[9].', `cxag`='.$line[10].', `cxbg`='.$line[11].' where id='.$record['id']);
} else {
mysql_query('insert into measure_all `number`='.$line[0].', `date`='.$line[1].', `udcag`='.$line[2].', `udcbg`='.$line[3].', `uacag`='.$line[4].', `uacbg`='.$line[5].', `rxag`='.$line[6].', `rxbg`='.$line[7].', `rxab`='.$line[8].', `cxab`='.$line[9].', `cxag`='.$line[10].', `cxbg`='.$line[11].' ');
}
}
echo mysql_error();
mysql_close($db);
?>
|
В итоге вылетает "ошибка 3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.2006 20:08:15'' at line 1"
Подозреваю, что есть нестыковка формата даты - в ксв 14.02.2006 20:08, а БД поле типа timestamp.
Подскажите, пожалуйста, как решить проблему и возможно какие ошибки в коде еще увидели. Заранее благодарен. | |
|
|
|
|
|
|
|
для: Zhora_88
(08.04.2010 в 20:45)
| | fgetcsv() вместо $elements[]=explode(";",$line);
В цикле сформировать строку запроса для многострочного оператора INSERT и потом сделать один запрос к базе.
Проблему со временем решите заглянув в функции работы с датами. | |
|
|
|
|
|
|
|
для: sim5
(08.04.2010 в 20:52)
| | Объясните, пожалуйста, более популярно второй абзац, точнее розпишите. | |
|
|
|
|
|
|
|
для: Zhora_88
(10.04.2010 в 15:30)
| |
mysql_query("INSERT INTO table (field1,field2,field3) VALUES (val1,val2,val3),(val1,val2,val3), ... (val1,val2,val3)");
|
| |
|
|
|
|
|
|
|
для: sim5
(10.04.2010 в 16:10)
| | Спасибо, с этим разобрался... данные в таблицу вводит, НО в ксв файле все дробные числа разделяються запятыми (например 2,67), а в бд вносит только целую часть (тоесть 2). Тип полей для таких данных - ФЛОАТ. Как заставить скрипт вносить всё число??
По-поводу даты, её я переношу в поле типа ВАРЧАР (правда в этом случае не работает сравнение по дате, только по номеру)....
Плюс ко всему выдает ошибку: Fatal error: Maximum execution time of 30 seconds exceeded in Z:\home\localhost\www\script\begin-temp.php on line 21. | |
|
|
|
|
|
|
|
для: Zhora_88
(12.04.2010 в 13:24)
| | Почитайте о типах данных в MySQL.
Это время выполнения скрипта превысило отведенное ему время. | |
|
|
|
|
|
|
|
для: sim5
(12.04.2010 в 15:21)
| | спасибо за полезный и конкретизирующий ответ. некоторые ошибки я понимаю, а от как их решить - хз. | |
|
|
|
|
|
|
|
для: Zhora_88
(13.04.2010 в 10:08)
| | Наверное их (эти ошибки) стоит для начала перечислить.
Касательно даты и времени.
Дата-время в MySQL запрос может попадать лишь в двух видах.
в восточном календарном '2010-04-13 10:45:11'
либо в виде линейной величины FROM_UNIXTIME(1271155511)
Других способов нет.
Один из этих видов стороной php должен быть подготовлен так или иначе.
Касательно вещественных чисел.
Числа, являющиеся смешанными дробями, в MySQL запросе должны быть записаны с десятичной точкой так или иначе.
Впрочем тут спасает банальная str_replace() | |
|
|
|
|
|
|
|
для: Trianon
(13.04.2010 в 10:40)
| | спасибо за полезную функцию..разобрался, получилось. остается нерешен вопрос с датами.... я правильно понимаю: если я преобразую дату из файла вида: 14.02.2006 20:08:15 в вид: 14-02-2006 20:08:15 , то скрипт без проблем внесет преобразованную дату в поле типа таймстамп?? или лучше использовать другой тип поля ДАТА, чтобы не возникло проблем со сравнением даты?? | |
|
|
|
|
|
|
|
для: Zhora_88
(08.04.2010 в 20:45)
| | Ну что там?? Получается?? | |
|
|
|
|
|
|
|
для: sshpavlo
(13.04.2010 в 12:33)
| | Впринципе все получилось. Кому не влом, Разьясните мне разницу между функциями fgetcsv() и explode()... Есть ли разница в скорости обработки КСВ файла при их приминении? | |
|
|
|
|
|
|
|
для: Zhora_88
(15.04.2010 в 12:14)
| | >Разьясните мне разницу между функциями fgetcsv() и explode()...
Дело в том, что поля csv-файла и сами по себе могут содержать символы-разделители.
explode с таким форматом не справится всяко. | |
|
|
|
|
|
|
|
для: Trianon
(15.04.2010 в 13:13)
| | в таком случае понятно... у меня ксв нормальный, тоесть разделителя в тексте не встречается... | |
|
|
|
|
|
|
|
для: Zhora_88
(16.04.2010 в 17:08)
| | Еще раз. В нормальном ксв может встречаться разделитель, может встречаться кавычка (которая тоже имеет отдельный метод представления), может встречаться перенос строки..
А что в Вашем - Вы можете только гадать. Потому что совершенно очевидно, что тот конкретный инстанс ксв-файла, который Вам потребуется импортировать - еще не создан. | |
|
|
|
|
|
|
|
для: Trianon
(16.04.2010 в 19:25)
| | Я знаю от а до я какой ксв файл я буду импортировать. Его вариант только один. Спасибо всем за помощь. Тема закрыта. | |
|
|
|