webew
Войти » Регистрация
 
PHP
MySQL/MariaDB
JavaScript :: AJAX

нужна помошь...

10 августа 2010, 11:41
Автор: serj011
есть вот такая проблемма. может кто сможет помочь.

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

все три переменные передаются методом get (country=4&region=19&city=166)

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

со страной я решил эту проблемму (if($country == $row['country_id']) $temp = ' selected'; else $temp = null;), а с городом и регионом так не получаеться, скорее всего что селекты изначально не доступены пока не выбирешь страну...

я напишу весь код для страны и ргиона, если у кого есть такой опыт, подскажите как сделать... и можно ли вообще.

<?php

<!-- Select для страны -->
<select name="country" onChange="onChange(this,'1');document.getElementById('region').disabled=''; document.getElementById('city').innerHTML='';" class="input_city">
<option value='0'>- Выберите страну -</option>
<?php
function sel_country($a)
{
$b = isset($_POST['country'])?$_POST['country']:NULL;
if($a == $b) {
return 'selected="selected"';
}}
switch ($_SESSION['lang']) {
case '1' :
$query_country = "SELECT country_id,country_rus as name FROM country";
break ;
}
$res = mysql_query($query_country, $site) or die(mysql_error());
// выводим все строки из столбца name таблицы country

while($row = mysql_fetch_array($res)) {
if($country == $row['country_id']) $temp = ' selected'; else $temp = null;

echo "<option ".sel_country($row['country_id'])." value='".$row['country_id']."'".$temp.">" . $row['name'] . "</option>";

}
mysql_free_result($res);
?>
</select>

<!-- Select для региона -->
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <select name="region" id="region" <?$_POST['country']?'':'disabled="disabled"')?> onChange="onChange(this,'2');document.getElementById('city').disabled='';" class="input_city" />
<option value='0'>- Выберите регион -</option>
<?php
function sel_region($a)
{
$b = isset($_POST['region'])?$_POST['region']:NULL;
if($a == $b) {
$_SESSION['recoun']='poi' ;
return 'selected="selected"';
}
}
if(isset($_POST['country']))
{
switch ($_SESSION['lang']) {
case '1' :
$query = "SELECT region_id,region_rus as name FROM `region` WHERE `country_id`='".(int)$_POST['country']."'";
break ;
}
$res = mysql_query($query);

while($row = mysql_fetch_array($res))
{
if($region == $row['region_id']) $temp_r = ' selected'; else $temp_r = null;
echo "<option ".sel_region($row['region_id'])." value='" . $row['region_id'] . "'".$temp_r.">" . $row['name'] . "</option>";
}
mysql_free_result($res);
}
?>
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

serj011

неужели никто не знает?
11.08.2010, 11:51
Ответить

1234ru

Один из самых простых путей таков: на селект со страной повесить событие onchange, которое обращается по AJAX к серверу и забирает HTML-код для селекта регионов данной (выбранной) страны и вставляет его в соответствующее место страницы.

Аналогичное сделать для регионов - чтобы забирались города.
То, что не убивает нас, делает нас инвалидами.
11.08.2010, 20:53
Ответить
NO USERPIC

serj011

1234ru, насколько я понимаю, то событие onchange уже весит на стране. может подробнее кто поскажит, как имеено сделать...
12.08.2010, 11:26
Ответить

1234ru

<select id="countries">
    <!-- тут перечень стран -->
</select>

<select id="regions"></select>

<select id="cities"></select>

<!-- подключаем библиотеку jQuery -->
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>

