Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2008, 19:35   #1
Geddar
Пользователь
 
Регистрация: 06.05.2008
Сообщений: 88
По умолчанию Генерация выпадающих списков

Сразу хочу сказать, если создал тему не в том разделе не серчайте, так и не решил к какому она относиться Хочу написать страницу ввода адреса, что бы она выглядела следующим образом, выпадающие списки со странами, областями, городами, улицами и т.д., сначала выбирается страна, после этого в списке с областями появляются области только из этой страны, дальше после выбора области, аналогично сортируются города и т.д. Страны, области и прочее хранятся в базе данных. В свое время такое у меня было на писано на делфи, а вот при переносе на веб форму столкнулся с проблемой. Заранее спс!
Geddar вне форума Ответить с цитированием
Старый 22.09.2008, 08:21   #2
mager
Пользователь
 
Регистрация: 12.11.2006
Сообщений: 57
По умолчанию

Желательно определить Ваши знания. Вы знаете AJAX, JS, PHP и HTML? Если нет, то я и обьяснить не смогу
Незнание человека не повод, чтобы над ним издеваться или смеяться, все мы чего-то не знали или не знаем...
mager вне форума Ответить с цитированием
Старый 22.09.2008, 09:56   #3
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,714
По умолчанию

На delphi это сделать проще. В веб интерфейсе нельзя без обновления страницы обратиться к серверу потому что http протокол это не предусматривает по крайней мере в удобной и простой форме. У Вас есть 2 выхода:
1. Подружать всю информацию по регионам вместе со страницей и писать всплывающий список на javascript. Но это крайне нежелательно по очевидным причинам.
2. Использовать технологию AJAX, что тоже непросто.

В любом случае надо хорошо знать javascript...
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 22.09.2008, 18:39   #4
Geddar
Пользователь
 
Регистрация: 06.05.2008
Сообщений: 88
По умолчанию

php и html знаю нормально, с js и AJAX разбираюсь с момента создания этого поста, аякс даеться с трудом, понял что к нему много готовых библиотек, но не могу до конца разобраться, остановился на JShttpRequest у нее хоть и очень маленький набор функций, но вроде бы для моей задачи хватает. Вот что я накидал сам:
Код:
echo "<table CELLSPACING='10'>";
echo "<tr><td>Страна</td><td>  <SELECT NAME='strana' id='mystr'>";
		while ($dataStr=mysql_fetch_array($result,MYSQL_NUM))
			foreach ($dataStr as $k){
				echo "<OPTION VALUE='$k' selected> $k";
			}
echo	"</SELECT> </td>";
echo '<input type="button" value="Вычислить MD5" onclick="sort()">';
//echo '<div id="ans"> </div>';
mysql_free_result($result);
$query="select re_name from region where re_cod_strana='".echo '<div id="ans"> </div>'."'";	
$result=mysql_query($query,$link) or die (mysql_errno($link).mysql_error($link));
echo "<tr><td>Регион</td><td>  <SELECT NAME='region'>";
		while ($dataReg=mysql_fetch_array($result,MYSQL_NUM))
			foreach ($dataReg as $k){
				echo "<OPTION VALUE='$k' selected> $k";
			}
echo	"</SELECT> </td>";
тут как видите два селекта, причем содержимое первого генерировать не надо, а вот второго уже надо в зависимости от выбраной страны. Сейчас встал на том что не могу определить сколько данных послать на обратоку аяксом и насколько большой кусок селекта придеться им сгенерить.
З.Ы.: предполагаю что кусок кода бредовый, но углубленно разбераться с аяксом времени не хватает, в универе сказали что нужно написать курсач на пхп, дали два месяца времени и при этом никто этот язык не обьясняет
Geddar вне форума Ответить с цитированием
Старый 23.09.2008, 11:21   #5
mager
Пользователь
 
Регистрация: 12.11.2006
Сообщений: 57
Лампочка

