Я использую скрипт jQuery / JS / Ajax для динамического заполнения ящиков SELECT из моей базы данных, причем каждый последующий блок SELECT заполняется на основе предыдущего SELECT.
Например. Кто-то выбирает «Англию» из моего первого SELECT, тогда он заполняет следующий SELECT городами в Англии и т. Д.
Проблема, с которой я столкнулась, заключается в том, что вторая функция SELECT распознает переменную. Это много кода, поэтому я не хочу вставлять его, но … это первая функция, которая заполняет первый блок SELECT при загрузке страницы:
function getTierOne() { $tblname = $_SESSION['country']; $result = mysql_query("SELECT DISTINCT county FROM $tblname ORDER BY county") or die(mysql_error()); while($tier = mysql_fetch_array( $result )) { echo '<option value="'.$tier['county'].'">'.$tier['county'].'</option>'; } }
Это нормально, $ tblname – это опубликованная переменная $ _SESSION, содержащая страну-пользователя, obvs.
Проблема заключается в «onBlur» этого первого блока SELECT, второй SELECT-код взят с использованием этой функции JS и вызова PHP:
$(document).ready(function() { $('#wait_1').hide(); $('#drop_1').change(function() { $('#wait_1').show(); $('#result_1').hide(); $.get("func.php", { func: "drop_1", drop_var: $('#drop_1').val() }, function(response) { $('#result_1').fadeOut(); setTimeout("finishAjax('result_1', '"+escape(response)+"')", 400); }); return false; }); });
…
if (isset($_GET['func'])&& $_GET['func'] == "drop_1") { drop_1($_GET['drop_var']); }
Что вызывает эту функцию:
function drop_1($drop_var) { include_once('functions.php'); $result = mysql_query("SELECT DISTINCT town FROM $tblname WHERE county='$drop_var'") or die(mysql_error()); echo '<select name="drop_2" id="drop_2"> <option value=" " disabled="disabled" selected="selected">Select Your Town/Nearest Town</option>'; while($drop_2 = mysql_fetch_array( $result )) { echo '<option value="'.$drop_2['town'].'">'.$drop_2['town'].'</option>'; } echo '</select>'; echo '<input type="submit" name="submit" value="Continue" />'; }
Но эта функция не распознает мою переменную $ tblname, даже если я использую Global! Единственная переменная, которую он распознает, – это $ drop_var, которая является результатом первого блока SELECT.
Кто-нибудь знает, как я могу передать переменную $ tblname в
function drop_1($drop_var) { ...
Если вы используете сеансы PHP для хранения страны пользователя (и из строки 1 getTierOne (), это похоже на то, что вы есть), вы должны добавить строку в начало вашей функции drop1 () PHP:
function drop_1($drop_var) { $tblname = $_SESSION['country']; include_once('functions.php'); ...
JQuery должен отправлять cookie вашего пользователя вместе с параметрами GET (func и dropvar), что позволяет PHP знать, какой сеанс принадлежит пользователю, и вернуть им свои переменные сеанса (вы можете проверить это на вкладке «Сеть» Firebug / Chrome inspector – посмотрите на вызов func.php после того, как onBlur уволил и ищет заголовок запроса «Cookie»).
В качестве альтернативы, если вы не используете сеансы, но у вас есть страна, хранящаяся на стороне клиента (например, в качестве первого поля «drop_0»?), Вы могли бы передать jquery выбор из ящиков выбора уровня 1 (county) в вызов вызова. то есть.
$.get("func.php", { func: "drop_1", country: "VALUE OF COUNTRY HERE", drop_var: $('#drop_1').val() }, function(response) { ...
И измените свой PHP-код на стороне сервера, чтобы принять 2 аргумента вместо одного.
С точки зрения ремонтопригодности, не следует использовать несколько таблиц (по одной для каждой страны) и вместо этого использовать одну таблицу с дополнительным столбцом «страна». Редко бывает неплохо иметь несколько одинаково структурированных таблиц, MySQL обычно обрабатывает миллионы строк намного лучше, чем сотни таблиц, и это затрудняет объединение и внесение изменений в структуру ваших таблиц. Вы также должны дезактивировать входные данные, не используя $ GET ['drop_var'] непосредственно в SQL-запросе, или он будет разбит на кавычки и откроет вам атаки SQL-инъекций. (Извините, если у вас есть веские причины для выполнения любого из этих вопросов: Очевидно, вы знаете больше о своих конкретных требованиях, чем я!)