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

Форум MySQL

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

 

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

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

тема: Выгрузка данных из MySQL
 
 автор: Felix   (11.11.2004 в 18:50)
 
 

Привет.
У меня стоит задача выгрузить данные хотябы в txt (в идеале нужно в dbf) но я ниразу ничего подобного не писал. Подскажите пож. с чего начать а лучще если есть дайте код для выгрузки а то я пхп знаю плохо, только учусь.

   
 
 автор: cheops   (11.11.2004 в 20:01)   письмо автору
 
   для: Felix   (11.11.2004 в 18:50)
 

Здесь бы очень помогла структура таблицы которую вы хотите преобразовать в dbf-формат...

   
 
 автор: chip   (11.11.2004 в 21:00)   письмо автору
 
   для: cheops   (11.11.2004 в 20:01)
 

есть база (телефонная)
с файлами Dbf Mdx (тут как я понял идексы хранятся) Dbt 1 файл
как бы загнать в MySQL ??? Т.е. отдельные файлы преобразовать в таблицы хотябы.
Структуру выкладывать не смогу размер большой
вот кусок дбф:
cЙh •0  db866ru0 FAM C I C O C UL C DOM C KVARTIRA C TEL C
ЂЃЂ…‚ ѓ‚ 432 74 248264 ЂЃЂ…‚Ђ ’Џ 2523 126 320450 ЂЃЂ‡Ђ ‚Ќ 163 Ђ 32 342379 ЂЃЂ‡Ђ
там дос кодировка

   
 
 автор: cheops   (11.11.2004 в 21:25)   письмо автору
 
   для: chip   (11.11.2004 в 21:00)
 

Нет, такой кусок не пойдёт, здесь бы, конечно, сами файлы нужны, но мне очень уж не хочется получать телефонную базу по почте :) Давайте выясним сначала какие стоблцы в базе:
<?php
// Путь к файлу
$db_path "test.dbf";
// Открываем файл
$dbh dbase_open($db_path,0)
    or die(
"Error! Could not open dbase database file '$db_path'.");
// Возвращаем информацию о столбцах
$column_info dbase_get_header_info($dbh);
// Выводим
print_r($column_info);
?>


PS /*Мрачно поглядывая на файлы *.dat сомнительного содержания*/ А где базы в таком приятном формате берёте?

   
 
 автор: chip   (12.11.2004 в 20:01)   письмо автору
 
   для: cheops   (11.11.2004 в 21:25)
 

переделал в тхт
АБАЕВ|Г|В| 43|2|74|248264|АБАЕВА|Т|П| 25|23|126|320450|
Щас нужно проанализировать файл .
Первое до | в один столбец следущее в другой и.д. но потом опять в первый.
Или проще переделать в cvs ?

   
 
 автор: cheops   (12.11.2004 в 20:35)   письмо автору
 
   для: chip   (12.11.2004 в 20:01)
 

Да в общем и такой формат тоже нормальный... Т.е. переконвертация отменяется или всё ещё требуется помощь?

   
 
 автор: Felix   (12.11.2004 в 05:02)
 
   для: cheops   (11.11.2004 в 20:01)
 

cheops, вот дамп базы которую надо выгрузить в dbf причем надо сделать так чтобы выгрузить можно было не всю базу а любой кусок по дате.

   
 
 автор: cheops   (12.11.2004 в 12:11)   письмо автору
 
   для: Felix   (12.11.2004 в 05:02)
 

Можно примерно вот так поступить
<?php
  
include "config.php";
  
// Определим структуру таблицы tbl
  // в dbf-формате
  
$db_name "tbl.dbf";
  
$def =
    array(
        array(
"date",     "C"50),
        array(
"number",   "N"110),
        array(
"podrazd",  "C"50),
        array(
"uchastok""C"50),
        array(
"mehanizm""C"50),
        array(
"kol_vo",   "C"50),
        array(
"usl_podr""C"50),
        array(
"usl_uch",  "C"50)
    );
  