Прости но мне Ваш код вообще не понравился, вообщем поясняю делаешь так:
есть у Вас 1 селект, может готовый, может генерируется в базе, лучше не делай цикл, потом перебор, ну хотя я весь код не вижу, может это и надо делать. Если у Вас шаблонно - модульная структура, и то что-то меня смущает. Когда пользователь на первом селекте выберет поле (onChange в js) Вы на сервер-скрипт посылаете через xmlhttprequest значение этого поля, после скрипт получив значение выберает из базы все значение, родитель которого равен этому значение и выводит (echo в php) эти значение в 1 строку, допустим разделённую этими знаками @A;. Дальше это вернёться скрипту сделанному запрос, Вы при помощи (split в js) делете значение, перебераете и выводите туда куда Вам нужно. Ещё раз повторяю, чтобы всё это сделать нужно знать HTML, CSS, JS, Ajax, MySQL. Но если не знаете Ajax, то можно и без него, но страницы перегружать прийдёться. Если у Вас сайт на ЧПУ и не хорошо продуманная структура или сайт в перемешку с php и html возникнут проблемы с перезагрузками . Так, что аккуратнее! Удачи в реализации задуманного.
Незнание человека не повод, чтобы над ним издеваться или смеяться, все мы чего-то не знали или не знаем...

Последний раз редактировалось mager; 23.09.2008 в 11:25.
mager вне форума Ответить с цитированием
Старый 23.09.2008, 14:35   #6
Geddar
Пользователь
 
Регистрация: 06.05.2008
Сообщений: 88
По умолчанию

Идея ясна, спасибо, попробую реализовать.

Цитата:
лучше не делай цикл, потом перебор
почему этот вариант лучше не использовать и как заменить? вот код страницы почти целиком
Код:
<?php
$host="localhost";	// хост базы
$user="root"	;	// пользователь базы
$pass="";			// пароль базы
$db_name="scott";	//база
$link=mysql_connect($host,$user,$pass) or die(mysql_errno($link).mysql_error($link));
$query="select st_name from strana";
$result=mysql_query($query,$link) or die (mysql_errno($link).mysql_error($link));
echo "<table CELLSPACING='10'>";
echo "<tr><td>Страна</td><td>  <SELECT NAME='strana' id='mystr'>";
		while ($dataStr=mysql_fetch_array($result,MYSQL_NUM))
			foreach ($dataStr as $k){
				echo "<OPTION VALUE='$k' selected> $k";
			}
echo	"</SELECT> </td>";
echo '<input type="button" value="Вычислить MD5" onclick="sort()">';
//echo '<div id="ans"> </div>';
mysql_free_result($result);
$query="select re_name from region where re_cod_strana='".echo '<div id="ans"> </div>'."'";
$result=mysql_query($query,$link) or die (mysql_errno($link).mysql_error($link));
echo "<tr><td>Регион</td><td>  <SELECT NAME='region'>";
		while ($dataReg=mysql_fetch_array($result,MYSQL_NUM))
			foreach ($dataReg as $k){
				echo "<OPTION VALUE='$k' selected> $k";
			}
echo	"</SELECT> </td>";
echo "</table>";
?>
Geddar вне форума Ответить с цитированием
Старый 24.09.2008, 09:58   #7
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,714
По умолчанию

Плохо в вашем коде то, чтовы не разделяете код и разметку. При большом количестве кода это приведет к его полной нечитаемости. Моя группа программистов использует такую шаблонную систему.
PHP код:
//обьявляем все шаблонные переменные
$shablon='<div>Login:<select name=\'editlogpas\'><option value=\'0\'>Select_account_____[select_a_list]</select></div>';
$shablon2='bla bla';
$shablon3='bla bla';
//---
//исполняемый код
for($i=0;$i<count($logpas_list)-1;$i++){
  
$select_a_list=$select_a_list.'<option value=\''.$logpas_list[$i].'\'>'.$logpas_list[$i];      
}
//---
//генерация кода страницы
$page=str_replace('[select_a_list]',$select_a_list,$page);
//---
//вывод страницы
echo $page;
//--- 
-конструкциями в квадратных кавычках [] обозначаем динамические элементы
-str_replace() вставляем сгенерированный список
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 24.09.2008, 14:32   #8
mager
Пользователь
 
Регистрация: 12.11.2006
Сообщений: 57
По умолчанию

Цитата:
Сообщение от Geddar Посмотреть сообщение
while ($dataStr=mysql_fetch_array($result ,MYSQL_NUM))
foreach ($dataStr as $k){
echo "<OPTION VALUE='$k' selected> $k";
}
while ($dataReg=mysql_fetch_array($result ,MYSQL_NUM))
foreach ($dataReg as $k){
echo "<OPTION VALUE='$k' selected> $k";
}
Зачем Вы 2 раза одно и тоже делаете, разве результат изменится если оставить просто:
while ($dataReg=mysql_fetch_array($result ,MYSQL_NUM))
{
echo "<OPTION VALUE='".$dataReg[название столбца в котором лежит значение]."'>".$dataReg[название столбца в котором лежит значение]."</option>";
}
ВЫ делаете много не нужной переборки, ладно если скрипт маленький, а если это соц сеть с онлайн в 10000 человек? У хорошего программиста код краткий и понятный. И на сколько я помню у option есть закрывающий тег, у Вас я этого не увидел. Но это в принципе не обязательно.
Незнание человека не повод, чтобы над ним издеваться или смеяться, все мы чего-то не знали или не знаем...
mager вне форума Ответить с цитированием
Старый 24.09.2008, 17:27   #9
Geddar
Пользователь
 
Регистрация: 06.05.2008
Сообщений: 88
По умолчанию

Я учел замечание в оформление кода, полностью оптимизировать не удалось, но думаю со временем будет получаться Как написать динамический селект я вроде понял, но до этого не дошел, споткнулся на стади тестировния связи js(сервер) <-> php(сервер) она просто не пашет, почему понять не могу. Вот коды:

Главная страница(собственно индекс)
Код:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Налогоплательщик 2008</title>
<link rel="shortcut icon" href="images/favicon0.ico" type="image/x-icon" />
</head>

<body onload='process()'>
<?php
if (!$menu=$_GET["page"])
	$menu="main";
	
require_once("config.php")
?>
<table width="1241" border="1" CELLPADDING="5" >
  <tr>
    <td height="1" colspan="3" BGCOLOR="#F4F7FC" VALIGN=CENTER><?php require_once("head.php")?></td>
  </tr>
  <tr>
    <td width="170" height="913" BGCOLOR="#F4F7FC" VALIGN=top><?php require_once("left.php")?></td>
    <td width="1115" colspan="2" VALIGN=top><?php require_once("modules/$menu.php")?></td>
  </tr>
</table>
</body>
</html>
модуль конфига (config.php)
Код:
<?php
$host="localhost";	// хост базы
$user="root"	;	// пользователь базы
$pass="";			// пароль базы
$db_name="scott";	//база
$link=mysql_connect($host,$user,$pass) or die(mysql_errno($link).mysql_error($link));
$db=mysql_select_db($db_name,$link) or die(mysql_errno($link).mysql_error($link));
$result=mysql_list_tables($db_name,$link) or die(mysql_errno($link).mysql_error($link));
$tmp="table"; //префикс названия таблиц
$debug=!true; //если true включает показ служебной инф-ии
	while ($row = mysql_fetch_row($result)) {
		${$tmp.$row[0]}=$row[0];
		if ($debug)
			echo "$tmp$row[0] => ${$tmp.$row[0]} <br>";
	}
mysql_free_result($result);
?>
Модуль который грузиться при клике ссылке предприятие(его код работает как часы)
Код:
<?php
// Получение данных
$result=mysql_query("Select * from $tablepredpriyatie",$link) or die (mysql_errno($link).mysql_error($link));
$data=mysql_fetch_array($result);
mysql_free_result($result);
// Передача
if (!$inn=$_POST['inn'])
		$inn=$data[0];
if (!$name=$_POST['name'])
		$name=$data[1];
if (!$kpp=$_POST['kpp'])
		$kpp=$data[2];
if (!$ogrn=$_POST['ogrn'])
		$ogrn=$data[3];
if (!$pfr=$_POST['pfr'])
		$pfr=$data[4];
if (!$okved=$_POST['okved'])
		$okved=$data[5];
if (!$okpo=$_POST['okpo'])
		$okpo=$data[6];
if (!$okato=$_POST['okato'])
		$okato=$data[7];

$query="update $tablepredpriyatie set pr_inn=$inn, pr_name='$name', pr_kpp='$kpp', pr_ogrn='$ogrn', pr_num_pfr='$pfr', pr_okved='$okved', pr_okpo='$okpo', pr_okato='$okato'";
mysql_query($query,$link) or die (mysql_errno($linl).mysql_error($link));
?>
<form action="index.php?page=predpriyatie" method=post>
<table CELLSPACING="10">
<tr><td>Предприятие:</td><td><INPUT TYPE="text" size="60" NAME="name" value='<?php echo $data[1] ?>'></td>
<tr><td>ИНН:</td><td> <INPUT TYPE="text" size="30" NAME="inn" value='<?php echo $data[0] ?>'></td>
<tr><td>КПП:</td><td> <INPUT TYPE="text" size="30" NAME="kpp" value='<?php echo $data[2] ?>'></td>
<tr><td>ОГРН:</td><td> <INPUT TYPE="text" size="30" NAME="ogrn" value='<?php echo $data[3] ?>'></td>
<tr><td>№ регистрации в ПФР:</td><td> <INPUT TYPE="text" size="30" NAME="pfr" value='<?php echo $data[4] ?>'></td>
<tr><td>ОКВЕД:</td><td> <INPUT TYPE="text" size="30" NAME="okved" value='<?php echo $data[5] ?>'></td>
<tr><td>ОКПО:</td><td> <INPUT TYPE="text" size="30" NAME="okpo" value='<?php echo $data[6] ?>'></td>
<tr><td>ОКАТО:</td><td> <INPUT TYPE="text" size="30" NAME="okato" value='<?php echo $data[7] ?>'></td>
</table>
<INPUT TYPE="Submit" size="15" NAME="go" value='ОК'>
</form>
<?php require_once("adres.php") ?>
А вот собстенно код модуля adres.php который грузиться в конце модуля с адресом, это на ним я бьюсь уже неделю, именно к нему я применяю все ваши советы и именно он не хочет работать
Код:
<?php
// БЛОК ПЕРЕМЕННЫХ
$Q_Open="select ad_num_dom, ad_num_kvartira, ul_name, go_name, in_znach, re_name, st_name from adres, ulica, gorod, indexi, region, strana	where (ad_num='1') and (ul_cod=ad_cod_ulica) and (go_cod=ul_cod_gorod) and (in_cod=go_cod) and (re_cod=go_cod_region) and (st_cod=re_cod_strana)";
$Q_Strani="select st_name from strana";
//--
//БЛОК КОДА
$result=mysql_query($Q_Strani,$link) or die (mysql_errno($link).mysql_error($link));
$S_Strana = "Страна <SELECT NAME='strana' id='ChenStr' onBlur='process()'>";
while ( $data = mysql_fetch_array($result,MYSQL_NUM))
	foreach ($data as $tmp)
	{
		$S_Strana = $S_Strana."<OPTION VALUE='".$tmp."'>".$tmp."</option>";
	}
	$S_Strana = $S_Strana."</SELECT><br>";
//--
//ГЕНЕРАЦИЯ СТРАНИЦЫ
$Script="<script type='text/javascript' src='quickstart.js'></script>";
$Out="<div id='divMessage'>Результат работы отобразится в этом блоке.</div>";

//--
//ВЫВОД НА ЭКРАН
echo $Script;
echo $S_Strana;
echo $Out;
?>
Geddar вне форума Ответить с цитированием
Старый 24.09.2008, 17:42   #10
Geddar
Пользователь
 
Регистрация: 06.05.2008
Сообщений: 88
По умолчанию

Код фаила quickstart.js
Код:
// stores the reference to the XMLHttpRequest object
var xmlHttp = createXmlHttpRequestObject(); 

// retrieves the XMLHttpRequest object
function createXmlHttpRequestObject() 
{	
  // will store the reference to the XMLHttpRequest object
  var xmlHttp;
  // if running Internet Explorer
  if(window.ActiveXObject)
  {
    try
    {
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e) 
    {
      xmlHttp = false;
    }
  }
  // if running Mozilla or other browsers
  else
  {
    try 
    {
      xmlHttp = new XMLHttpRequest();
    }
    catch (e) 
    {
      xmlHttp = false;
    }
  }
  // return the created object or display an error message
  if (!xmlHttp)
 
    alert("Error creating the XMLHttpRequest object.");
  else 
    return xmlHttp;
}
//--------------------------------------------------------------------------------------------------==ФУНКЦИЯ ПРИЕМА==------------------------------------------------------------------------
function process()
{
  if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
  {
    name = encodeURIComponent(document.getElementById("ChenStr").value);
    xmlHttp.open("GET", "quickstart.php?name=" + name, true);  
    xmlHttp.onreadystatechange = handleServerResponse;
    xmlHttp.send(null);
  }
  else
    setTimeout('process()', 1000);
}
//--------------------------------------------------------------------------------------------------==ФУНКЦИЯ ПРИЕМА ОТ КЛИЕНТА==---------------------------------------------------------


//--------------------------------------------------------------------------------------------------==ФУНЦИЯ ПРИЕМА ОТ СЕРВЕРА==-----------------------------------------------------------
function handleServerResponse() 
{
  // move forward only if the transaction has completed
  if (xmlHttp.readyState == 4) 
  {
    // status of 200 indicates the transaction completed successfully
    if (xmlHttp.status == 200) 
    {
      // extract the XML retrieved from the server
      xmlResponse = xmlHttp.responseXML;
      // obtain the document element (the root element) of the XML structure
      xmlDocumentElement = xmlResponse.documentElement;
      // get the text message, which is in the first child of
      // the the document element
      helloMessage = xmlDocumentElement.firstChild.data;
      // update the client display using the data received from the server
      document.getElementById("divMessage").innerHTML = 
                                            '<i>' + helloMessage + '</i>';
      // restart sequence
      setTimeout('process()', 1000);
    } 
    // a HTTP status different than 200 signals an error
    else 
    {
      alert("There was a problem accessing the server: " + xmlHttp.statusText);
    }
  }
}
//--------------------------------------------------------------------------------------------------==ФУНЦИЯ ПРИЕМА ОТ СЕРВЕРА==-----------------------------------------------------------
Вот код модуля quickstart.php
[CODE]
<?php
// we'll generate XML output
header('Content-Type: text/xml');
// generate XML header
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
// create the <response> element
echo '<response>';

// retrieve the user name
$name = $_GET['name'];
echo htmlentities($name) . ', I don\'t know you!';
echo '</response>';
?>
Geddar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание выпадающих списков в Word Dux Microsoft Office Word 12 25.08.2008 09:50
Сравнение двух списков lelik759 Microsoft Office Excel 7 13.04.2008 22:19
Объединение списков. life_burns Microsoft Office Excel 5 05.04.2008 16:13
Взаимодействие списков. Похоже на сводную, но не она. Matthias Microsoft Office Excel 4 22.02.2008 15:17