[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из двух БД и запись в csv-файл
ViTYAi
Здравствуйте!

Есть две БД, к которым выполняются запросы:

$result = mssql_query ("Текст запрос №1",$db_mssql);
$myrow = mssql_fetch_array($result);

$result2 = mysql_query("Текст запрос №2",$db);
$myrow2 = mysql_fetch_array($result2);

Код, который сохраняет выборку в csv-файл сейчас выполнен следующим образом:
$pg_f = "temp.csv";
$f=@fopen($pg_f, "w+");
do
{
fputs ($f, $myrow[0].";".$myrow2[1]."\n");
}
while ($myrow = mysql_fetch_array($result));

Как видно в условии while присутствует только проверка первой выборки.
Из второй выборки выводится только первая запись. А как добавить проверку второй выборки, чтобы из неё выводились все значения???



Спустя 27 минут, 3 секунды (4.12.2009 - 09:24) sergeiss написал(а):
Цитата (ViTYAi @ 4.12.2009 - 09:57)
do
{
fputs ($f, $myrow[0].";".$myrow2[1]."\n");
}
while ($myrow = mysql_fetch_array($result));

Для начала объясни (сам себе!!!) алгоритм работы цикла do-while, что он возьмет для записи, что выведет и что потеряет. И когда поймешь, то сделай цикл while{}.

И по твоем вопросу. Непонятен алгоритм. То ли у тебя в выборках всегда будет одинаковое количество строк, и ты хочешь их вывести "параллельно", т.е. первая строка с первой строкой, вторая - со второй и т.д. А может быть, что-то другое?

Небольшой оффтоп (совет smile.gif). Научись четче формулировать вопросы, и тогда ты сам чаще будешь находить на них ответы. Иначе, при "абстрактном" вопросе, тебе никто не поможет.

Спустя 1 час, 25 минут, 16 секунд (4.12.2009 - 10:49) ViTYAi написал(а):
Цитата
Для начала объясни (сам себе!!!) алгоритм работы цикла do-while, что он возьмет для записи, что выведет и что потеряет. И когда поймешь, то сделай цикл while{}.

ну вот код
 do 
{
fputs ($f, $myrow[0]."\n");
}
while ($myrow = mysql_fetch_array($result));

работает без проблем... выводит все записи правильно.
csv-файл содержит в себе:

100
100
100
100
100
100
100
100
...
и т. д.

а надо чтобы в csv-файле было:

100;200
100;200
100;200
100;200
100;200
100;200
100;200
100;200
...
и т. д.

То есть в fputs() добавляем вывод $myrow2[1]:
 do 
{
fputs ($f, $myrow[0].";"$myrow2[1]."\n");
}
while ($myrow = mysql_fetch_array($result));

Но как изменить условие продолжения while()???

Спустя 6 минут, 6 секунд (4.12.2009 - 10:55) Ka4_0k написал(а):

$pg_f = "temp.csv";
$f=@fopen($pg_f, "w+");
do {
fputs ($f, implode(";",$myrow)."\r\n");
} while ($myrow = mysql_fetch_array($result));

А ещё лучше будет вот так:

$pg_f = "temp.csv";
$f=@fopen($pg_f, "w+");
while ($myrow = mysql_fetch_array($result)) {
fputs ($f, implode(";",$myrow)."\r\n");
}
fclose($f);

Только при этом не надо после
$result = mssql_query ("Текст запрос №1",$db_mssql);

ставить вот это
$myrow = mssql_fetch_array($result);

Спустя 2 минуты, 6 секунд (4.12.2009 - 10:57) sergeiss написал(а):
Цитата (ViTYAi @ 4.12.2009 - 11:49)
работает без проблем... выводит все записи правильно.

А теперь объясни, как что он выведет, если в таблице не будет записей???

И ничего ни в каких условиях изменять не надо!!! Надо просто внутри цикла сделать дополнительный вывод знаков "конец строки таблицы" и следом "начало строки таблицы" (</tr><tr>) при определенных условиях.

Спустя 3 минуты, 47 секунд (4.12.2009 - 11:01) Ka4_0k написал(а):
Кстати присмотрелся офигел малёхо О_О
$result = mssql_query ("Текст запрос №1",$db_mssql);
mssql
$myrow = mysql_fetch_array($result)
mysql
blink.gif

Спустя 28 минут, 5 секунд (4.12.2009 - 11:29) ViTYAi написал(а):
Цитата
Кстати присмотрелся офигел малёхо О_О

Две разных БД - mySQL и MS SQL.
Должно быть:

$result = mssql_query ("Текст запрос №1",$db_mssql);
$myrow = mssql_fetch_array($result);

$result2 = mysql_query("Текст запрос №2",$db);
$myrow2 = mysql_fetch_array($result2);


Спустя 2 минуты (4.12.2009 - 11:31) ViTYAi написал(а):
Цитата
А теперь объясни, как что он выведет, если в таблице не будет записей???

Если в таблице не будет записей, то он ничего не выведет, насколько я понимаю...
Цитата
Надо просто внутри цикла сделать дополнительный вывод знаков "конец строки таблицы" и следом "начало строки таблицы" (</tr><tr>) при определенных условиях

Не понимаю, зачем теги <tr></tr>, если это вывод в csv-файл.

Спустя 15 минут (4.12.2009 - 11:46) sergeiss написал(а):
Цитата (ViTYAi @ 4.12.2009 - 12:31)
Если в таблице не будет записей, то он ничего не выведет, насколько я понимаю...

Будет ошибка. Логическая. Потому что исходных данных нету, а вывод данных есть.

Цитата (ViTYAi @ 4.12.2009 - 12:31)
Не понимаю, зачем теги <tr></tr>, если это вывод в csv-файл.

Сорри, это я с другой темой перепутал smile.gif Писал ответ там, потом меня отвлекли, я продолжил писать тут... Забудь про эти тэги в данном случае smile.gif

И ты так и не ответил на вопрос
Цитата (sergeiss @ 4.12.2009 - 10:24)
И по твоем вопросу. Непонятен алгоритм. То ли у тебя в выборках всегда будет одинаковое количество строк, и ты хочешь их вывести "параллельно", т.е. первая строка с первой строкой, вторая - со второй и т.д. А может быть, что-то другое?




Спустя 8 минут, 21 секунда (4.12.2009 - 11:55) ViTYAi написал(а):
Цитата
И ты так и не ответил на вопросЦитата (sergeiss @ 4.12.2009 - 10:24)
И по твоем вопросу. Непонятен алгоритм. То ли у тебя в выборках всегда будет одинаковое количество строк, и ты хочешь их вывести "параллельно", т.е. первая строка с первой строкой, вторая - со второй и т.д. А может быть, что-то другое?

Ну вот смотрите...
Количество строк в выборках будет одинаковое.
Хочу вывести параллельно, то есть:

100;200
100;200
...
и т. д.

100 - это строка из первой выборки, а 200 из второй!

Спустя 7 минут, 29 секунд (4.12.2009 - 12:02) sergeiss написал(а):
тогда сделай цикл так:

$result = mssql_query ("Текст запрос №1",$db_mssql);
$result2 = mysql_query("Текст запрос №2",$db);

$pg_f = "temp.csv";
$f=@fopen($pg_f, "w+");

while( ($myrow2 = mysql_fetch_array($result2)) and ($myrow = mssql_fetch_array($result)) )
{
fputs ($f, $myrow[0].";".$myrow2[1]."\n");
}


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

Подчеркиваю: использование цикла while позволит вообще не заходить внутрь цикла, если в любой из выборок нету строк вообще. А цикл do-while не предохраняет от этой проблемы.

Ты еще можешь добавить счетчик пройденных циклов, и потом сравнить его с количеством доступных строк по каждой из БД. Тогда ты по окончании цикла будешь знать, насколько качественно у тебя было всё отработано.

Спустя 1 час, 32 минуты, 50 секунд (4.12.2009 - 13:35) ViTYAi написал(а):
Цитата
тогда сделай цикл так:

Работает! Весьма благодарен!

А режим работы с файлом "w+" правильно выбран?
Не подскажите, как можно сделать, чтобы csv-файл уже был заполнен полностью, а запросами из БД лишь обновлялись строки. Например, есть csv-файл с 10 строками, как можно обновить лишь 5 первых из них, а другие 5 чтобы остались без изменения?

Спустя 5 минут, 50 секунд (4.12.2009 - 13:41) sergeiss написал(а):
Цитата (ViTYAi @ 4.12.2009 - 14:35)
Не подскажите, как можно сделать, чтобы csv-файл уже был заполнен полностью, а запросами из БД лишь обновлялись строки. Например, есть csv-файл с 10 строками, как можно обновить лишь 5 первых из них, а другие 5 чтобы остались без изменения?

Через функцию file грузишь строки, потом записываешь файл заново. При этом часть данных просто не пишешь обратно, а вместо них - другие строки.

Спустя 2 часа, 27 минут, 55 секунд (4.12.2009 - 16:09) ViTYAi написал(а):
Цитата
Через функцию file грузишь строки

Функцией file() я считаю строки из csv-файла в массив, так?
Цитата
потом записываешь файл заново

Как понять записываю файл заново?
Цитата
При этом часть данных просто не пишешь обратно

А как можно часть данных не писать?


Спустя 10 минут, 6 секунд (4.12.2009 - 16:19) sergeiss написал(а):
Цитата (ViTYAi @ 4.12.2009 - 17:09)
А как можно часть данных не писать?

Функция file() вернет тебе массив. Часть элементов запишешь, а часть - пропустишь...
Цитата (ViTYAi @ 4.12.2009 - 17:09)
Как понять записываю файл заново?

Да так и понять smile.gif Открываешь файл для записи как новый файл. Все данные будут потеряны. Но перед этим ты уже считаешь эти данные через file()

Спустя 2 дня, 14 часов, 55 минут, 45 секунд (7.12.2009 - 07:15) ViTYAi написал(а):
Цитата
Даже если у тебя в выборках будет неравное количество строк, то остановка выборки будет произведена по достижении наименьшего количества строк.

Подскажите, а как добиться, чтобы выводились выборки с неравным количеством строк в одном цикле while?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.