<script type="text/javascript">
    // прикрпеляем к списку стран событие при изменении
    $('#countries').change(function() {
        // получим id выбранной в данный момент страны
        var country_id = $(this).val();
       
        // теперь будем по AJAX обращаться к скрипту,
        // который нам отдаст HTML-код списка регионов
        // для выбранной страны
       
        // пусть скрипт имеет адрес getregions.php
        // и принимает id страны
        $.get(
            '/getregions.php?country_id=' + country_id', // адрес AJAX-запроса
            function(data) { // функция, которая обрабатывает ответ
                // data - это строка, приходящая с сервера в ответ
                // в ней должен содержаться HTML-код списка
                // берем его и вставляем в нужное место
                $('#regions').html(data);
            }
        );
       
        // важно также, что, т.к. при изменении выбора страны
        // выбранный регион сбрасывается,
        // список городов нужно аннулировать
        // иначе останутся висеть города,
        // не относящиеся к данной стране
        $('#cities').html(''); // "сбросили" города
    }
</script>


На сервере в getregions.php отдаете HTML-код списка регионов для
соответсвующей страны в виде

<option value="..">...</option>
<option value="..">...</option>
...

<?php

if (isset($_GET['country_id'])) $country_id = intval($_GET['country_id']);
else exit;
   
    # устанавливаем соединение с MySQL

    // понятно, что у Вас названия могут отличаться
    $sql = "
        SELECT
            region_id AS value,
            region_name AS title
        FROM regions
        WHERE country_id = $country_id
        "
;
    $result = mysql_query($sql) OR die(mysql_error());
    $html = '';
    while ($row = mysql_fetch_assoc($result)) {
        $html .= "<option value=\"$row[value]\">$row[title]</option>\n";
    }
    echo $html;
    exit;

?>


Аналогично для городов - уже берете значение из списка регионов и
используете его для построения списка городов.
Аннулировать список городов (как это делалось при выборе стран) в этом случае не нужно, т.к. он у Вас сам автоматичеки перестроится.

P.S. При оформлении кода стоит пользоваться подсветкой синтаксиса (см. Syntax - самую крайнюю кнопку над формой ответа)
То, что не убивает нас, делает нас инвалидами.
12.08.2010, 19:19
Ответить
NO USERPIC

serj011

1234ru, спасибо за развернутый ответ, но мне к сожалению это мало чем поможет... у меня знаний мало, а тут и ajax и java и php :) все намешано... сам не сделаю наверное... я понимаю что просить доработать мой код бесплатно не корректно, у меня вопрос - не могли бы вы за небольшое вознагрождение wm доработать его? и сколько?
12.08.2010, 22:14
Ответить

1234ru

Если Вы сами написали то, что приводится в головном сообщении - думаю, справитесь и с этим.
Если не справитесь - поищите кого-нибудь в местах типа freelance.ru
То, что не убивает нас, делает нас инвалидами.
14.08.2010, 21:43
Ответить
NO USERPIC

haushka

Не подскажите где косяк второй список не хочет открываться
index.php
<script type="text/javascript" src="jquery-1.4.2.js"></script>

<select id="countries">
    <?php
require_once("../config.php");
$sql=mysql_query("SELECT id_kafedra,name FROM kafedra");
?>
<option value="0" selected>Выберите...</option>
<?php
while ($ctg = mysql_fetch_array($sql))
    {
        echo '<option value="'.$ctg['id_kafedra'].'">'.$ctg['name'].'</option>'."\n";
    }
?>
</select>

<select id="regions"></select>

<select id="cities"></select>

