Есть две БД, к которым выполняются запросы:
$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{}.
И по твоем вопросу. Непонятен алгоритм. То ли у тебя в выборках всегда будет одинаковое количество строк, и ты хочешь их вывести "параллельно", т.е. первая строка с первой строкой, вторая - со второй и т.д. А может быть, что-то другое?
Небольшой оффтоп (совет ). Научись четче формулировать вопросы, и тогда ты сам чаще будешь находить на них ответы. Иначе, при "абстрактном" вопросе, тебе никто не поможет.
Спустя 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
Спустя 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-файл. |
Сорри, это я с другой темой перепутал Писал ответ там, потом меня отвлекли, я продолжил писать тут... Забудь про эти тэги в данном случае
И ты так и не ответил на вопрос
Цитата (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 написал(а):
тогда сделай цикл так:
Даже если у тебя в выборках будет неравное количество строк, то остановка выборки будет произведена по достижении наименьшего количества строк.
Подчеркиваю: использование цикла while позволит вообще не заходить внутрь цикла, если в любой из выборок нету строк вообще. А цикл do-while не предохраняет от этой проблемы.
Ты еще можешь добавить счетчик пройденных циклов, и потом сравнить его с количеством доступных строк по каждой из БД. Тогда ты по окончании цикла будешь знать, насколько качественно у тебя было всё отработано.
$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) |
Как понять записываю файл заново? |
Да так и понять Открываешь файл для записи как новый файл. Все данные будут потеряны. Но перед этим ты уже считаешь эти данные через file()
Спустя 2 дня, 14 часов, 55 минут, 45 секунд (7.12.2009 - 07:15) ViTYAi написал(а):
Цитата |
Даже если у тебя в выборках будет неравное количество строк, то остановка выборки будет произведена по достижении наименьшего количества строк. |
Подскажите, а как добиться, чтобы выводились выборки с неравным количеством строк в одном цикле while?