// Создаём таблицу в 
  
if (!dbase_create($db_name$def))
  {
    echo 
"Ошибка при создании dbf-таблицы";
    exit();
  } 
  
// Извлекаем записи из MySQL
  
$query "SELECT * FROM tbl";
  
$tbl mysql_query($query);
  if(!
$tbl)
  {
    echo 
"Ошибка в синтаксисе SQL-запроса";
    exit();
  }
  
// Открываем созданный dbf-файл
  
$dbh dbase_open("tbl.dbf",2)
    or die(
"Ошибка - невозможно открыть '$db_name'");
  
// В цикле извлекаем записи из MySQL и
  // заносим их в dbf
  
while($table mysql_fetch_array($tbl))
  {
    echo 
$table['data'];
    
// Формируем структуру записи
    
$record =
      array(
        
$table['data'],
        
$table['number'],  
        
$table['podrazd'], 
        
$table['uchastok'],
        
$table['mehanizm'],
        
$table['kol_vo'],  
        
$table['usl_podr'],
        
$table['usl_uch'
      );
    
// Добавляем запись в dbf-файл
    
if(!dbase_add_record($dbh,$record))
    {
      echo 
"Ошибка при добавлении записи в dbf-файл";
      exit();
    } 
  }
  
// Закрываем dbf-файл
  
dbase_close($dbh);
?>

PS Только с number - проблемы какие-то, может его текстовым как KOL_VO сделать?

   
 
 автор: cheops   (12.11.2004 в 12:15)   письмо автору
 
   для: cheops   (12.11.2004 в 12:11)
 

По дате - нужно только соотвествующим образом исправить SQL-запрос, например как по ссылке

http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=679

   
 
 автор: Felix   (15.11.2004 в 06:14)   письмо автору
 
   для: cheops   (12.11.2004 в 12:15)
 

cheops, привет.

Так то все вроде бы ничего, работает нормально вот только когда открываешь созданный dbf в Экселе или в Ассесе без разници, русские символы почемуто в виде кракозябров всяких проявляются, одним словом не читаются.

Не подскажешь как с этим бороться ?
Мне всяко надо чтобы данные были на русском.

   
 
 автор: cheops   (15.11.2004 в 11:44)   письмо автору
 
   для: Felix   (15.11.2004 в 06:14)
 

Судя по всему данные в MySQL набраны в DOS-кой кодировке. Можно сохранить дамп таблицы
mysqldump base>base.sql

где base - имя базы данных (действие выполняется в коммандной строке, а не в mysql). Полученный дамп конвертировать в win-1251 при помощи какого-нибудь перекодировщика (если есть Far можно при помощи его) и загрузить дамп по новой, предварительно уничтожив и созав таблицу
mysql>drop database base
mysql>create database base

действия выполняются в оболочке mysql, а следующая по загрузке в коммандной строке:
mysql base<base.sql

   
 
 автор: Felix   (15.11.2004 в 12:00)   письмо автору
 
   для: cheops   (15.11.2004 в 11:44)
 

cheops, привет.

С подсказкой по кодировкам спасибо.

У меня еще проблема возникла.
Как я уже говорил мне необходимо выгружать за определенный период времени в том числе и по дням.
Я изменил запрос вот так :

  // Извлекаем записи из MySQL
  $query = "SELECT * FROM tbl WHERE year(data)=\"$year\" and month(data)=\"$month\"";
  $tbl = mysql_query($query);
  if(!$tbl)


но это только выгрузка за месяц а если я добавляю еще

and day(data)=\"$day\"


то выдается ошибка о неверном синтаксисе и выгрузки за нужный день не происходит.

Подскажи пожалуйста как сделать верный запрос. Все переменные в скрипт передаются из формы.

   
 
 автор: cheops   (15.11.2004 в 12:07)   письмо автору
 
   для: Felix   (15.11.2004 в 12:00)
 

Хм... попробуйте сначала вывести весь запрос в окно браузера
<?php
  
echo $query."<br>";
?>

Может переменная $day где-нибудь зануляется или выходит за границы месяца...

   
 
 автор: Felix   (15.11.2004 в 12:13)   письмо автору
 
   для: cheops   (15.11.2004 в 12:07)
 

Нет, зануляться она не может и теряться тоже потому как я даже вручную вместо переменной цифрами все прописывал в коде.
Может это какой нибудь косяк в PHP ?

Я использую пакет "Денвер" c последней версией PHP 4

   
 
 автор: cheops   (15.11.2004 в 12:36)   письмо автору
 
   для: Felix   (15.11.2004 в 12:13)
 

Только что с удивлением обнаружил, что такой функции (DAY) в MySQL нет :)))
Есть
DAYOFWEEK - для дня недели (0 - воскресенье)
WEEKDAY - для дня недели (0 - понедельник)
DAYOFMONTH - для дня месяца
DAYOFYEAR - для дня года

   
 
 автор: Felix   (15.11.2004 в 12:48)   письмо автору
 
   для: cheops   (15.11.2004 в 12:36)
 

