Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выпадающий список в два уровня 
:(
    Опции темы
Paladin111
  Дата 30.6.2010, 23:14 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.5.2010

Репутация: нет
Всего: нет



Всем добрый вечер!
Наткнулся на такую вещь:
Имеется выпадающий список в два уровня PHP + mysql
Код

<?php
  // Устанавливаем соединение с базой данных
  require_once("config.php");

  // Начало HTML-формы
  echo "<form action=3.php method=post>";

  // Формируем первый выпадающий список
  $query = "SELECT * FROM catalogs
            ORDER BY name";
  $cat = mysql_query($query);
  if(!$cat) exit(mysql_error());
  // Если имеется хотя бы одна запись
  // формируем выпадающий список
  if(mysql_num_rows($cat) > 0)
  {
    echo "<select name=id_catalog onchange='show(form.id_catalog)'>";
    echo "<option value=0>Не имеет значения</option>";
    while($catalog = mysql_fetch_array($cat))
    {

      echo "<option value=$catalog[id_catalog] $selected>$catalog[name]</option>";

      // Формируем массив первичных ключей каталогов
      $array_catalog[] = $catalog['id_catalog'];
    }
    echo "</select>";
  }

  // Формируем второй выпадающий список
  $query = "SELECT * FROM catalogs";
  $cat = mysql_query($query);
  if(!$cat) exit(mysql_error());
  // Если имеется хотя бы одна запись
  // формируем выпадающий список
  if(mysql_num_rows($cat) > 0)
  {
    while($catalog = mysql_fetch_array($cat))
    {
      // Формируем скрытые списки
      $query = "SELECT * FROM products
                WHERE id_catalog = $catalog[id_catalog]
                ORDER BY name";
      $prd = mysql_query($query);
      if(!$prd) exit(mysql_error());
      // Если в текущем каталоге имеется хотя бы
      // одна товарная позиция формируем выпадающий список
      if(mysql_num_rows($prd) > 0)
      {
        echo "<select id=$catalog[id_catalog] style=\"display:none\" name=product>";
        while($product = mysql_fetch_array($prd))
        {

          echo "<option value=$product[id_product] $selected>$product[name]</option>";
        }
        echo "</select>";
      }
    }
  }
  echo "</br><input type=submit name=send value=Отправить>";

  // Конец HTML-формы
  echo "</form>";
?>
<script language='JavaScript1.1' type='text/javascript'>
<!--
  var messageIdList = new Array(<?= implode(",", $array_catalog) ?>);
  function show(sel)
  {
    for (i = 0; i < messageIdList.length; i++)
    {
      document.getElementById(messageIdList[i]).style.display = "none";
    }
    document.getElementById(sel.options[sel.selectedIndex].value).style.display = "block";
  }
//-->
</script>


При записи в новую таблицу значений из этих списков, записывается значение только из первого, а значение второго записывается "0" из
Код

echo "<option value=0>Не имеет значения</option>";  

Чего тут не хватает? И у кого нибудь может есть скриптик списка в 3 уровня? Очень надо
PM MAIL   Вверх
bars80080
Дата 30.6.2010, 23:49 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



в приведённом коде нет ни строки записи

что находится в 3.php?
PM MAIL WWW   Вверх
Paladin111
Дата 1.7.2010, 00:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.5.2010

Репутация: нет
Всего: нет



Код

include_once("db.php");

        $id_catalog = $_POST['id_catalog'];
        $product = $_POST['product'];

$table_name = "table";
       $sql = "INSERT INTO $table_name (id_catalog, product)
          VALUES('$id_catalog', '$product')";
$result = mysql_query($sql);

Я не правильно указал от куда не записывается:
 
Код

 echo "<option value=$product[id_product] $selected>$product[name]</option>";

то есть записывается самое последнее значение из второго списка, хотя выбираем, допустим в первом второе значение из трех, то оно записывается, а вот во втором которое должно соответствовать первому, записывается всегда последнее.
PM MAIL   Вверх
bars80080
Дата 1.7.2010, 10:14 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



ну что же, теперь стоит посмотреть на страницу, так как она выглядит в браузере.
открываем форму в браузере, щёлкаем правой кнопкой мыши, выбираем "посмотреть исходный (html) код". и если не понятно, то копируем полученный код сюда

в догонку, в этом цикле
        while($product = mysql_fetch_array($prd))
        {
          echo "<option value=$product[id_product] $selected>$product[name]</option>";
        }
$selected не меняется. каков его смысл? а главное результат?
PM MAIL WWW   Вверх
Paladin111
Дата 1.7.2010, 11:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.5.2010

Репутация: нет
Всего: нет



Цитата(bars80080 @ 1.7.2010,  10:14)
 выбираем "посмотреть исходный (html) код". и если не понятно, то копируем полученный код сюда


Код

<form action=3.php method=post>
<p><b>Раздел</b> <br>
<select name='identific_number' onchange='show(form.identific_number)'>
<option value='0'>«Не имеет значения»</option>
<option value='1' >Раздел 1</option>
<option value='2' >Раздел 2</option>
<option value='3' >Раздел 3</option>
<option value='4' >Раздел 4</option></select></p>

 <select name='product' id='1' style="display:none">
<option value='Подраздел 11' > Подраздел 11</option>
<option value='Подраздел 12' > Подраздел 12</option>
<option value='Подраздел 13' > Подраздел 13</option>
</select>
<select name='product' id='2' style="display:none">
<option value='Подраздел 21' > Подраздел 21</option>
<option value='Подраздел 22' > Подраздел 22</option>
<option value='Подраздел 23' > Подраздел 23</option>
<option value='Подраздел 24' > Подраздел 24</option>
<option value='Подраздел 25' > Подраздел 25</option>
<option value='Подраздел 26' > Подраздел 26</option>
</select>
<select name='product' id='3' style="display:none">
<option value='Подраздел 31' > Подраздел 31</option>
<option value='Подраздел 32' > Подраздел 32</option>
<option value='Подраздел 33' > Подраздел 33</option>
<option value='Подраздел 34' > Подраздел 34</option>
</select>
<select name='product' id='4' style="display:none">
<option value='Подраздел 41' > Подраздел 41</option>
</select>

<input type=submit name=send value=Отправить></form>

<script language='JavaScript1.1' type='text/javascript'>
<!--
  var messageIdList = new Array(1,2,3,4);
  function show(sel){
    for (i = 0; i < messageIdList.length; i++) {
    document.getElementById(messageIdList[i]).style.display = "none";}
    document.getElementById(sel.options[sel.selectedIndex].value).style.display = "block";}
//-->
</script>


производит запись в базу:
Код

<select name='product' id='4' style="display:none">
<option value='Подраздел 41' > Подраздел 41</option>
 Всегда только его

Это сообщение отредактировал(а) Paladin111 - 1.7.2010, 12:28
PM MAIL   Вверх
MoLeX
Дата 1.7.2010, 11:29 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Код

  function show(sel)
  function show(sel){


это так и должно быть?


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
bars80080
Дата 1.7.2010, 11:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



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

<input type="hidden" name="selnum" id="sn" />

Код

function show(sel){
    for (i = 0; i < messageIdList.length; i++) {
        document.getElementById(messageIdList[i]).style.display = "none";
    }
    document.getElementById(sel.options[sel.selectedIndex].value).style.display = "block";
    document.getElementById('sn').value = sel.name;
}

далее, в файле 3.php читаете $product = $_POST[$_POST['selnum']]


хотя конечно можно всё сделать грамотнее. но на скорую руку и так сойдёт
PM MAIL WWW   Вверх
Paladin111
Дата 1.7.2010, 11:46 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.5.2010

Репутация: нет
Всего: нет



Цитата(bars80080 @ 1.7.2010,  11:30)
в четвёртом селекте только один пункт

А если в четвертый добавляешь еще несколько, то он записывает только самый первый
PM MAIL   Вверх
bars80080
Дата 1.7.2010, 16:29 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



а имена уже разные у селектов?

вообще, советую сейчас проверять прямо в браузере, что происходит. навроде

Код

<select name='product4' id='4' style="display:none" onchange="qw();">
...


Код

function qw() {
    var el = document.getElementsByName('product4');
    var p = el[0].options[el[0].selectedIndex].value;
    alert(p);
}


точно ли выставляется нужное значение в селекте
PM MAIL WWW   Вверх
Paladin111
Дата 2.7.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.5.2010

Репутация: нет
Всего: нет



Цитата(bars80080 @  1.7.2010,  16:29 Найти цитируемый пост)
точно ли выставляется нужное значение в селекте 

Нее, заносится не то значение которое выбираешь, а значение с предыдущего селекта.

PM MAIL   Вверх
bars80080
Дата 2.7.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



какого предыдущего?
PM MAIL WWW   Вверх
Paladin111
Дата 2.7.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.5.2010

Репутация: нет
Всего: нет



Цитата(bars80080 @  2.7.2010,  17:29 Найти цитируемый пост)
какого предыдущего? 

Из первого селекта. 
PM MAIL   Вверх
bars80080
Дата 2.7.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



и как же оно заносится, если при <select name='identific_number', 
$product = $_POST['product'];
каким образом в $product попадает значение из identific_number?
PM MAIL WWW   Вверх
Paladin111
Дата 3.7.2010, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 31.5.2010

Репутация: нет
Всего: нет



Цитата(bars80080 @  1.7.2010,  11:30 Найти цитируемый пост)

<input type="hidden" name="selnum" id="sn" />

Код

function show(sel){
    for (i = 0; i < messageIdList.length; i++) {
        document.getElementById(messageIdList[i]).style.display = "none";
    }
    document.getElementById(sel.options[sel.selectedIndex].value).style.display = "block";
    document.getElementById('sn').value = sel.name;
}
    
далее, в файле 3.php читаете $product = $_POST[$_POST['selnum']]

когда вот так делаю
PM MAIL   Вверх
bars80080
Дата 3.7.2010, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



мда. ну попробуйте тогда написать так:

Код

function show(sel){
    for (i = 0; i < messageIdList.length; i++) {
        document.getElementById(messageIdList[i]).style.display = "none";
    }
    document.getElementById(sel.options[sel.selectedIndex].value).style.display = "block";
    document.getElementById('sn').value = document.getElementById(sel.options[sel.selectedIndex].value).name;
    // или document.getElementById(sel.options[sel.selectedIndex].value).getAttribute('name'); // если предыдущее не покатит
}

ещё желательно заменить числовые идентификаторы ( id="4" ) на строковые ( id="s4" ), и соответственно поменять в первом селекте значения: <option value='s4' >Раздел 4</option>. в некоторых браузерах имеются проблемы с числовыми id
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1396 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.