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 :: Вывод результата запроса

 PHP.SU

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


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

> Описание: сложные схемы работы
Uchenik
Отправлено: 08 Февраля, 2012 - 15:05:23
Post Id



Частый гость


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


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




Добрый день!
У меня есть функция, которая делает запрос к БД, но чтобы она сделала правильный запрос нужно передать ей несколько параметров
PHP:
скопировать код в буфер обмена
  1. global $result; //глобальная переменная в которую выгрузится результат функции
  2. $table=$db_plugins; //имя таблицы, из которой нужно вытянуть данные
  3. $field='*'; //какие поля нужны
  4. $cycle=true; //использовать ли цикл в запросе
  5. sql_select($table,$field,$where,$cycle); //вызов функции

PHP:
скопировать код в буфер обмена
  1. function sql_select($table,$field,$where,$cycle)
  2. {global $result; //принимаем глобальную переменную созданную до вызова функции
  3. if (!empty($where)) //если условие указано
  4. //используем версию с условием
  5. {$sql="SELECT ".$field."
  6.                 FROM ".$table."
  7.                 WHERE ".$where."";}
  8. //или используем версию без условия
  9.                 else
  10. {$sql="SELECT ".$field." FROM ".$table."";}
  11. $res=mysql_query($sql);
  12. if ($cycle==true)//если указано включить цикл
  13. //пропускаем через цикл
  14. {while($row = mysql_fetch_row($res)) //специально используем ROW потому-что не знаем имена полей
  15. {$result=mysql_fetch_row($res);}
  16. }
  17. //или запрос без цикла
  18. else {$result=mysql_fetch_assoc($res);}
  19. //возвращаем результат
  20. return $result;
  21. }


Подскажите, если запрос проходит через цикл, он будет работать пока не переберёт всю таблицу, а как мне сохранить все результаты, у меня сохраняется только последний, создать ещё одну глобал переменную, которая будет массивом, и будет принимать результат каждого прохода цикла как строку? Или можно сделать проще? Ниндзя
 
 Top
snikers987
Отправлено: 08 Февраля, 2012 - 15:14:14
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


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




PHP:
скопировать код в буфер обмена
  1.  
  2. while($row = mysql_fetch_row($res)){
  3.     $result[] =$row;
  4. }
  5.  

(Добавление)
PHP:
скопировать код в буфер обмена
  1. function sql_select($table,$field,$where='',$cycle=false){
  2.     $sWhere ='';
  3.     if (!empty($where)){
  4.         $sWhere = ' WHERE '.$where  
  5.     }
  6.         $sql="SELECT ".$field." FROM ".$table.$sWhere;
  7.     $res=mysql_query($sql);
  8.     if(!$res) return mysql_error();
  9.     if ($cycle==true){
  10.         while($row = mysql_fetch_row($res)){
  11.             $result[] = $row;
  12.         }
  13.     }else{
  14.         $result=mysql_fetch_assoc($res);
  15.     }
  16.     return $result;
  17. }


PHP:
скопировать код в буфер обмена
  1.  
  2. $rResult = sql_select('table', '*');
  3. var_dump($rResult);
  4.  

(Отредактировано автором: 09 Февраля, 2012 - 11:39:32)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 05:46:14
Post Id



Частый гость


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


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




snikers987, спасибо, логику я понял. Не понятно только одно.
Почему Var_Dump выводит результат NULL. Это как? Т.е. результат не пустой, но и не несёт никаких данных. странно.
Может полная конструкция прояснит ситуацию:
PHP:
скопировать код в буфер обмена
  1. $type='2';
  2. $table=$db_plugins;
  3. $field='*';
  4. $cycle=true;
  5. sql_selector($type,$table,$field,$data,$where,$cycle);

Вот так я вызываю. функцию во всех скриптах. На самом деле sql_selector это конструкция из 7и разных функций.
Т.е. как-то так:
PHP:
скопировать код в буфер обмена
  1.  function sql_selector($type,$table,$field,$data,$where,$cycle)
  2. {
  3.     switch($type)
  4.     {
  5.       case '1':sql_insert($table,$field,$data);break;
  6.       case '2':sql_select($table,$field,$where,$cycle);break;
  7.       case '3':sql_delete($table,$field,$where);break;
  8.       case '4':sql_update($table,$field,$where);break;
  9.       case '5':sql_drop($table,$field,$where);break;
  10.       case '6':sql_alter($table,$field,$where);break;
  11.      }
  12. }

Дальше идут сами функции, ну вот функция, которая делает выбор (sql_select)
она сейчас такая, как Вы предложили, а что может быть не так? Почему результат не работает, т.е. я не совсем понимаю как его вызвать этот результат.
Кстати на 4 строке функции, у вас синтаксическая ошибка.
(Добавление)
Попробовал ещё вот так
Спойлер (Отобразить)

Выводит ArrayArrayArray и так далее кучу раз.
А вот echo $result[0]; выводит просто А
c print_r такая же ситуация.

(Отредактировано автором: 09 Февраля, 2012 - 06:34:17)

 
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 10:55:09
Post Id



Частый гость


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


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




Попробую использовать Imlode, результат позже выложу. =)
 
 Top
snikers987
Отправлено: 09 Февраля, 2012 - 11:47:54
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


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




