Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: записать данные из CSV файла в конкретную, уже созданную базу данных
 
 автор: Zhora_88   (08.04.2010 в 20:45)   письмо автору
 
 

Доброе всем время суток.
Поставлена задача записать данные из 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.
Подскажите, пожалуйста, как решить проблему и возможно какие ошибки в коде еще увидели. Заранее благодарен.

  Ответить  
 
 автор: sim5   (08.04.2010 в 20:52)   письмо автору
 
   для: Zhora_88   (08.04.2010 в 20:45)
 

fgetcsv() вместо $elements[]=explode(";",$line);
В цикле сформировать строку запроса для многострочного оператора INSERT и потом сделать один запрос к базе.
Проблему со временем решите заглянув в функции работы с датами.

  Ответить  
 
 автор: Zhora_88   (10.04.2010 в 15:30)   письмо автору
 
   для: sim5   (08.04.2010 в 20:52)
 

Объясните, пожалуйста, более популярно второй абзац, точнее розпишите.

  Ответить  
 
 автор: sim5   (10.04.2010 в 16:10)   письмо автору
 
   для: 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)");

  Ответить  
 
 автор: Zhora_88   (12.04.2010 в 13:24)   письмо автору
 
   для: 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.

  Ответить  
 
 автор: sim5   (12.04.2010 в 15:21)   письмо автору
 
   для: Zhora_88   (12.04.2010 в 13:24)
 

Почитайте о типах данных в MySQL.
Это время выполнения скрипта превысило отведенное ему время.

  Ответить  
 
 автор: Zhora_88   (13.04.2010 в 10:08)   письмо автору
 
   для: sim5   (12.04.2010 в 15:21)
 

спасибо за полезный и конкретизирующий ответ. некоторые ошибки я понимаю, а от как их решить - хз.

  Ответить  
 
 автор: Trianon   (13.04.2010 в 10:40)   письмо автору
 
   для: Zhora_88   (13.04.2010 в 10:08)
 

Наверное их (эти ошибки) стоит для начала перечислить.
Касательно даты и времени.
Дата-время в MySQL запрос может попадать лишь в двух видах.
в восточном календарном '2010-04-13 10:45:11'
либо в виде линейной величины FROM_UNIXTIME(1271155511)
Других способов нет.
Один из этих видов стороной php должен быть подготовлен так или иначе.

Касательно вещественных чисел.
Числа, являющиеся смешанными дробями, в MySQL запросе должны быть записаны с десятичной точкой так или иначе.
Впрочем тут спасает банальная str_replace()

  Ответить  
 
 автор: Zhora_88   (13.04.2010 в 12:43)   письмо автору
 
   для: Trianon   (13.04.2010 в 10:40)
 

спасибо за полезную функцию..разобрался, получилось. остается нерешен вопрос с датами.... я правильно понимаю: если я преобразую дату из файла вида: 14.02.2006 20:08:15 в вид: 14-02-2006 20:08:15 , то скрипт без проблем внесет преобразованную дату в поле типа таймстамп?? или лучше использовать другой тип поля ДАТА, чтобы не возникло проблем со сравнением даты??

  Ответить  
 
 автор: sshpavlo   (13.04.2010 в 12:33)   письмо автору
 
   для: Zhora_88   (08.04.2010 в 20:45)
 

Ну что там?? Получается??

  Ответить  
 
 автор: Zhora_88   (15.04.2010 в 12:14)   письмо автору
 
   для: sshpavlo   (13.04.2010 в 12:33)
 

Впринципе все получилось. Кому не влом, Разьясните мне разницу между функциями fgetcsv() и explode()... Есть ли разница в скорости обработки КСВ файла при их приминении?

  Ответить  
 
 автор: Trianon   (15.04.2010 в 13:13)   письмо автору
 
   для: Zhora_88   (15.04.2010 в 12:14)
 

>Разьясните мне разницу между функциями fgetcsv() и explode()...

Дело в том, что поля csv-файла и сами по себе могут содержать символы-разделители.
explode с таким форматом не справится всяко.

  Ответить  
 
 автор: Zhora_88   (16.04.2010 в 17:08)   письмо автору
 
   для: Trianon   (15.04.2010 в 13:13)
 

в таком случае понятно... у меня ксв нормальный, тоесть разделителя в тексте не встречается...

  Ответить  
 
 автор: Trianon   (16.04.2010 в 19:25)   письмо автору
 
   для: Zhora_88   (16.04.2010 в 17:08)
 

Еще раз. В нормальном ксв может встречаться разделитель, может встречаться кавычка (которая тоже имеет отдельный метод представления), может встречаться перенос строки..
А что в Вашем - Вы можете только гадать. Потому что совершенно очевидно, что тот конкретный инстанс ксв-файла, который Вам потребуется импортировать - еще не создан.

  Ответить  
 
 автор: Zhora_88   (19.04.2010 в 17:12)   письмо автору
 
   для: Trianon   (16.04.2010 в 19:25)
 

Я знаю от а до я какой ксв файл я буду импортировать. Его вариант только один. Спасибо всем за помощь. Тема закрыта.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования