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

Форум MySQL

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

 

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

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

тема: Ошибка в двойном выпадающем списоке из книги MySQL 5
 
 автор: nill   (25.10.2007 в 12:27)   письмо автору
 
 

Вот пример из книги Кузнецова и Симдянова MySQL 5
когда в таблице catalogs у какого-то каталога нет продуктов
то показыват выпадающий список только каталогов и при выборе любого каталога, даже если у него есть продукты, второй выпадающий список с продуктами не появляеться !!

правил Javascript который внизу кода (из сформированого в броузере html то есть не сам этот код) и если из него убрать ID каталога в котором нет товаров то список продуктов отображаеться но там еще ошибка появляеться иногда
сразу три выпадающих списка сразу отображаеться

Помогите исправить ошибку сам я немогу придумать что делать


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

  
// Начало HTML-формы
  
echo "<form action=handler.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(this.form.id_catalog)'>";
    echo 
"<option value=0>Не имеет значения</option>";
    while(
$catalog mysql_fetch_array($cat))
    {
      if(
$_POST['id_catalog'] == $catalog['id_catalog']) $selected "selected";
      else 
$selected "";
      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$catalog[id_catalog]>";
        while(
$product mysql_fetch_array($prd))
        {
          if(
$_POST['id_product'] == $product['id_product']) $selected "selected";
          else 
$selected "";
          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>

   
 
 автор: sim5   (25.10.2007 в 12:44)   письмо автору
 
   для: nill   (25.10.2007 в 12:27)
 

Править скорее надо не JS, а РНР часть - не выводить в первом списке каталоги у которых нет товаров.

   
 
 автор: nill   (25.10.2007 в 12:49)   письмо автору
 
   для: sim5   (25.10.2007 в 12:44)
 

а как это сделать?

   
 
 автор: sim5   (25.10.2007 в 12:57)   письмо автору
 
   для: nill   (25.10.2007 в 12:49)
 

Ну вот же у вас получение каталогов:


// Формируем первый выпадающий список 
$query = "SELECT * FROM catalogs ORDER BY name"; 

Можете дополнить этот запрос условием WHERE ... здесь указать только каталоги с товарами. По коду дальше products это как раз продукты, но не понятно что это, количество их либо... Если количество, то выбирайте те у кторых products > 0. Смотрите свою таблицу.

   
 
 автор: nill   (25.10.2007 в 13:02)   письмо автору
 
   для: sim5   (25.10.2007 в 12:57)
 

ладно буду думать

   
 
 автор: nill   (25.10.2007 в 16:14)   письмо автору
 
   для: nill   (25.10.2007 в 13:02)
 

вобщем непонятно что делать WHERE здесь непоможет так как по таблице каталогов нельзя узнать есть ли у какого то каталога продукты или нет
это надо к таблице продукты обращаться
то есть запрос к таблице продукты должен быть вверху а потом как то надо сделать условие что если количество товаров для каталога не равно нулю то выполняеться запрос для каталога
а что бы узнать номер каталога и проверить его в таблице продуктов тогда сначала надо запрос писать к каталогам
запутался я совсем

   
 
 автор: sim5   (25.10.2007 в 16:25)   письмо автору
 
   для: nill   (25.10.2007 в 16:14)
 

Не знаю, что у вас за таблицы, но все это можно сделать единым запросом - обратитесь с вопросом, что вам надо узнать в разделе MySQL. Кстати там можете посмотреть, готовых примеров таких запросов там уйма. Я лишь хочу сказать - для точго чтобы эффективно управлять выводом товаров на страницах, а так же для управления ими администратором, не мешало бы дополнить таблицу категорий полем показывающем есть ли у этой категории товар или нет, и если есть то сколько. Это было бы сводной информацией для данной категории, включая ее подкатегории. Пример из книги, это просто пример, вам его нужно просто совершенствовать.

   
 
 автор: nill   (25.10.2007 в 16:58)   письмо автору
 
   для: sim5   (25.10.2007 в 16:25)
 

вообщем разобрался вот готовый скрипт
sim5 спасибо за ответы

единым запросом я незнаю как это сделать нужны два как минимум



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

  
// Начало HTML-формы
  
echo "<form action=handler.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(this.form.id_catalog)'>";
    echo 
"<option value=0>Не имеет значения</option>";
    while(
$catalog mysql_fetch_array($cat))
    {
$query="SELECT * FROM products where id_catalog='$catalog[id_catalog]'";
$prod mysql_query($query);
    if(
mysql_num_rows($prod) > 0)
  {

      if(
$_POST['id_catalog'] == $catalog['id_catalog']) $selected "selected";
      else 
$selected "";
      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$catalog[id_catalog]>";
        while(
$product mysql_fetch_array($prd))
        {
          if(
$_POST['id_product'] == $product['id_product']) $selected "selected";
          else 
$selected "";
          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>

   
 
 автор: sim5   (25.10.2007 в 17:07)   письмо автору
 
   для: nill   (25.10.2007 в 16:58)
 

>единым запросом я незнаю как

JOIN

Ну работает и слава...

   
Rambler's Top100
вверх

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