Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: цикл while в цикле while

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
haveFun
Отправлено: 26 Января, 2011 - 10:05:01
Post Id



Гость


Покинул форум
Сообщений всего: 102
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




столкнулся с проблемой, что цикл в цикле не работает.
задача такова. есть база данных с таблицами и таблица с шестизначными числами.
нужно выявить те шестизнаки, у которых нет таблиц.
PHP:
скопировать код в буфер обмена
  1. $select = mysql_query("SELECT * FROM `".$database."`.`".$library."` WHERE `id_x` = 3 ORDER BY `id`");
  2. $table_list = mysql_query('SHOW TABLES FROM `'.$library.'`');
  3. while ($row = mysql_fetch_row($table_list)) {
  4.         while ($array = mysql_fetch_array($select)) {
  5.                 if ($array['id_x6'] == $row[0]) echo ''.$array['id_x6'].'<br>';
  6.                 else echo '-<br>';
  7.         }
  8. }

Цитата:
010101
-
-
-
-
-

первый цикл закрывается сразу после первого элемента, хотя в нем 4 элемента.
второй проходит полностью. всего 1 раз вместо 4х.

такую конструкцию что, нельзя использовать? не понимаю почему она не работает и первый цикл завершается не вовремя.
 
 Top
Zuldek
Отправлено: 26 Января, 2011 - 10:57:32
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




http://php.su/forum/topic.php?fo...1&topic=4545

(Отредактировано автором: 26 Января, 2011 - 12:05:22)

 
 Top
TM123
Отправлено: 26 Января, 2011 - 19:32:08
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Нояб. 2010  
Откуда: Москва


Помог: 0 раз(а)




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


-----
Программим потихоньку http://www[dot]altycon[dot]ru
 
 Top
Мелкий Супермодератор
Отправлено: 26 Января, 2011 - 19:53:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




TM123, нет, понимаете неверно. Ответ mysql'а сохранён в ресурсе и его можно дёрнуть, пока существует переменная или до вызова mysql_free_result.

haveFun, mysql_data_seek в помощь. После первого пробега по ответу mysql указатель стоит на последней строке, mysql_fetch_array отвечает false, т.к. больше строк нет, и цикл прерывается не успев начаться.


-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 27 Января, 2011 - 09:24:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




haveFun пишет:
Задача такова. есть база данных с таблицами и таблица с шестизначными числами Нужно выявить те шестизнаки, у которых нет таблиц
Для осуществления решения предполагаемой задачи по нахождению информационных полей в целевой БД на основе критерия сравнения элементов контейнерного уровня описания данных - целесообразно использование SQL-продедуры обеспечивающей линейный просмотр требуемых информационных полей с реализацией трактования именованных элементов на уровне локальных переменных


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
TM123
Отправлено: 27 Января, 2011 - 13:35:54
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Нояб. 2010  
Откуда: Москва


Помог: 0 раз(а)




[quote=Мелкий]TM123, нет, понимаете неверно. Ответ mysql'а сохранён в ресурсе и его можно дёрнуть, пока существует переменная или до вызова mysql_free_result.

Я в общем-то больше по MS SQL, но постепенно все больше смещаюсь в сторону MySQL, т.к. все больше надоедает бороться с кривостью MS библиотек для работы с ним из под PHP, а вообще я бывший ASP+MS SQL, так что не судите за возможно несуразные вопросы.

В общем на сколько я понял у MySQL нет курсоров как таковых, подготавливается набор данных, который и выдается. Соответственно вопрос как живет этот набор данных если он связывается с переменной и остается доступным при повторном вызове mysql_query. Подготовленный набор данных хранится на стороне MySQL сервера и выбирается постепенно, либо подготовленный набор полностью закачивается на сторону клиента? Если PHP и MySQL живут на одной машине, где хранится все равно, а если на разных то встает вопрос нагрузки на сеть.

P.S. Я задавал этот вопрос на MySQL форумах, но все осталось без ответа Недовольство, огорчение


-----
Программим потихоньку http://www[dot]altycon[dot]ru
 
 Top
haveFun
Отправлено: 27 Января, 2011 - 16:33:44
Post Id



Гость


Покинул форум
Сообщений всего: 102
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




всем спасибо, ошибка ясна, задача решена при помощи массива. Подмигивание
PHP:
скопировать код в буфер обмена
  1. function exists($database, $library) {
  2.         $i = 0;
  3.         $select = mysql_query("SELECT * FROM `".$database."`.`".$library."` WHERE `id_x` = 3 ORDER BY `id`");
  4.         $idq = array();
  5.         while ($r = mysql_fetch_array($select)) {
  6.                 $idq[] = $r['id_x6'];
  7.                 $i++;
  8.         }
  9.         $unex = array();
  10.         for ($j = 0; $j <= $i-1; $j++) {
  11.                 $table_list = mysql_query('SHOW TABLES FROM `'.$library.'`');
  12.                 $k = FALSE;
  13.                 while ($row = mysql_fetch_row($table_list)) {
  14.                         if ($idq[$j] == $row[0])
  15.                                 $k = TRUE;
  16.                 }
  17.                 if (!$k)
  18.                         $unex[] = $idq[$j];
  19.         }
  20.         return($unex);
  21. }

пыжился с минимизацией кода кстати, но ничего из этого:
PHP:
скопировать код в буфер обмена
  1. $select = mysql_query("SELECT * FROM `".$database."`.`".$library."` WHERE `id_x` = 3 AND `id_x6` NOT IN (SHOW TABLES FROM `".$library."`)");

так и не получилось. Хм

(Отредактировано автором: 27 Января, 2011 - 16:40:06)

 
 Top
JustUserR
Отправлено: 29 Января, 2011 - 23:29:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




TM123 пишет:
Соответственно вопрос как живет этот набор данных если он связывается с переменной и остается доступным при повторном вызове mysql_query
При осуществлении взамимодействия приложения на стороне сервера приложений с СУБД Mysql произвоидтся непосредственное получение информационных полей соответствующих предполагаемому SQL-запросу - и обеспечивается их последующая передача на сторону клиента


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
LEONeso
Отправлено: 30 Января, 2011 - 01:28:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




haveFun, к стати, если собирается массив и видно что $i суммируются при каждом цикле, то не легче использовать count()?

пример:
PHP:
скопировать код в буфер обмена
  1.  
  2.       function exists($database, $library) {
  3.               $select = mysql_query("SELECT * FROM `".$database."`.`".$library."` WHERE `id_x` = 3 ORDER BY `id`");
  4.               $idq = array();
  5.               while ($r = mysql_fetch_array($select)) {
  6.                       $idq[] = $r['id_x6'];
  7.               }
  8.               $unex = array();
  9.               for ($j = 0; $j <= count($idq)-1; $j++) {
  10.                       $table_list = mysql_query('SHOW TABLES FROM `'.$library.'`');
  11.                       $k = FALSE;
  12.                       while ($row = mysql_fetch_row($table_list)) {
  13.                               if ($idq[$j] == $row[0])
  14.                                       $k = TRUE;
  15.                       }
  16.                       if (!$k)
  17.                               $unex[] = $idq[$j];
  18.               }
  19.               return($unex);
  20.       }

(Отредактировано автором: 30 Января, 2011 - 01:29:14)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
JustUserR
Отправлено: 31 Января, 2011 - 19:29:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




LEONeso пишет:
haveFun, к стати, если собирается массив и видно что $i суммируются при каждом цикле, то не легче использовать count()?
Использование функции count в предполагаемом PHP-приложении в действительности позволяет осуществить улучшение визуального восприятия PHP-кода по причине локализации включаемых информационных полей - кроме того указанная модификация не обеспечивать усложнение вычислительной эффективности по причине хранения реального количества элементов массива в статическом элементе


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB