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

Форум PHP

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

 

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

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

тема: Как создать поле со списком?
 
 автор: Andrey_V   (06.01.2006 в 14:40)   письмо автору
 
 

Как создать в php поле со списком, строки в который должны загружаться при помощи переменных (из массива, например)?

   
 
 автор: cheops   (06.01.2006 в 15:03)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 14:40)
 

Можно поступить следующим образом
<?php
  $arr
[1] = "Первый";
  
$arr[2] = "Второй";
  
$arr[3] = "Третий";
  
$arr[4] = "Четвёртый";
  if(
count($arr) > 0)
  {
    echo 
"<select name=id_catalog onchange='show(this.form.id_catalog)'>";
    echo 
"<option value=0>Не имеет значения</option>";
    foreach(
$arr as $index => $value)
    {
      echo 
"<option value=$index>$value</option>";
    }
    echo 
"</select>";
 }
?>

   
 
 автор: Andrey_V   (06.01.2006 в 15:10)   письмо автору
 
   для: cheops   (06.01.2006 в 15:03)
 

Спасибо!
А как теперь выбранную позицию поместить в переменную?

   
 
 автор: cheops   (06.01.2006 в 15:21)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 15:10)
 

Не очень понятно что имеется ввиду - в обработчике HTML-формы? Обработчик будет находится в этой же файле или в другом? Другими словами какая у вас цель, что вы делаете?

   
 
 автор: Andrey_V   (06.01.2006 в 15:25)   письмо автору
 
   для: cheops   (06.01.2006 в 15:21)
 

Есть php файл. В нем запрос к базе mysql? потом идет вывод в таблицу на экран. Теперь надо, чтобы в поле со списком выбирался критерий, после этого записи из mysql должны выводиться с учетом этого критерия

   
 
 автор: cheops   (06.01.2006 в 15:33)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 15:25)
 

Возможо вам подойдёт следующий скрипт
<html>
<head>
</head>
<body>
<?php 
  $arr
[1] = "Первый"
  
$arr[2] = "Второй"
  
$arr[3] = "Третий"
  
$arr[4] = "Четвёртый"
  echo 
"<form name=form method=post>";
  if(
count($arr) > 0
  { 
    echo 
"<select name=id_catalog onchange='this.form.submit()'>"
    echo 
"<option value=0>Не имеет значения</option>"
    foreach(
$arr as $index => $value
    { 
      echo 
"<option value=$index>$value</option>"
    } 
    echo 
"</select>"
  } 
  echo 
"</form>";
  echo 
$_POST['id_catalog'];
?>
</body>
</html>

$_POST['id_catalog'] - содержит выбранный индекс или 0, если ничего не выбрано. Только перед использованием его в SQL-запросе проверьте, чтобы $_POST['id_catalog'] был целочисленным
<?php 
  
if(!preg_match("|^[\d]+$|",$_POST['id_catalog']) && !empty($_POST['id_catalog'])) exit("Недопустимый параметр"); 
?>

иначе будет возможна SQL-инъекция.

   
 
 автор: Andrey_V   (06.01.2006 в 15:40)   письмо автору
 
   для: cheops   (06.01.2006 в 15:33)
 

Сейчас буду пробовать. Большое спасибо!

   
 
 автор: Andrey_V   (06.01.2006 в 16:26)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 15:40)
 

Спасибо еще раз!
Все замечательно получилось. Только 2 непонятные вещи:
- при выборе позиции, используемой по умолчанию не задается никакого значения списку и не проиходит обновление;
- после обновления список не хочет вставать на выбранную перед обновлением позицию, а выводит снова позицию по умолчанию.
Что-нибудь можно сделать?

   
 
 автор: cheops   (06.01.2006 в 16:44)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 16:26)
 

1) Вы ведь можете изменять значение $_POST['id_catalog'] сами как вам заблагорассудится, в том числе и назначать ему значение по умолчанию, если ничего не выбрано или это первая загрузка скрипта
<?php
  
if(empty($_POST['id_catalog'])) $_POST['id_catalog'] = 0;
?>

2) Для этого следует воспользоваться ключевым словом selected, который нужно присвоить выбранному полю.

Объединяя можно получить новый скрипт:
<html>
<head>
</head>
<body>
<?php 
  $arr
[1] = "Первый"
  
$arr[2] = "Второй"
  
$arr[3] = "Третий"
  
