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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Столкнулся с проблемой сортировки(выборки) данных из БД!
Сержо
Отправлено: 31 Августа, 2008 - 18:56:28
Post Id


Гость


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


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

[+]


Доброе время суток!
Столкнулся с проблемой сортировки(выборки) данных из БД!
имеются скажем 10 полей : поле1 , поле2.......поле10
Вопрос: как реализовать сортировку(выборку) по этим полям? причем возможно что по всем 10 полям посетитель будет отбирать информацию!
Если не трудно приведите пример.
Заранее благодарен!
 
 Top
Вездеход
Отправлено: 01 Сентября, 2008 - 08:50:44
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


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




каждому полю добавьте персональный идентификатор который имеет уникальное значение.
и потом в SQL-запросе просто добавляйте в блок условия "WHERE ..." условия вида "id='1' and id='52'"


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
EuGen Администратор
Отправлено: 02 Сентября, 2008 - 09:45:25
Post Id


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


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


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




Вообще-то сортировка и отбор - вовсе не одно и то же.
Поясню:
сортировка - это упорядочивание некоторого множества в соответствии с каким-либо признаком. Например, упорядочивание строк по возрастанию первой колонки.
отбор - это выбор элементов множества, удовлетворяющих некоторому условию. Как пример - отбор только тех строк, у которых поле второй колонки больше 10.
Судя по вопросу, Вам нужен именно отбор. В SQL он реализуется с помощью WHERE.
Прочитать можете тут (на русском):
http://www[dot]mysql[dot]ru/docs/man/SELECT[dot]html


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Сержо
Отправлено: 02 Сентября, 2008 - 16:00:56
Post Id


Гость


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


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

[+]


извиняюсь за некорректный вопрос..да мне нужен отбор!
используя WHERE , например
CODE (text):
скопировать код в буфер обмена
  1.  
  2. .
  3. .
  4. .
  5. mysql_query ("select * from table WHERE name='$name' AND name1='$name1' ",$db);
  6.  

дело в том что при таком построении запроса если посетитель ведет отбор по 1 полю(name) , то он ничего и не получает!!! а если ведет в 2 поля(name , name1) то результат будет!
как быть?
 
 Top
pifon1989
Отправлено: 02 Сентября, 2008 - 16:04:26
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


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




PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. mysql_query ("select * from table WHERE name='$name' OR name1='$name1' ",$db);
  4. ?>
  5.  

Попробуйте так. Улыбка


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
EuGen Администратор
Отправлено: 02 Сентября, 2008 - 17:55:10
Post Id


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


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


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




Стандартный выход из ситуации:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. //предполагаем, что форма передает данные методом $_GET
  4. $param0=$_GET['param0'];
  5. $param1=$_GET['param1'];
  6. $param2=$_GET['param2'];
  7. //...
  8. $param10=$_GET['param10'];
  9. $rgWheres=array();
  10. if(isset($param0))
  11. {
  12.    $rgWheres[]="`param0`=".addslashes($param0);
  13. }
  14.  
  15. if(isset($param1))
  16. {
  17.    $rgWheres[]="`param1`=".addslashes($param1);
  18. }
  19.  
  20. if(isset($param2))
  21. {
  22.    $rgWheres[]="`param2`=".addslashes($param2);
  23. }
  24. //...
  25.  
  26. if(isset($param10))
  27. {
  28.    $rgWheres[]="`param10`=".addslashes($param10);
  29. }
  30. $strWhere=join(" AND ", $rgWheres);
  31. if($strWhere)
  32. {
  33.    $strWhere="  WHERE ".$strWhere;
  34. }
  35. $sql="SELECT * FROM `table` ".$strWhere;
  36. ?>
  37.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Сержо
Отправлено: 03 Сентября, 2008 - 21:20:19
Post Id


Гость


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


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

[+]


идея понятна , но не выход из ситуации (или чего я недопонимаю)
смотрим что несет в себе переменная $strWhere
CODE (text):
скопировать код в буфер обмена
  1.  
  2. WHERE 'param0'=поле0 AND 'param1'=поле1 AND 'param2'= AND 'param10'=
  3.  

т.е я выбираю например с поле0 и поле1 какую то информацию , а поле2 .... поле10 меня не интерисуют (оставляю пустыми) , тогда код запроса будет иметь вид см.выше. т.е param2 ... param10 не несут никакой информации и остаются пустыми('param2'= AND 'param10'=)
Как быть тут? или как присвоить пустым значениям запрос типо "ВСЕ ДАННЫЕ" а не тупо пустота после знака равенства , из-за чего запрос не проходит?

(Отредактировано автором: 03 Сентября, 2008 - 21:22:05)

 
 Top
valenok
Отправлено: 03 Сентября, 2008 - 22:25:29
Post Id



Здесь могла бы быть ваша реклама


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


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




CODE (text):
скопировать код в буфер обмена
  1.  
  2. name0: <input name='params[0]'>
  3. name1: <input name='params[1]'>
  4. ..
  5.  


PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. //предполагаем, что форма передает данные методом $_POST
  3.  
  4. $strWhere = Array(1);
  5. foreach ($_POST['params'] as $pararam => $value)
  6.  if(trim($value)!='' && ctype_digit($pararam)) $strWhere[] = '`param'.$pararam.'`=\''.mysql_escape_string($value).'\'';
  7.  
  8. $sql="SELECT * FROM `table` WHERE ".join(' AND ',$strWhere);
  9. ?>

(Отредактировано автором: 03 Сентября, 2008 - 22:28:35)



-----
Truly yours, Sasha.
 
My status
 Top
EuGen Администратор
Отправлено: 04 Сентября, 2008 - 09:08:24
Post Id


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


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


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




Не понял в чем вопрос. Если какой-то из параметров не задан, то isset не состоится и он не попадет в массив $rgWheres и, значит, и в $strWhere, поэтому отбор по ним сделан не будет.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Сержо
Отправлено: 05 Сентября, 2008 - 14:21:24
Post Id


Гость


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


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

[+]


разобрался с идеей EuGen - все получилось ! спс за помощь

(Отредактировано автором: 05 Сентября, 2008 - 14:22:56)

 
 Top
SokoL_BY
Отправлено: 07 Октября, 2008 - 12:05:47
Post Id


Новичок


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


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




Помогите.
$sql="SELECT * FROM players ORDER BY points ASC";
$result=mysql_query($sql,$db);
$num = mysql_num_rows($result);

У меня переменная $num получила значение 5, при этом посчитались все строки таблицы, а мне нужно посчитать (получить номер строки отсортированной таблицы) до поля, где name = $name
 
 Top
valenok
Отправлено: 07 Октября, 2008 - 14:59:25
Post Id



Здесь могла бы быть ваша реклама


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


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




SELECT COUNT(`id`) FROM `players` WHERE `points` < ( SELECT `points` FROM `players` WHERE `name='вася' )


-----
Truly yours, Sasha.
 
My status
 Top
SokoL_BY
Отправлено: 07 Октября, 2008 - 22:23:47
Post Id


Новичок


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


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




valenok пишет:
SELECT COUNT(`id`) FROM `players` WHERE `points` < ( SELECT `points` FROM `players` WHERE `name='вася' )


БД srscript - таблица players на localhost

Ошибка

SQL-запрос :

SELECT COUNT( `player_id` )
FROM `players`
WHERE `points` < (
SELECT `points`
FROM `players`
WHERE name = 'predd' )

Ответ MySQL:
#1064 - You have an error in your SQL syntax near 'SELECT `points`
FROM `players`
WHERE name = 'SokoL_BY' ) ' at line 4
 
 Top
valenok
Отправлено: 08 Октября, 2008 - 11:02:05
Post Id



Здесь могла бы быть ваша реклама


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


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




А исправить не сумели ?

Вероятно, SQL-запрос содержит ошибку. При наличии таковой, ниже будет выведена ошибка MySQL-сервера, облегчающая диагностику проблемы.

ERROR: Незакрытая кавычка @ 90
STR: `
SQL: SELECT COUNT(`id`) FROM `players` WHERE `points` < ( SELECT `points` FROM `players` WHERE `name='вася' )


Посмотрите где кавычки не хватает, и добавьте.


-----
Truly yours, Sasha.
 
My status
 Top
SergeantPEPPER
Отправлено: 10 Октября, 2008 - 16:46:01
Post Id



Частый гость


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


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




SokoL_BY пишет:
SELECT COUNT(`id`) FROM `players` WHERE `points` < ( SELECT `points` FROM `players` WHERE `name='вася' )


У Вас не хватает кавычки после name. Должно быть так:
CODE (text):
скопировать код в буфер обмена
  1. SELECT COUNT(`id`) FROM `players` WHERE `points` < ( SELECT `points` FROM `players` WHERE `name`='вася' )
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB