Здравствуйте. Суть проблемы:
Есть две таблицы:
SQL |
CREATE TABLE `streets` ( `id` int(11) NOT NULL auto_increment, `adr` varchar(255) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=31 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=31 ;
|
и
SQL |
CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, `lastname` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, `id_street` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ; |
Суть работы: оператор забивает анкету, имя, фамилию, название улицы.
Форма:
HTML |
<form name="form1" method="post" action="2.php"> <label> <input type="text" name="name" /> </label> <label> <input type="text" name="lastname" /> </label> <label> <input type="text" name="street" /> </label> <input type="submit" name="button" id="button" value="Submit" /> </form> |
Скрипт аякс шарит по таблице streets, ищет совпадения по буквам, выдает выпадающий список. Если такое название уже есть, юзер выбирает из предложенного списка. Если нет, данные нужно внести сначала в таблицу улиц, потом полученный там ид внести уже в таблицу юзеров. Делается так для того чтобы хоть как-то избежать примерно такого:
ул.Весенняя
улица весенняя
Весенняя
весенняя ул.
То есть уже 4 варианта одного и того же. а надо будет снимать отчеты по улицам, так что это плохо. Все улицы города вносить в базу тоже не вариант, поэтому нужно обновлять данные по ходу поступления.
Что получилось:
обработчик 1:
PHP |
<? require_once "config.php"; //назначаем переменные $name = $_POST['name']; $lastname = $_POST['lastname']; $street = $_POST['street'];
//проверяем есть ли в таблице улиц такое название $exist = mysql_query("SELECT * FROM streets WHERE adr='$street'" ,$db); $myrow = mysql_fetch_assoc($exist); if(mysql_num_rows($exist)>0) //если есть, тянем ее ид { $id_street = $myrow['id']; echo $id_street; //заносим в базу $z1 = mysql_query("INSERT INTO users (name,lastname,id_street) VALUES ('$name','$lastname','$id_street')"); } else { //фтыкаем новую инфу в таблицу улиц $z2 = mysql_query("INSERT INTO streets (adr) VALUES ('$street')"); //отправляем переменные следующему обработчику header( 'Location: 3.php?name='.$name.'&lastname='.$lastname.'&street='.$street.''); } |
Обработчик 2:
Поскольку мы тут, само собой разумеется что данные уже отослаты в таблицу улиц, поэтому просто повторяем вставку в таблицу юзеров
PHP |
<? $name = $_GET['name']; $lastname = $_GET['lastname']; $street = $_GET['street'];
$exist = mysql_query("SELECT * FROM streets WHERE adr='$street'" ,$db); $myrow = mysql_fetch_assoc($exist); $id_street = $myrow['id'];
$z1 = mysql_query("INSERT INTO users (name,lastname,id_street) VALUES ('$name','$lastname','$id_street')"); |
Ну и собственно, вопрос: можно ли, опираясь на задачу, как-то упростить все это до минимума. А то вроде выглядит каряво:)
Спустя 5 часов, 16 минут, 32 секунды (1.03.2009 - 17:51) twin написал(а):
Ну можно попробовать заставить юзера писать улицу в нужном формате. Сначала предложить этот формат:
HTML |
<input type="text" name="street" value="ул." /> |
Потом сделать небольшую проверочку
PHP |
<? if(strpos($street,"ул.", 0) !== false) |
Глядишь - все больше порядка будет. А отчеты можно снимать по LIKE к примеру, тогда выведет все производные, даже если что то и просочится. А остальное в принципе вроде все правильно.
Спустя 14 часов, 9 минут, 38 секунд (2.03.2009 - 08:00) modobaks написал(а):
можно еще, в запросе
PHP |
$exist = mysql_query("SELECT * FROM streets WHERE adr='$street'" ,$db); |
поменять * на id, работать быстрее будет.
и еще, зачем вот это
PHP |
header( 'Location: 3.php?name='.$name.'&lastname='.$lastname.'&street='.$street.''); |
. Почему не в этом же файле.
Спустя 3 часа, 28 минут, 22 секунды (2.03.2009 - 11:29) kirik написал(а):
Grey, ИМХО лучше будет сделать примерно таким путем:
Так же как и у тебя имеем 2 таблицы.
При добавлении нового человека, в процессе выбора улицы мы выводим список похожих улиц с помощью AJAX'а и запроса с LIKE %..% (получаем более гибкий поиск по улицам). Если человек выбрал улицу из списка, то мы знаем ее id, и соответственно при занесении этой записи в БД мы заносим тот id улицы, который был выбран при заполнении формы. В другом случае, когда нужная улица была вписана (а не выбрана из списка) мы не имеем ее id, следовательно при сабмите формы делаем дополнительный запрос на добавление новой улицы, и потом через mysql_insert_id() вытаскиваем ее id.
Но и твой скрипт можно упростить и написать одним файлом:
PHP |
require_once "config.php"; //назначаем переменные $name = $_POST['name']; $lastname = $_POST['lastname']; $street = $_POST['street'];
//проверяем есть ли в таблице улиц такое название $query = mysql_query("SELECT `id` FROM `streets` WHERE `adr` = '{$street}'" ,$db); if(mysql_num_rows($exist) > 0) //если есть, тянем ее ид { $id_street = mysql_result($query, 0); } else // если нет, пишем новую { //фтыкаем новую инфу в таблицу улиц mysql_query("INSERT INTO `streets` (`adr`) VALUES ('{$street}')"); $id_street = mysql_insert_id(); } mysql_free_result($query);
// записываем юзера if(!empty($id_street)) { mysql_query("INSERT INTO `users` (`name`, `lastname`, `id_street`) VALUES ('{$name}','{$lastname}','{$id_street}')"); } else { exit('Че-то улицу не могу найти такую...'); } |
Спустя 20 часов, 48 минут, 49 секунд (3.03.2009 - 08:18) Grey написал(а):
modobaks
Цитата |
и еще, зачем вот это PHP header( 'Location: 3.php?name='.$name.'&lastname='.$lastname.'&street='.$street.''); . Почему не в этом же файле.
|
Был неправ, испавлюсь =)
kirik
Спасибо.
Цитата |
...VALUES ('{$name}','{$lastname}','{$id_street}')... |
Фигурные скобки использовать сколь-либо желательно или это личное дело кодера?. Как-то связано с версиями PHP?
Спустя 10 минут, 9 секунд (3.03.2009 - 08:28) kirik написал(а):
Цитата (Grey @ 3.03.2009 - 00:18) |
Фигурные скобки использовать сколь-либо желательно или это личное дело кодера?. Как-то связано с версиями PHP? |
С версиями никак не связано и ипользование не обязательно, фигурные скобки лишь делают код более читабельным