сохранение значания выпадающего списка.

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
motobyba
у формы есть параметр action он определяет куда будут посланы данные. Есть 2 типа отправки данных:
1. В адресной строке в виде $_GET массива
2. В виде $_POST массива.

Соответственно ставим в начале скрипта, куда отдаются данные print_r($_POST); и видим что там все данные, в том числе и v_number, v_surname, v_town.

По поводу $_SESSION - читать тут http://phpfaq.ru/sessions
 

motobyba

Новичок
вот мой файл search.php который я прописал в action.
PHP:
 <?php 
session_start();
if(!empty($_POST['v_street']))
{
	$_SESSION['street_id'] = (int)$_POST['v_street'];
}
if(!empty($_POST['v_town']))
{
	$_SESSION['town_id'] = (int)$_POST['v_town'];
}
if(!empty($_POST['v_number']))
{
	$_SESSION['number_id'] = (int)$_POST['v_number'];
}
if(!empty($_POST['v_surname']))
{
	$_SESSION['surname_id'] = $_POST['v_surname'];
}
	header("location: index.php");
	//print_r($_SESSION['street_id']);
	//print_r($_SESSION['town_id']);
	//print_r($_SESSION['number_id']);
	//print_r($_SESSION['surname_id']);
?>
соосвественно выпадающий список городов, сделал аналогично к выпадающему списку улиц.
Я ошибок не наделал? вроде бы как когда на главной странице выбираю улицу и город, жму найти, то окно обновляется, тоисть ошибок "вроде" нету.
На index.php делал:
print_r($_SESSION['street_id']);
print_r($_SESSION['town_id']);
print_r($_SESSION['number_id']);
print_r($_SESSION['surname_id']);
данные выводятся, тоисть они попали в $_SESSION.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
motobyba
для того, чтобы ошибки увидеть, надо прочитать как их "включить", то есть сделать видимыми, об этом написано на странице http://phpfaq.ru/debug - для всех страничек.

я пока ошибок не вижу, главное теперь прописать в select то, что я говорил, чтобы выбранная позиция селекта сохранилась и вывести нужные тебе данные

-~{}~ 27.04.10 21:58:

motobyba
достаточно писать print_r($_SESSION);
 

motobyba