А почему дожно быть не NULL? Разве sql_selector() у Вас что-то возвращает?
PHP:
скопировать код в буфер обмена
  1. function sql_selector($type,$table,$field,$data,$where,$cycle)
  2. {
  3.     switch($type)
  4.     {
  5.       case '1': return sql_insert($table,$field,$data);
  6.       case '2': return sql_select($table,$field,$where,$cycle);
  7.       case '3': return sql_delete($table,$field,$where);
  8.       case '4': return sql_update($table,$field,$where);
  9.       case '5': return sql_drop($table,$field,$where);
  10.       case '6': return sql_alter($table,$field,$where);
  11.       default: return NULL;
  12.      }
  13. }


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 11:51:50
Post Id



Частый гость


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


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




Тогда я чуть-чуть в замешательстве. Получается что все функции, которые вызываются внутри функции передают значение только родительской функции?
Ну т.е. если sql_selector запустил для выполнения функцию sql_select, то результат работы sql_select передаётся только в sql_selector и не передаётся дальше? Т.е. чтобы получить разультат вне функций, нужно в sql_selector'е указывать что-то типа $result=$sql_select($res); так что-ли?
 
 Top
snikers987
Отправлено: 09 Февраля, 2012 - 12:43:55
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


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




Чесно говоря я Вас совершенно не понял..
Что куда должно передаваться?
sql_selector() возвращает результат работы одной и функций указаной в $type или NULL если тип не извесный.
PHP:
скопировать код в буфер обмена
  1. $result = sql_selector($type,$table,$field,$data,$where,$cycle);
  2. var_dump($result);
  3.  

А вообще структура мягко сказать странная у Вас..


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 13:03:28
Post Id



Частый гость


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


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




=)
Суть вот в чем.
Пользователем через специальный интерфейс заполняются параметры запроса:
Type = тип запроса. Всего их 6
Field = какие поля нужно найти
Where=какую таблицу нужно просмотреть
Cycle=использовать ли цикл
Т.е. через этот конструктор строится запрос. Сначала все эти данные передаются в sql_selector
который в зависимости от типа переадресовывает все данные в нужную функцию. Всё прекрасно работает, кроме одного. Когда тип выбран 2 - SELECT
строится запрос "SELECT ".$Field." FROM "$Table" WHERE "$Where""
тоже ничего сложного. Но если был передан параметр Cycle=TRUE, т.е. запрос в цикле, начинается тупняк, потому-что возвращаемый функцией результат является строкой, в которой просто много раз написано слово Array.
Ну к примеру мне нужно построить такой запрос
PHP:
скопировать код в буфер обмена
  1. SELECT * FROM Users WHERE `Name`='Alex'

при обычном построениее запроса ничего сложного, мы делаем просто
PHP:
скопировать код в буфер обмена
  1. $sql="SELECT * FROM Users WHERE `Name`='Alex'";
  2. $res=mysql_query($sql);
  3.  
  4. while($myr=mysql_fetch_row($res);)
  5. {echo $myr[0]; echo $myr[1]; //и так далее все поля, которые нужны
  6. }

и выведется своего рода таблица. А если мне не нужно выводить результат сразу, т.к. я вообще не использую echo и print, я просто сохраняю полученные результаты в переменную, которую позже вывожу через шаблон. (отделяю логику от представления)
В случае если запрос должен вывести 1 результат, вывод результата не составит труда, а что если имеется цикл? Т.е. у нас несколько разных результатов, правильно? Что нужно теперь сделать? Как их вывести? Самый логичный вариант это просто взять и добавить в конец цикла что-то типа

т.е. в результате $Result содержит в себе не последний массив, а все полученные массивы в виде строк одного целого массива. Я понятно излагаю?
 
 Top
snikers987
Отправлено: 09 Февраля, 2012 - 13:10:15
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


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




Цитата:
в которой просто много раз написано слово Array.

А что массив в цикле формируется двумерный ничего не говорит?


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 13:13:10
Post Id



Частый гость


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


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




Я пробовал выводить print_r ($result[0][0]); ругается.
Вот так
PHP:
скопировать код в буфер обмена
  1. while($myr=mysql_fetch_row($res))
  2.                         {$string=implode("+",$myr).'<br>';
  3.                         $result.=$string;}

В $result попадает что-то более-менее адекватное, по крайней мере это патом можно прочитать.
PHP:
скопировать код в буфер обмена
  1. $type='2';
  2. $table=$db_plugins;
  3. $field='*';
  4. $where='`pid`>0';
  5. $cycle=true;
  6. sql_selector($type,$table,$field,$data,$where,$cycle);
  7. if (is_array($result)==true)
  8. {$Message = 'result - массив<br>';}
  9. if (is_string($result)==true)
  10. {$Message = 'result-строка<br>';}
  11.  echo $result.'<br>';

Вот так всё выводится почти как нужно, просто патом обработать через explode, убрать все лишнее. Но это слишком топорный вариант. Хочется чего-то более изящного

(Отредактировано автором: 09 Февраля, 2012 - 13:21:01)

 
 Top
EuGen Администратор
Отправлено: 09 Февраля, 2012 - 13:18:53
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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





и

http://phpfaq[dot]ru/debug


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Uchenik
Отправлено: 09 Февраля, 2012 - 13:23:23
Post Id



Частый гость


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


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




EuGen
Спасибо за заботу, но эта линка когда-то была моей домашней страницей, не думаю что там появилось что-то новое =)
А вообще код правильный, всё работает, только вот с выводом результата проблемка. точнее сказать слишком уж много обработок и преобразований получается.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB