Не загружается селект через ajax
всем привет, нашел в сети пример и хочу его исправить под свои нужнды...
html... <form method="post" action="post.php" id="filterform"> <select name="filter_id" id="filter_id"> <option value="0">- seleziona filtro -</option> <?=$query->selectFiltri()?> </select> </div> <div> <select name="tipologia" id="tipologia" disabled="disabled"> <option value="0">- seleziona tipoligia -</option> </select> </div> </form> ajax... $(document).ready(function () { $('#filter_id').change(function () { var filter_id = $(this).val(); if (filter_id == '0') { $('#tipologia').html('<option>- выберите город -</option>'); $('#tipologia').attr('disabled', true); return(false); } $('#tipologia').attr('disabled', true); $('#tipologia').html('<option>загрузка...</option>'); var url = 'filter.php'; $.get( url, "filter_id=" + filter_id, function (result) { if (result.type == 'error') { alert('error'); return(false); } else { var options = ''; $(result.tipologi).each(function() { options += '<option value="' + $(this).attr('id') + '">' + $(this).attr('nome_corto') + '</option>'; }); $('#tipologia').html(options); $('#tipologia').attr('disabled', false); } }, "json" ); }); }); php... $sql = mysql_connect("localhost", "000", "000"); if (!$sql) { return "MySQL сервер недоступен! ".mysql_error(); } else { $select = mysql_select_db("000", $sql); if (!$select) { return "Нет соединения с БД".mysql_error(); } else { return true; } } $filter_id = @intval($_GET['filter_id']); $regs=mysql_query("SELECT id, nome_corto FROM criteri WHERE id_filter=$filter_id AND meta=Tipologia"); if ($regs) { $num = mysql_num_rows($regs); $i = 0; while ($i < $num) { $regions[$i] = mysql_fetch_assoc($regs); $i++; } $result = array('tipologi'=>$regions); } else { $result = array('type'=>'error'); } print json_encode($result); после выбора в первом селекте вся работа застывает во втором селекте на слове загрузка! и все не могу понять почему!!!! помогите |
Цитата:
|
Цитата:
как сделать проверку в get? |
Цитата:
И еще посмотри на вкладке Сеть ответ от сервера. |
Цитата:
а на вкладке Response пишет This request has no response data available. з.ы. сам ты индеец ))) |
Цитата:
|
Цитата:
и вопрос номер два, как недосягаем если этот пример с инета, и в демке все работает, я открывал демку через консоль и там в скрипте не было return true; |
Ты совсем ослеп? Я тебя процитировал. Это из твоего кода php.
|
Цитата:
|
Потому что result равен null, потому что сервер ответил пустотой, потому что в коде стоит return раньше времени, потому что кодер дибил. Не беси блин, тебе сказали в чем дело, а ты быкуешь. Могу конечно ошибаться, но у тя че, рука отвалится если попробуешь убрать return?
|
Цитата:
|
Я вижу только один return true. А ты сколько видишь?
Вообще, там не должно быть ни одного return'а. При любой проблеме должен выводиться json_encode с сообщением об ошибке. Цитата:
|
Цитата:
ну и скрипт тоже заработал, но как теперь избежать этого вывода {"type":"error"}??? млять, не срачка так пердячка! |
и тут же второй вопрос, как можно реализовать такую штуку ...
вот есть основной селект в нем выбраешь пункт, и например 3 нижних селекта одновременно заполняются из базы без перезагрузки??? у меня такое видение реализации: есть основной селект в котором мы делаем выбор и ажаксом посылаем запрос на сервер. на сервере делать выбор для нижних трех селектов и заключать их в переменные, например, $select1 = "<select name='1'> <option value='1'>1</option> <option value='11'>11</option> <option value='12'>12</option> </select>"; $select2 = "<select name='2'> <option value='2'>2</option> <option value='21'>21</option> <option value='22'>22</option> </select>"; $select3 = "<select name='3'> <option value='3'>3</option> <option value='31'>31</option> <option value='32'>32</option> </select>"; потом в яву передать их массивом и там уже распределить по странице |
Да, можно так. Только необязательно передавать html. Можно чисто массивы данных, а селекты создавать на js.
Цитата:
|
Цитата:
|
я тут вот что еще сделал))) только ты сильно не психуй! ))))
<div id="dataf"> <div> <select name="filter_id" onchange="javascript:selectRegion();"> <option value="0">- seleziona filtro -</option> <?=$query->selectFiltri()?> </select> </div> <p> Larghezza: <input type="text" name="altezza" value="" style="width: 40px;" /> x Altezza: <input type="text" name="larghezza" value="" style="width: 40px;" /> </p> <div name="selectTipologia"></div> <div name="selectProfilo"></div> <div name="selectManiglia"></div> <div name="selectColore"></div> <div name="selectVetro"></div> <div name="selectVetroDecorativo"></div> </div> function selectRegion(){ var filter_id = $('select[name="filter_id"]').val(); if(!filter_id){ $('div[name="selectTipologia"]').html(''); $('div[name="selectProfilo"]').html(''); $('div[name="selectManiglia"]').html(''); $('div[name="selectColore"]').html(''); $('div[name="selectVetro"]').html(''); $('div[name="selectVetroDecorativo"]').html(''); }else{ $.ajax({ type: "POST", url: "filter.php", data: { action: 'showFilterForInsert', filter_id: filter_id }, cache: false, success: function(responce){ var optipologi = ''; $(responce.selectTipologia.tipologi).each(function() { optipologi += '<option value="' + $(tipologi).attr('id') + '">' + $(tipologi).attr('nome_corto') + '</option>'; }); var opprofili = ''; $(responce.selectProfilo.profili).each(function() { opprofili += '<option value="' + $(profili).attr('id') + '">' + $(profili).attr('nome_corto') + '</option>'; }); $('div[name="selectTipologia"]').html('<select name="Tipologia">'+optipologi+'</select>'); $('div[name="selectProfilo"]').html('<select name="Profilo">'+opprofili+'</select>'); //$('div[name="selectManiglia"]').html(selectManiglia); //$('div[name="selectColore"]').html(selectColore); //$('div[name="selectVetro"]').html(selectVetro); //$('div[name="selectVetroDecorativo"]').html(selectVetroDecorativo); } }); }; }; $sql = mysql_connect("localhost", "000", "000"); if (!$sql) { echo "MySQL сервер недоступен! ".mysql_error(); } else { $select = mysql_select_db("000", $sql); if (!$select) { echo "Нет соединения с БД".mysql_error(); } } if ($_POST['showFilterForInsert']){ $Tipologia = mysql_query("SELECT id, nome_corto FROM criteri WHERE id_filter='".$_POST['filter_id']."' AND meta='Tipologia'"); if ($Tipologia) { $num = mysql_num_rows($Tipologia); $i = 0; while ($i < $num) { $tipologi[$i] = mysql_fetch_object($Tipologia); $i++; } $selectTipologia = array('tipologi'=>$tipologi); } $Profilo = mysql_query("SELECT id, nome_corto FROM criteri WHERE id_filter='".$_POST['filter_id']."' AND meta='Profilo'"); if ($Profilo) { $num = mysql_num_rows($Profilo); $i = 0; while ($i < $num) { $profili[$i] = mysql_fetch_object($Profilo); $i++; } $selectProfilo = array('profili'=>$profili); } $responce = array('selectTipologia' => $selectTipologia, 'selectProfilo' => $selectProfilo); print json_encode($selectTipologia); } ошибка в том что селекты показываются но пустые, не знаю как правильно вывести! |
Цитата:
Цитата:
И вообще, что именно не работает? Я подсказал инструменты, которыми можно локализовать проблему. |
Цитата:
|
Цитата:
|
danik.js,
помоги с последним разобраться, пожалуйста!:) |
Цитата:
|
Цитата:
|
А не, я подумал тебя беспокоит что type:error возвращает, видимо из-за ошибки в запросе.
На странице выводится потому что ты чета напутал. Тот код должен запускаться только для генерации ответа на аякс-запрос. Нафига ты его втыкнул в html страницу - это не ко мне вопрос. |
Цитата:
//выводим список видов тонировок $VB=mysql_query("SELECT id, nome_corto FROM criteri WHERE id_filter='".$filter_id."' AND meta='Vetri decorati'"); if ($VB) { $num = mysql_num_rows($VB); $i = 0; while ($i < $num) { $vbi[$i] = mysql_fetch_object($VB); $i++; } $resVB = array('vbi'=>$vbi); } else { $resVB = array('type'=>mysql_error()); } $all = array('resVV' => $resVV, 'resVB' => $resVB, 'resManigli' => $resManigli, 'resColore' => $resColore, 'resProfili' => $resProfili, 'resTipologia' => $resTipologia); print json_encode($all); вот только тут он print json_encode($all); и выводит все на страницу |
>$resVB = array('type'=>mysql_error());
.... 'resVB' => $resVB Ваши пользователи - ваши отладчики? |
Цитата:
а Вы что можете сказать по вопросу описанному выше??? |
А что сказать? Что за проблемы у вас я не знаю, это всю тему перечитать надо, но если только об этом посте, то я не понимаю смысла этого действа:
$num = mysql_num_rows($VB); $i = 0; while ($i < $num) { $vbi[$i] = mysql_fetch_object($VB); $i++; } это ради чего такое колдовство? Не понимаю зачем так "для себя" ошибки проверять, чтобы потом выковыривать. То есть серверная сторона "не то", а значит и клиентской стороне "не сладко". |
Цитата:
|
Принт делай при запросе аяксом только, че непонятного?
Если код общий, можешь его переиспользовать, вынеся код получения данных в функцию/класс. Далее юзаешь эту функцию из двух точек: при выводе в select или куда там, и при запросе аяксом, прогоняя через json_encode |
Значит так:
данный цикл создавался для того чтоб данные из базы упаковать в массив Стоит ли начинать цикл, если не знаем вернул ли запрос результат? Почему не?: if($VB) { if(mysql_num_rows($VB)) { while($row = mysql_fetch_object($VB)) $vbi[] = $row->field_name; } else $msg = 'Empty'; } else $msg = DEBUG ? __FILE__ .'/'. __LINE__ .'/'. mysql_error() : 'Sorry'; где $msg - определяет для клиента сообщение, DEBUG - задает режим отладка/вывод. Зачем $vbi[$i]? Вы думаете что таким образом индексы массива станут более "индексными"? Собственно получить всю структуру вашего массива для передачи клиенту можно сразу, без промежуточного получения массива. а главный вопрос как мне избежать вывода этого массива на главной странице из-за print json_encode($all); Не выполнять print, что еще можно сказать. |
Цитата:
|
Я не поучаю, я вопрошаю - почему так пишите? Как это понимать - "я пробовал не выполнять принт и ничего не работало, и пробовал вместо принт писать ретурн, так же не работало"? Вы что не представляете задачу, которую решаете, не понимаете назначений print, return, etc...? Ну тогда либо бросайте это занятие, либо учитесь применять инструменты языка.
$vbi[] = $row->field_name; - это всего лишь пример показывающий, что указывать принудительно индекс массива там, где в этом нет необходимости нет смысла. Конечно, в вашем случае помещение в этот индекс массива (ряда из ресурса) это $vbi[] = $row; А вообще пора отвыкать от MySQL расширения, не будет в дальнейшем РНР его поддерживать, и изучайте PDO. В этом случае под РНР версии не ниже 5.4 ваш запрос и результат мог бы выглядеть так: $VB = $db->prepare("SELECT id, nome_corto FROM criteri WHERE id_filter=? AND meta=?"); $VB->execute([$filter_id, 'Vetri decorati'])->fetchAll(); здесь fetchAll() возвращает готовый массив всех возвращенных запросом рядов. Какой тип будет возвращаться можно установить в настройках PDO. Можно и "на лету менять" тип, если настроили возвращать как объекты, а в этой выборке нужен индексный массив, значит можно для этой выборки это указать - fetchAll(PDO::FETCH_NUM). Ошибки обрабатывать нужно глобально. Если определяете для диалога клиент-сервер тип данных как json, то не так и сложно определить соглашения для всего приложения - если клиент получил объект со свойством err, значит вернулась ошибка, выводится сообщение об ошибке и обслуживаемое не индивидуальным сценарием для каждого такого диалога, а, пусть функцией, которая выводит сообщения. При этом другие действия на клиенте не выполняются, смысла нет. Если же объект возвращенный содержит свойство msg, значит может выводится и сообщение, и выполняться иные сценарии с возвращенными данными. У вас же вообще в приложение не заложено никакой логики, вот вы и гадаете. Вот только начинать писать надо не с print и т.п., а с понимания того, чего нужно, и что для этого потребуется, и от общего к частному, а не наоборот. |
вернусь к началу чтоб больше не было слов но отсутствии логики..
задача состояла в следующем: создать селект после выбора в котором будут загружаться из базы другие N'ые селекты с данными и обязательно, без перезагрузки страницы! вот и вся логика! я знаю что для реализации этого вопроса необходима форма, код клиента и код сервера, обработчика. учитывая большой недостаток моих знаний, я начал рыскать ответ в сети, то что я выкладывал это и есть пример из сети который я лишь пытался адаптировать под свои требования! в процессе разбора и адаптирования все заработало за исключением того что выводится массив на сайт в виде строки благодаря принт! кстати говоря значения принт ретурн еко и др. я прекрасно знаю но в среде php! а так же именно везде я встречаю что! чтоб передать ответ от сервера в виде массива необходимо сделать print json_encode($array) или echo json_encode($array) именно так я и поступал! логика есть и она ясна как день! я не взял эту задачу с потолка и не пытаюсь просто так достать людей! |
Логика всего приложения имеется ввиду, а не частностей. Если она будет, то и код ваш будет соответствовать ей, а этого нет у вас.
Не обязательно print или echo, если на этом работа сервера заканчивается, а далее есть еще код, то чтобы он не выполнялся нужно exit(json_encode($array)); Если у вас вместо того чтобы эти данные вернулись в ответ на асинхронный запрос они они вываливаются на страницах, то именно логика вашего приложения и хромает. |
Ну ты индеец... Ошибка какая?
И еще посмотри на вкладке Сеть ответ от сервера. |
Часовой пояс GMT +3, время: 22:34. |