Новичок
вот этот момент мне не понятен больше всего. что же изменять тут?
PHP:
$db = mysql_connect ("localhost","lut","12345"); 
mysql_select_db ("tel", $db); /*Соединяемся с БД*/ 
$ret = "SELECT * FROM streets"; 
$resultat = mysql_query($ret) or die('Query failed: ' . mysql_error()); 
echo "<select name='v_street' size='1' id='' style='width:140px'>"; 
while ($line = mysql_fetch_array($resultat, MYSQL_ASSOC)) { 
    echo '<option value="'.$line['id'].'">'.$line['streets']; 
} 
echo "</select>\n";
в запросе $ret = "SELECT * FROM streets"; добавить условие WHERE id = $_SESSION['street_id']??
голова уже не работает(((
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
motobyba
чтобы сохранить выбор, то есть пометить нужный пункт?
 

motobyba

Новичок
как в форме циклом проверить совпадает ли значение value в option с $_SESSION['street_id'] и если совпадает присвоить ему 'selected'?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
motobyba
ну это же элементарно, ты сравниваешь $line['id'] с $_SESSION['street_id']
 

motobyba

Новичок
кажется вот так?
PHP:
$ret = "SELECT * FROM streets";
$resultat = mysql_query($ret) or die('Query failed: ' . mysql_error());
echo "<select name='v_street' size='1' id='' style='width:140px'>";
while ($line = mysql_fetch_array($resultat, MYSQL_ASSOC)) {
	if ($line['id'] == $_SESSION['street_id'])
    echo '<option selected="selected" value="'.$_SESSION['street_id'].'">'.$line['streets'];
	else{echo '<option value="'.$line['id'].'">'.$line['streets'];}
}
echo "</select>\n";
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
motobyba
не гадай! думай. Выбирается значение сейчас?)

PHP:
$ret = "SELECT * FROM streets";
$resultat = mysql_query($ret) or die('Query failed: ' . mysql_error());
echo "<select name='v_street' size='1' id='' style='width:140px'>";
while ($line = mysql_fetch_array($resultat, MYSQL_ASSOC)) {
    echo '<option ';
    if ($line['id'] == $_SESSION['street_id']) {
         echo ' selected="selected" ';
    }
    echo ' value="'.$line['id'].'">'.$line['streets'].'</option>;
}
echo "</select>\n";
Извиняй, тут код был неверный...
 

motobyba

Новичок
в поле пусто, и в форму ничего не выводится с твоим кодом.
честно говоря я даже с трудом не понимаю что ты тут намутил в этой строке. что значит "?" перед 'selected="selected"' ?

-~{}~ 27.04.10 23:48:

Во))))так работает))))))))))))))
а можно ли как-то от сюда вытащить $line['streets'], мне нужно название улицы чтобы в дальнейшем формировать запрос.
а то пробую echo $line['streets']; но тут пусто(((
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
motobyba
Название улицы? в запросе? ты поясни что ты задумал там, а я тебе подскажу как стоит сделать...
 

motobyba

Новичок
ну в $_SESSION['street_id'] хранится id (число). но для дальнейшего запроса мне нужно именно название улици чтобы в запросе было например вот так:
$query="SELECT * FROM telbook WHERE street = 'Одесская' AND surname LIKE 'Кравченко%'";
а вместо "Одесская" я имею только число в $_SESSION['street_id']. Было бы хорошо как-то вытянуть именно имя улицыв запрос а не id.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
motobyba
используй JOIN для того, чтобы передать в запросе $_SESSION['street_id'], а в WHERE у тебя будет условие с использованием поля из соседней таблицы, с именами улиц.
 

motobyba

Новичок
JOIN - для меня "темный лес", буду изучать, что к чему.

-~{}~ 28.04.10 19:45:

вычитал что важно правельно связать таблицы перед использованием JOIN. и тут яв не понятках, у меня 3 таблицы в БД, в первой "streets"такие поля (id, streets) в telbook поля такие (id, number, surname, io, street, house, town) и в towns(id, towns).
нужно сделать индексными поля таблици telbook все кроме id, io, house? а в таблице с улицами и городами сделать индексными все поля?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Автор оригинала: motobyba
JOIN - для меня "темный лес", буду изучать, что к чему.

-~{}~ 28.04.10 19:45:

вычитал что важно правельно связать таблицы перед использованием JOIN. и тут яв не понятках, у меня 3 таблицы в БД, в первой "streets"такие поля (id, streets) в telbook поля такие (id, number, surname, io, street, house, town) и в towns(id, towns).
нужно сделать индексными поля таблици telbook все кроме id, io, house? а в таблице с улицами и городами сделать индексными все поля?
Если бы я делал то, что ты хочешь написать то я бы предложил такую структуру:

streets - переименовываем поле streets > streetname

CREATE TABLE `streets` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`streetname` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

towns - переименовываем поле towns > townname

CREATE TABLE `towns` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`townname` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

telbook - переименовываем в phonebook, Что есть io поле я не понял. Поля соответственно я переименовал street > street_id, town > town_id, number > phone,

CREATE TABLE `phonebook` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`phone` VARCHAR( 20 ) NOT NULL ,
`io` VARCHAR( 50 ) NOT NULL ,
`surname` VARCHAR( 20 ) NOT NULL ,
`street_id` INT( 11 ) NOT NULL ,
`house` INT( 5 ) NOT NULL ,
`town_id` INT( 11 ) NOT NULL ,
INDEX ( `street_id` , `house` , `town_id` )
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

Переименования я сделал потому, что иначе хрен поймешь что это у тебя там лежит, и почему поле называется во множественном числе?.. Ну ты понял в общем.

Далее, если ты не умеешь читать дампы, что я привел выше, то на перво таблице индексным полем будет id как и на второй таблице. А на третьей будет id, street_id, town_id, house.

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

Теперь тебе нужно связать таблицы:

streets.id = phonebook.street_id && towns.id = phonebook.town_id

Что конкретно непонятно, я распишу дальше?
 

motobyba

Новичок
да, названия таблиц действительно я кривые прописал, переделал все как ты сказал, так лучше, уже и сам не путаюсь что и где. индексные поля сделал, и "io" - это Имя и отчество)))