:))
Все понятно.

Скажите пожалуйста а где взять список всех этих и других функций а то в книжке много чего нету. С описанием на русском языке.

   
 
 автор: Felix   (15.11.2004 в 12:56)   письмо автору
 
   для: Felix   (15.11.2004 в 12:48)
 

Боюсь я вам уже надоел но всетаки хочу еще спросить.

что нужно добавить в код чтобы в dbf файл не добавлялась информация новая к старой а чтобы выгужалась только новая как бы очистить файл перед записью новых данных.

   
 
 автор: cheops   (15.11.2004 в 13:11)   письмо автору
 
   для: Felix   (15.11.2004 в 12:56)
 

Каких-то специальных функций для очистки dbf-файла в PHP нет, но можно перед загрузкой данных просто уничтожать файл функцией unlink() и создавать по-новой.

PS Можете задавать столько вопросов сколько хотите - постараемся ответить на все :)))

   
 
 автор: cheops   (15.11.2004 в 13:07)   письмо автору
 
   для: Felix   (15.11.2004 в 12:48)
 

Полное справочное руководство на русском языке имеется на официальном сайте MySQL http://dev.mysql.com/doc/mysql/ru/index.html

http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=736

   
 
 автор: Felix   (18.11.2004 в 09:45)   письмо автору
 
   для: cheops   (15.11.2004 в 13:07)
 

У меня чтото не получается сделать условие для выгрузки данных к моему скрипту выше.
Я допиал в скрипт вот такой код:

<?
  
// Извлекаем записи из MySQL
  
if($year != "" || $month == "" || $day == "") {
  
$query "SELECT * FROM tbl WHERE year(data)='$year'";
  
$tbl mysql_query($query);
  }
  elseif(
$year != "" || $month != "" || $day == "") {
  
$query "SELECT * FROM tbl WHERE year(data)='$year' and month(data)='$month'";
  
$tbl mysql_query($query);  
  }
  
  
  else {
  
$query "SELECT * FROM tbl WHERE year(data)='$year' and month(data)='$month' and dayofmonth(data)='$day'";
  
$tbl mysql_query($query);
  if(!
$tbl)
  {
    echo 
"Ошибка в синтаксисе SQL-запроса";
    exit();
  } 
  }
?>


а при попытке выгрузить данные ругается на эту строку:

  while($table = mysql_fetch_array($tbl))

   
 
 автор: cheops   (18.11.2004 в 11:33)   письмо автору
 
   для: Felix   (18.11.2004 в 09:45)
 

А что-то я while($table = mysql_fetch_array($tbl)) в скрипте не вижу... Кстати, проверку
<?php
  