$arr[4] = "Четвёртый"
  echo 
"<form name=form method=post>";
  if(
count($arr) > 0
  { 
    echo 
"<select name=id_catalog onchange='this.form.submit()'>"
    echo 
"<option value=0>Не имеет значения</option>"
    foreach(
$arr as $index => $value
    { 
      if(
$index == $_POST['id_catalog']) $selected "selected";
      else 
$selected "";
      echo 
"<option value=$index $selected>$value</option>"
    } 
    echo 
"</select>"
  } 
  echo 
"</form>";

  
// Если ничего не выбрано - выбираем значение по умолчанию
  
if(empty($_POST['id_catalog'])) $_POST['id_catalog'] = 0;
  echo 
$_POST['id_catalog'];
?>
</body>
</html>

   
 
 автор: Andrey_V   (06.01.2006 в 16:59)   письмо автору
 
   для: cheops   (06.01.2006 в 16:44)
 

Спасибо. Сейчас попробую

   
 
 автор: Andrey_V   (06.01.2006 в 17:07)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 16:59)
 

Спасибо. Все получилось.
Еще вопрос появился.
Я ставлю три таких блока для выбора. Они у меня располагаются один под другим. А как сделать, чтобы располагались в одной строке?

   
 
 автор: Эдуард   (06.01.2006 в 17:23)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 17:07)
 

Это всё дело делается для html, код выглядит вот так:

<select name="select">
</select>
<select name="select2">
</select>
<select name="select3">
</select>

   
 
 автор: Andrey_V   (06.01.2006 в 17:32)   письмо автору
 
   для: Эдуард   (06.01.2006 в 17:23)
 

Сейчас попробую.
А пока выяснилось: все три списка влияют друг на друга. Т.е., если в одном выбираем второй пункт, то и в других тоже сразу выбирается второй пункт.
Можно это как-то исправить?

   
 
 автор: cheops   (06.01.2006 в 21:02)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 17:32)
 

Не должно так быть.

   
 
 автор: Andrey_V   (06.01.2006 в 17:39)   письмо автору
 
   для: Эдуард   (06.01.2006 в 17:23)
 

А тут что-то не понял. Куда и как здесь надо вносить php блоки? Это я имею в виду перечень трех блоков select в HTML

   
 
 автор: Andrey_V   (06.01.2006 в 19:23)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 17:39)
 

Списки как надо расположил.
Остался только вопрос, как сделать, чтобы три поля со списком не влияли друг на друга

   
 
 автор: cheops   (06.01.2006 в 21:11)   письмо автору
 
   для: Andrey_V   (06.01.2006 в 19:23)
 

Прикрепите к посту то, что у вас получилось - если списки влияют друг на друга - это не нормально...

   
 
 автор: Futurer   (07.01.2006 в 02:18)   письмо автору
 
   для: cheops   (06.01.2006 в 21:11)
 

Да там скорее всего перепутались одинаковые переменные php и всего-то. Надо проверить.

   
 
 автор: Andrey_V   (07.01.2006 в 12:12)   письмо автору
 
   для: Futurer   (07.01.2006 в 02:18)
 

Да. Переменные-то одинаковые.
Пробую поменять имена, но что-то не помогает. Покажите, пожалуйста, какие переменные надо поменять. Во первом блоке - добавлением к имени переменной _2, а во втором блоке _3
==================================================================
<?php
$arr_2[1] = "Краткий";
$arr_2[2] = "Страницы";
echo "<form name=form method=post>";
if(count($arr_2) > 0)
{
echo "<select name=id_catalog onchange='this.form.submit()'>";
echo "<option value=0>Таблица</option>";
foreach($arr_2 as $index => $value)
{
if($index == $_POST['id_catalog']) $selected = "selected";
else $selected = "";
echo "<option value=$index $selected>$value</option>";
}
echo "</select>";
}
echo "</form>";
// Если ничего не выбрано - выбираем значение по умолчанию
if(empty($_POST['id_catalog'])) $_POST['id_catalog'] = 0;
//-----------------------------------------------------
//Задание порядка сортировки
$arr_3[1] = "Производитель";
$arr_3[2] = "Цена";
echo "<form name=form method=post>";
if(count($arr_3) > 0)
{
echo "<select name=id_catalog onchange='this.form.submit()'>";
echo "<option value=0>Наименование</option>";
foreach($arr_3 as $index => $value)
{
if($index == $_POST['id_catalog']) $selected = "selected";
else $selected = "";
echo "<option value=$index $selected>$value</option>";
}
echo "</select>";
}
echo "</form>";
// Если ничего не выбрано - выбираем значение по умолчанию
if(empty($_POST['id_catalog'])) $_POST['id_catalog'] = 0;
?>
==================================================================

   
 
 автор: cheops   (07.01.2006 в 13:37)   письмо автору
 
   для: Andrey_V   (07.01.2006 в 12:12)
 

Атрибут name у каждого из select должен быть уникальным - иначе как вы их друг от друга отличите...

   
 
 автор: Andrey_V   (07.01.2006 в 15:13)   письмо автору
 
   для: cheops   (07.01.2006 в 13:37)
 

Поменял (выделено жирным).
Результат. Когда меняем что-то в одном списке в другом ничего не меняется.
Но!
Если переходим в другой список, то предыдущий сразу сбрасывается в ноль (переходит на значение по умолчанию)
Вывел внизу два эха, чтобы нагляднее было видно. Может быть попробуете у себя? А то у меня скоро мозги расплавятся
===================================
<?php
$arr_2[1] = "Краткий";
$arr_2[2] = "Страницы";
echo "<form name=first method=post>";
if(count($arr_2) > 0)
{
echo "<select name=id_catalog_2 onchange='this.form.submit()'>";
echo "<option value=0>Таблица</option>";
foreach($arr_2 as $index => $value)
{
if($index == $_POST['id_catalog_2']) $selected = "selected";
else $selected = "";
echo "<option value=$index $selected>$value</option>";
}
echo "</select>";
}
echo "</form>";
// Если ничего не выбрано - выбираем значение по умолчанию
if(empty($_POST['id_catalog_2'])) $_POST['id_catalog_2'] = 0;
//-----------------------------------------------------
//Задание порядка сортировки
$arr_3[1] = "Производитель";
$arr_3[2] = "Цена";
echo "<form name=second method=post>";
if(count($arr_3) > 0)
{
echo "<select name=id_catalog_3 onchange='this.form.submit()'>";
echo "<option value=0>Наименование</option>";
foreach($arr_3 as $index => $value)
{
if($index == $_POST['id_catalog_3']) $selected = "selected";
else $selected = "";
echo "<option value=$index $selected>$value</option>";
}
echo "</select>";
}
echo "</form>";
// Если ничего не выбрано - выбираем значение по умолчанию
if(empty($_POST['id_catalog_3'])) $_POST['id_catalog_3'] = 0;

echo "Первый: ".$_POST['id_catalog_2'];
echo "Второй: ".$_POST['id_catalog_3'];
?>
=============

   
 
 автор: cheops   (07.01.2006 в 20:24)   письмо автору
 
   для: Andrey_V   (07.01.2006 в 15:13)
 

Уберите событие onchange='this.form.submit()' во всех <select> и поставьте в HTML-форме обычную кнопку.

   
 
 автор: Andrey_V   (07.01.2006 в 21:31)   письмо автору
 
   для: cheops   (07.01.2006 в 20:24)
 

Первую часть по удалению сделал своими руками.
А как добавить обычную кнопку?

   
 
 автор: Andrey_V   (07.01.2006 в 23:16)   письмо автору
 
   для: Andrey_V   (07.01.2006 в 21:31)
 

Поставил кнопочку. Но там опять какие-то заморочки. Попробовал всяко-разноэ И получился приемлимый вариант таким:
в первом select оставил

onchange='this.form.submit()'
/ во стором и третьем - убрал. Стало все срабатывать нормально. Конечно есть небольшое неудобство: страница обновляется при выборе только в первом select/ Зато все остальное работает нормально. Т.е. первый select - выбор раздела товаров и услуг, второй и третий - представление(кратко-полно) и сортировка. Так теперь при изменении представления и сортировки никаких действий не производится, но когда изменяем раздел товаров и услуг - все изменяется, а правильный выбор в select(ах) остается.
Конечно, хотелось бы, чтобы обновление происходило при всех выборах, но это все-таки решение на 90 процентов.
Если вдруг мелькнут какие-то мысли по решению такой проблемы - сообщите, пожалуйста!

Большое спасибо за очень ценные и очень конкретные советы!!!

   
Rambler's Top100
вверх

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