меня интерисует конкретно связка таблиц в запросе, и как выглядит запрос в моем случае например если выбираю улицу и фамилию для поиска?
читал http://www.masterwebs.ru/index.php?showtopic=6445&mode=linear но много моментов непонятно, нужна практика.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
motobyba
Имя и Отчество - храни надо в отдельных полях типа varchar(20)

связку таблиц я тебе описал, ты не знаешь как написать сам запрос?
 

motobyba

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Автор оригинала: motobyba
меня интерисует конкретно связка таблиц в запросе, и как выглядит запрос в моем случае например если выбираю улицу и фамилию для поиска?
Ссылка, что ты привел - немного не то, надо сначала читать мануал на оф сайте. Там правда все на английском.

Сразу оговорюс, что использование в запросах конструкции SELECT * FROM - однозначное зло, потому как может привести к значительным потерям в производительности выборки, по причине того, что будут отбираться вообще все поля, что есть в таблице, что нам заведомо не нужно. Здесь нужно было бы написать SELECT field1, field2, field3 FROM ... чтобы отобрать только те поля, что нам нужны. Но мне лень =)

Если у тебя имеется улица (название) и фамилия то запрос будет таким...

1. Первый этап, тебе просто нужно выбрать ВСЕ данные из основной таблицы, где есть фамилия:
Код:
SELECT * FROM phonebook WHERE surname = 'Иванов';
Видим, допустим, что нашлось 10 рядов или ни одного, неважно... Общий смысл такой выборки, думаю, тебе понятен. Вместо surname = 'Иванова' можно использовать LIKE '%Иванов%', тогда найдется, например, строки, где фамилия Иванова

2. Далее у тебя имеется параметр $_SESSION['street_id'], где лежит наша, выделенная в селекте улица, то есть ее id (пусть он будет равен 12) по таблице streets, дописываем ее в запрос.
Код:
SELECT * FROM phonebook WHERE surname = 'Иванова' AND street_id = 12;
Нашлось например скажем уже не 10 рядов (строк) а 3, потому, что мы сузили зону поиска.

3. Далее нам нужно привязать к этим данным (к полям street_id, town_id) их буквенные эквиваленты из таблиц streets и towns. Для этого используем следующую конструкцию с JOIN
Код:
SELECT * FROM phonebook p 
    JOIN streets s ON p.street_id=s.id 
    JOIN towns t ON p.town_id=t.id 
WHERE surname = 'Иванова' AND street_id = 12;
>>> phonebook p - здесь p - это алиас таблицы, то, как можно к ней обратиться коротко, чтобы указать какие поля выбираем.

-~{}~ 29.04.10 11:46:

Как подставить данные из переменных в запрос я думаю ты догадаешься... Если нет, то спрашивай, допишу кусочек.
 

motobyba

Новичок
Делаю вот такой запрос, jшибок нет, но и не выводит ничего. что же не так? id 501 соотвествует фамилии, абонент с этой фамилией есть на улице с id 501




$query="SELECT * FROM phonebook p JOIN streets s ON p.street_id=s.id JOIN towns t ON p.town_id=t.id WHERE surname LIKE 'лут%' AND street_id = 501";
 
Сверху