[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вставка сразу в две таблицы
Grey
Здравствуйте. Суть проблемы:
Есть две таблицы:
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($query0);
}
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?

С версиями никак не связано и ипользование не обязательно, фигурные скобки лишь делают код более читабельным smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.