if(!$tbl
  { 
    echo 
"Ошибка в синтаксисе SQL-запроса"
    exit(); 
  } 
?>

Следует проводить три раза, так как у вас три раза происходит обращение к функции mysql_query() - возможно где-нибудь всплывёт ошибка...

   
 
 автор: Felix   (18.11.2004 в 19:24)   письмо автору
 
   для: cheops   (18.11.2004 в 11:33)
 

Привет. Вот весь код целиком.


<?php
  
include "config.php";
  
// Определим структуру таблицы tbl
  // в dbf-формате
  
$db_name "tbl.dbf";
  
$def =
    array(
        array(
"date",     "C"50),
        array(
"number",   "N"110),
        array(
"podrazd",  "C"50),
        array(
"uchastok""C"50),
        array(
"mehanizm""C"50),
        array(
"kol_vo",   "C"50),
        array(
"usl_podr""C"50),
        array(
"usl_uch",  "C"50)
    );
  
// Создаём таблицу в
  
if (!dbase_create($db_name$def))
  {
    echo 
"Ошибка при создании dbf-таблицы";
    exit();
  }
  
// Извлекаем записи из MySQL
   
if($year != "" || $month === "" || $day === "") {
  
$query "SELECT * FROM tbl WHERE year(data)='$year'";
  
$tbl mysql_query($query);
  if(!
$tbl)
  {
    echo 
"Ошибка в синтаксисе SQL-запроса";
    exit();
  }
  }
  elseif(
$year != "" || $month != "" || $day === "") {
  
$query "SELECT * FROM tbl WHERE year(data)='$year' and month(data)='$month'";
  
$tbl mysql_query($query);  
  if(!
$tbl)
  {
    echo 
"Ошибка в синтаксисе SQL-запроса";
    exit();
  }
  }
  else {
  
$query "SELECT * FROM tbl WHERE year(data)='$year' and month(data)='$month' and dayofmonth(data)='$day'";
  
$tbl mysql_query($query);
  if(!
$tbl)
  {
    echo 
"Ошибка в синтаксисе SQL-запроса";
    exit();
  }
  }
  
// Открываем созданный dbf-файл
  
$dbh dbase_open("tbl.dbf",2)
    or die(
"Ошибка - невозможно открыть '$db_name'");
  
// В цикле извлекаем записи из MySQL и
  // заносим их в dbf
  
while($table mysql_fetch_array($tbl))
  {
    echo 
$table['data'];
    
// Формируем структуру записи
    
$record =
      array(
        
$table['data'],
        
$table['number'],  
        
$table['podrazd'],
        
$table['uchastok'],
        
$table['mehanizm'],
        
$table['kol_vo'],  
        
$table['usl_podr'],
        
$table['usl_uch']
      );
    
// Добавляем запись в dbf-файл
    
if(!dbase_add_record($dbh,$record))
    {
      echo 
"Ошибка при добавлении записи в dbf-файл";
      exit();
    }
  }
  
// Закрываем dbf-файл
  
dbase_close($dbh);
?> 


При попытке выгрузить данные ругается на эту строку:


  while($table = mysql_fetch_array($tbl))


Как еще изменить запрос не знаю.
Нужно чтобы выгружалть можно было за любой день, месяц, или год целиком.

   
 
 автор: cheops   (18.11.2004 в 19:40)   письмо автору
 
   для: Felix   (18.11.2004 в 19:24)
 

Хм... попробуйте так же на всякий случай обработать ситуацию:
<?php
if($year === "" || $month === "" || $day === "")
{
  echo 
"Все переменные обнулены";
}
?>

У меня ваш вариант на ура работает, правда я в самом начале скрипта определил переменную $year = 2004;

   
 
 автор: Felix   (19.11.2004 в 05:43)   письмо автору
 
   для: cheops   (18.11.2004 в 19:40)
 

Привет cheops.

Проверил в общем я еще все на сто раз, и как ты сказал я тоже проверил, переменные не обнуляются!!!

Что характерно, корректно работает только первое условие в данном случае выгрузка за год.
Я менял условия местами и опять таки корректно работает только первое в списке. При запросе с другим условием выгрузки, выгружаются либо вообще все данные из базы (не взирая на условие) либо вообще не выгружается ничего (пустой файл dbf), хотя ошибок теперь ни в каком случае не выдает! Парадокс не правда ли ?:)

Есть ли другие способы создать условие для выгрузки по датам ? Или может еще что нибудь в этом можно подправить ?

   
 
 автор: cheops   (19.11.2004 в 09:28)   письмо автору
 
   для: Felix   (19.11.2004 в 05:43)
 

Эх... а какже это мы просмотрели-то :( Условие
if($year != "" || $month === "" || $day === "")

будет всегда выполняться когла есть $year, так как логика "ИЛИ", а нужно "И"
if($year != "" && $month === "" && $day === "")

   
 
 автор: Felix   (19.11.2004 в 10:29)   письмо автору
 
   для: cheops   (19.11.2004 в 09:28)
 

cheops, спасибо огромное за оказанную помощь.

Мой грандиозный проект закончен.
Благодаря ему мне возможно дадут квартиру и мы с женой наконец то будем жить отдельно от родителей.

С П А С И Б О !!!!!!! :)

   
 
 автор: cheops   (19.11.2004 в 10:43)   письмо автору
 
   для: Felix   (19.11.2004 в 10:29)
 

Ух ты! Тогда желаю удачи в выбивании квартиры! :)))

   
 
 автор: Felix   (19.11.2004 в 11:10)   письмо автору
 
   для: cheops   (19.11.2004 в 10:43)
 

cheops, у меня возникла еще идея.
Я сделал чтото типа мастера для редактирования уже внесенных данных в базу, а можно как нибудь сделать так чтобы я мог из админского интерфейса блокировать нужные мне строки, и чтобы при попытке юзером редактировать строку ему выскочило сообщение что строка заблокирована админом.

такое возможно ?

   
 
 автор: cheops   (19.11.2004 в 23:29)   письмо автору
 
   для: Felix   (19.11.2004 в 11:10)
 

Можно флажок ввести в каждую запись, т.е. поле типа ENUM которое принимает два значения "lock" (закрыто) и "unlock" (открыто)
ENUM('lock','unlock') NOT NULL default 'unlock'

А при редактировании проверять какое значение имеет та или иная запись.

   
 
 автор: Felix   (22.11.2004 в 05:19)   письмо автору
 
   для: cheops   (19.11.2004 в 23:29)
 

А как сделать проверку записи (lock, unlock) ?

   
 
 автор: Felix   (22.11.2004 в 06:27)   письмо автору
 
   для: Felix   (22.11.2004 в 05:19)
 

Хотя уже не надо. Я сам допер как это сделать

Спасибо за подсказку.

   
 
 автор: Felix   (22.11.2004 в 07:17)   письмо автору
 
   для: Felix   (22.11.2004 в 06:27)
 

MySQL принимает дату только в формате гггг.мм.дд , а мне надо чтобы пользователь вводил дату в формате дд.мм.гггг. Как сделать обработку чтобы дата из формата дд.мм.гггг перед занесением в базу преображалась в формат привычный для MySQL т.е. гггг.мм.дд.
?????

   
 
 автор: cheops   (22.11.2004 в 10:06)   письмо автору
 
   для: Felix   (22.11.2004 в 07:17)
 

Перенёс ответ в новую тему, а то это уже слишком длиная.

http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=849

   
 
 автор: chip   (16.11.2004 в 07:24)   письмо автору
 
   для: Felix   (11.11.2004 в 18:50)
 

MySQL-Front
есть программа такая попробуй ее мож где она поможет ;)
а на wincmd.ru есть плагины для тотал-командера для работы с cvs и pdf
(для просмотра и конвертации)

   
Rambler's Top100
вверх

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