<script type="text/javascript">
    // прикрпеляем к списку стран событие при изменении
    $('#countries').change(function() {
        // получим id выбранной в данный момент страны
        var country_id = $(this).val();
       
        // теперь будем по AJAX обращаться к скрипту,
        // который нам отдаст HTML-код списка регионов
        // для выбранной страны
       
        // пусть скрипт имеет адрес getregions.php
        // и принимает id страны
        $.get(
            '/getregions.php?country_id=' + country_id', // адрес AJAX-запроса
            function(data) { // функция, которая обрабатывает ответ
                // data - это строка, приходящая с сервера в ответ
                // в ней должен содержаться HTML-код списка
                // берем его и вставляем в нужное место
                $('
#regions').html(data);
            }
        );
       
        // важно также, что, т.к. при изменении выбора страны
        // выбранный регион сбрасывается,
        // список городов нужно аннулировать
        // иначе останутся висеть города,
        // не относящиеся к данной стране
        $('#cities').html(''); // "сбросили" города
    }
</script>


getregions.php
<?php

if (isset($_GET['country_id'])) $country_id = intval($_GET['country_id']);
else exit;
   
    # устанавливаем соединение с MySQL
require_once("../config.php");
    // понятно, что у Вас названия могут отличаться
    $sql = "SELECT id_distip,name
        FROM distip
            WHERE id_kafedra ="
.$country_id.";

    $result = mysql_query($sql) OR die(mysql_error());
    $html = '';
    while ($row = mysql_fetch_assoc($result)) {
        $html .= "
<option value=\"$row[id_distip]\">$row[name]</option>\n";
    }
    echo $html;
    exit;

?>


И как с третьим списком быть не догоняю?
CREATE TABLE IF NOT EXISTS `kafedra` (
`id_kafedra` int( 10 ) unsigned NOT NULL AUTO_INCREMENT ,
`name` text NOT NULL ,
`fullname` tinytext NOT NULL ,
`hide` enum( 'show', 'hide' ) NOT NULL DEFAULT 'show',
PRIMARY KEY ( `id_kafedra` ) ) ENGINE = INNODB DEFAULT CHARSET = cp1251 AUTO_INCREMENT =0;

CREATE TABLE IF NOT EXISTS `distip` (
  `id_distip` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `fullname` tinytext NOT NULL,
  `hide` enum('show','hide') NOT NULL DEFAULT 'show',
  `id_kafedra` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_distip`),
  KEY `id_kafedra` (`id_kafedra`)
) ENGINE=INNODB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=0 ;

CREATE TABLE IF NOT EXISTS `tema` (
  `id_tema` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `fullname` tinytext NOT NULL,
  `pos` text NOT NULL,
  `hide` enum('show','hide') NOT NULL DEFAULT 'show',
  `id_distip` int(10) unsigned NOT NULL DEFAULT '0',
  `id_kafedra` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_tema`),
  KEY `id_distip` (`id_distip`),
  KEY `id_kafedra` (`id_kafedra`)
) ENGINE=INNODB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=0
21.09.2010, 03:17
Ответить
NO USERPIC

haushka

Есть тут кто живой?
21.09.2010, 15:32
Ответить

1234ru

1. Если у Вас всё так и есть, как написано - прежде всего присутствует ошибка в яваскрипте:
'/getregions.php?country_id=' + country_id',

после country_id кавычка лишняя

Если не помогает - откройте в браузере страницу ровно с тем адресом, по которому Вы обращаетесь за HTML-кодом списка (включая id той или иной кафедры; например /getregions.php?country_id=1; хотя переименовали бы файл - у вас же не регионы, а дисциплины) и посмотрите, нормально ли он выглядит, нет ли ошибок в HTML.

2. В таблице tema не нужен id кафедры, т.к. он однозначно следует из id дисциплины.

3. С третьим списком - быть точно также, как со вторым - сделать файл, который его отдает по нужному id (только уже не кафедры, а дисциплины, которая выбрана).
То, что не убивает нас, делает нас инвалидами.
23.09.2010, 18:39
Ответить
NO USERPIC

haushka

1. кавычку убрал
2. /getregions.php?country_id=1 ошибок нет запросы формируются
3. просто не реагирует! первый список тока работает

<script type="text/javascript" src="jquery.js"></script>

<select id='countries'>
    <?php
require_once("../config.php");
$sql=mysql_query("SELECT id_kafedra,name FROM kafedra");
?>
<option value="0" selected>Выберите...</option>
<?php
while ($ctg = mysql_fetch_array($sql))
    {
        echo '<option value="'.$ctg['id_kafedra'].'">'.$ctg['name'].'</option>'."\n";
    }
?>
</select>

<select id="regions"></select>

<select id="cities"></select>

<script type="text/javascript">
 
    $('#countries').change(function()
    {
        var country_id = $(this).val();
        $.get('/getregions.php?country_id=' + country_id, function(data) { $('#regions').html(data); });
        $('#cities').html('');
    }
);
</script>


отладчиком посмотрел проходит яву только при закрузки страницы а при изменении списка вообще не геагирует стоп кран что это может быть?
24.09.2010, 02:43
Ответить
NO USERPIC

haushka

ну какие мысли есть?
25.09.2010, 00:51
Ответить

1234ru

Странно, что в отладичке ничего.
Скорее всего, Вы просто не смотрите в то место, где у него ошибки показываются. Хотя Вам виднее.

В общем, если отладчик не помогает, двигается стоит так:

0. Убрать из $('#countries').change(function()... вообще всё.

1. Сделать
$('#countries').change(function()
{
    var country_id = $(this).val();
    alert(county_id);
}


Если алерта нет вообще - значит, неправильно прикреплено событие (ошибка в написании id тега; кстати - попробуйте id="countries" писать через двойные кавычки, а не через одинарные; вряд ли в этом причина, но попробовать стоит)

Если в алерте пустота или undefined - у Вас неправильно заполняется список #countries (элементы не имеют соответствующих значений).

2. alert убрать, добавить
$.get('/getregions.php?country_id=' + country_id);
    alert(1);


Если возникает alert, значит, запрос отправляется без ошибок на клиенте.

3. alert убрать. Добавить функцию при запросе:
$.get(
    '/getregions.php?country_id=' + country_id,
    function(data) { alert(1); }
    );


Если не появляется alert - значит, какая-то ошибка в синтаксисе.

4. alert(1) заменить на alert(data). Так можно убедиться, что с сервера приходит то, что надо.
Если дошли до этой стадии - значит, проблемы с отдаваемой с сервера строкой. Посмотрите, нормальный ли там HTML.
То, что не убивает нас, делает нас инвалидами.
26.09.2010, 00:03
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: