Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выборка из MySQL и построение результата с требованием.
 
 автор: home-studia   (27.03.2013 в 13:51)   письмо автору
 
 

Здравствуйте.
Крайне нуждаюсь в вашей проф. помощи. Столкнулся с непосильной задачей.

Дано:
БД с именем: base_bd
структура БД:
id | name | info
---------------------------------------------------
1 | Name 1 | 60
2 | Name 2 | 360
3 | Name 3 | 5
4 | Name 4 | 72
5 | Name 5 | 80
6 | Name 6 | 60
7 | Name 7 | 120
8 | Name 8 | 500
9 | Name 9 | 10


<html>
<head>
<title>Выбрать</title>
</head>
<body>
<form action="select.php" method="post">
<select name="vibor1">
<option value="1">Name 1<option>
<option value="2">Name 2<option>
<option value="3">Name 3<option>
<option value="4">Name 4<option>
<option value="5">Name 5<option>
<option value="6">Name 6<option>
<option value="7">Name 7<option>
</select>
<select name="vibor2">
<option value="1">Name 1<option>
<option value="2">Name 2<option>
<option value="3">Name 3<option>
<option value="4">Name 4<option>
<option value="5">Name 5<option>
<option value="6">Name 6<option>
<option value="7">Name 7<option>
</select>
<p>
<input type="submit" value="Отправить">
</p>
</body>
</html> 


Задача: Из первого выпадающего списка выбираем "Name 2", из второго например "Name 6" после нажатия на кнопку "Отправить" необходимо сформировать список. Первым в списке должен быть с самым высоким параметром "info" в БД. В нашем случаи это "Name 2" с 360 далее необходимо вставить "Name" из БД по убыванию до выбранного "Name 6" с info равным 60.

Вот что должно получиться на выходе.

1. Name 2 - 360 (выбран из выпадающего меню)
2. Name 5 - 80
3. Name 4 - 72
4. Name 1 - 60
5. Name 6 - 60 (выбран из выпадающего меню)

  Ответить  
 
 автор: confirm   (29.03.2013 в 11:30)   письмо автору
 
   для: home-studia   (27.03.2013 в 13:51)
 

Получили выбор, проверили не превышает ли второе значение первого и не нулевые ли результаты после приведения к integer, делаете запрос на выборку для id больше или равного первому значению и меньше или равно второму, сортируете по полю info по убыванию. Можно вообще сформировать список из этих двух значений для оператора IN, и сделать так выбор. Вот и все.

  Ответить  
 
 автор: home-studia   (29.03.2013 в 13:09)   письмо автору
 
   для: confirm   (29.03.2013 в 11:30)
 

confirm очень рад вас видеть! :-) Спасибо за ответ.
Когда-то вы помогли мне вот таким кодом:

<?
//формируем строку параметров для запроса
$id implode(","array_map("intval"$_POST['set']));
//запрос
$q mysql_query("SELECT * FROM table_name WHERE id IN(".$id.")");
if(
$q) {
   if(
mysql_num_rows($q)) {
      while(
$row mysql_fetch_assoc($q)) {
         
//вывод таблицы 
      
}  
   } 


Не могу понять что за "intval". Серфинг по информации "array_map" дал понять. что "intval" это некая функция, но откуда она берется? Если правильно понимаю, то "['set']" это наши <option value=""> переданные через POST. Но как связать этот код с этой формой:

<html>
<head>
<title>Выбрать</title>
</head>
<body>
<form action="select.php" method="post">
<select name="vibor1">
<option value="1">Name 1<option>
<option value="2">Name 2<option>
<option value="3">Name 3<option>
<option value="4">Name 4<option>
<option value="5">Name 5<option>
<option value="6">Name 6<option>
<option value="7">Name 7<option>
</select>
<select name="vibor2">
<option value="1">Name 1<option>
<option value="2">Name 2<option>
<option value="3">Name 3<option>
<option value="4">Name 4<option>
<option value="5">Name 5<option>
<option value="6">Name 6<option>
<option value="7">Name 7<option>
</select>
<p>
<input type="submit" value="Отправить">
</p>
</body>
</html>  

  Ответить  
 
 автор: confirm   (29.03.2013 в 13:47)   письмо автору
 
   для: home-studia   (29.03.2013 в 13:09)
 

intval(), array_map() - описание этих функций все объясняет.
У вас то задача для небольшого набора двух переменных, а значит можно:
<?
$n1 
= isset($_POST['vibor1']) ? (int)$_POST['vibor1'] : null;
$n2 = isset($_POST['vibor2']) ? (int)$_POST['vibor2'] : null;
if(
$n1 && $n2 && $n1 $n2) { //соблюдены ли условия
    //формируем строку запроса
    
$q 'SELECT * FROM tbl WHERE id IN('.implode(','range($n1$n2)).') OREDER BY info DESC';
    echo 
$q;
} else {
    
//error out
}

Вас не коробит от именования переменных как vibor и подобных? ) Выбор по английски, это choice.

  Ответить  
 
 автор: home-studia   (29.03.2013 в 14:30)   письмо автору
 
   для: confirm   (29.03.2013 в 13:47)
 

Спасибо, confirm. Как и всегда вы даете самый лучший ответ, коротко и по теме. Приеду домой почитаю информацию по вашим ссылкам и опробую код. Человеческое вас спасибо :-)

P.S. от "vibor " коробит, написал на скорую руку в финальном варианте, когда разберусь приведу все к гармонии :-) надеюсь, что разберусь.

  Ответить  
 
 автор: home-studia   (29.03.2013 в 14:52)   письмо автору
 
   для: confirm   (29.03.2013 в 13:47)
 

Вероятнее всего я ошибаюсь, но разве строчка:
$q = 'SELECT * FROM tbl WHERE id IN('.implode(',', range($n1, $n2)).') OREDER BY info DESC'; 

не должна быть такой:
$q = mysql_query("SELECT * FROM tbl WHERE id IN('.implode(',', range($n1, $n2)).') OREDER BY info DESC"); 

?

  Ответить  
 
 автор: confirm   (29.03.2013 в 15:14)   письмо автору
 
   для: home-studia   (29.03.2013 в 14:52)
 

Я же написал в примере комментарии, из которых следует, что $q это переменная содержащая строку запроса, а не сам запрос к базе. А далее эта строка выводится на экран, чтобы результат примера увидеть.
А сам запрос в этом случае будет выглядеть так: $q = mysql_query($q). Вот после этого переменная $q будет содержать не строку, а ресурс, результат запроса к базе. Можете и сразу запрос делать, так как у вас во второй строке.

  Ответить  
 
 автор: home-studia   (29.03.2013 в 15:52)   письмо автору
 
   для: confirm   (29.03.2013 в 15:14)
 

Получается весь код должен быть таким?


<?
$n1 
= isset($_POST['vibor1']) ? (int)$_POST['vibor1'] : null;
$n2 = isset($_POST['vibor2']) ? (int)$_POST['vibor2'] : null;
if(
$n1 && $n2 && $n1 $n2) { //соблюдены ли условия
    //формируем строку запроса
    
$q mysql_query("SELECT * FROM tbl WHERE id IN('.implode(',', range($n1$n2)).') OREDER BY info DESC"); 
   if(
$q) {
   if(
mysql_num_rows($q)) {
      while(
$row mysql_fetch_assoc($q)) {
         
//вывод таблицы 
      
}  
   } 
}     
} else {
    
//error out
}
?>

  Ответить  
 
 автор: confirm   (29.03.2013 в 16:00)   письмо автору
 
   для: home-studia   (29.03.2013 в 15:52)
 

Вот для того, чтобы понять, что же получится в результате кода, который есть в строке запроса, я и написал не сразу запрос, а строку его. Замените в моем примере строку мою на вашу - "SELECT * FROM tbl WHERE id IN('.implode(',', range($n1, $n2)).') OREDER BY info DESC". И выполните мой пример. Что вы увидите при этом в браузере?

  Ответить  
 
 автор: home-studia   (29.03.2013 в 16:05)   письмо автору
 
   для: confirm   (29.03.2013 в 16:00)
 

На код:
<?
$n1 
= isset($_POST['vibor1']) ? (int)$_POST['vibor1'] : null;
$n2 = isset($_POST['vibor2']) ? (int)$_POST['vibor2'] : null;
if(
$n1 && $n2 && $n1 $n2) { //соблюдены ли условия
    //формируем строку запроса
    
$q mysql_query("SELECT * FROM tbl WHERE id IN('.implode(',', range($n1$n2)).') OREDER BY info DESC");
    echo 
$q;
} else {
    
//error out

?>

браузер показал пустую страницу

  Ответить  
 
 автор: confirm   (29.03.2013 в 16:34)   письмо автору
 
   для: home-studia   (29.03.2013 в 16:05)
 

Я вам написал заменить в коде моего примера, а не выполнять свой. А в в моем примере на экран выводится не ресурс, а строка. Ну вы же думайте, что творите, ну разве же так можно.
Если вы напишите так:
<?
$q 
"SELECT * FROM tbl WHERE id IN('.implode(',', range($n1$n2)).') OREDER BY info DESC"
echo 
$q;
То браузер отобразит не пустую строку, а это:
SELECT * FROM tbl WHERE id IN('.implode(',', range(2, 7)).') OREDER BY info DESC
Как вы думаете, является ли такая строка корректной и понятной для MySQL?
Вы взяли и честно скопировали то, что я написал, я в писал строку обрамленную в одинарные кавычки, а вы пишите ее в двойных кавычках, и моя вставка у вас оказалась в одинарных. Этот ляп видно даже в вашем коде - разве подсветка его не показывает, что строка имеет ошибку? Наверное же должно быть так:
<?
$q 
mysql_query("SELECT * FROM tbl WHERE id IN(".implode(','range($n1$n2)).") OREDER BY info DESC");
если использовать двойные кавычки, как вы думаете?

И вообще - не просто копируйте код вам предлагаемый, всегда анализируйте его, иначе проку от этого не будет. Вот вы пишите:
Когда-то вы помогли мне вот таким кодом:
где ссылаетесь на код:
<?
//формируем строку параметров для запроса 
$id implode(","array_map("intval"$_POST['set'])); 
//запрос 
$q mysql_query("SELECT * FROM table_name WHERE id IN(".$id.")");

И далее продолжаете:
Если правильно понимаю, то "['set']" это наши <option value=""> переданные через POST. Но как связать этот код с этой формой:
Но ведь данный код к текущей вашей задаче никак не подходит, вам в ней не приходит массив значений, вам приходят два крайних значения, и значит надо еще сформировать этот список. И это можно сделать построив такой массив с помощью функции range(), и только потом уже implode(). Ну разве же можно ранее вам показанный код клеить как универсальный куда непопадя?

  Ответить  
 
 автор: home-studia   (29.03.2013 в 16:48)   письмо автору
 
   для: confirm   (29.03.2013 в 16:34)
 

Перечитаю дома на свежую голову, сейчас не получается. Извините. Если не против, то напишу позже.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования