X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Заполнение БД с внешними ключами через форму
Ledy
Ledy
Topic Starter сообщение 9.7.2011, 14:15; Ответить: Ledy
Сообщение #1


Здравствуйте!

Есть база данных, состоящая из двух таблиц Авторы и Города.

Поля таблицы Авторы (author):
id_author (primary key)
name
id_city (foreign key)
Поля таблицы Города (city):
id (primary key)
city
То есть поле id из таблицы Города является внешним ключом для таблицы Авторы.

Далее создаем форму для добавления данных в БД:
<form action="save.php" method="post" name="test_form">
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2" align="center"><strong>Заполнение таблицы</strong></td>
</tr>
<tr>
<td width="150">Автор :</td>
<td><input type="text" name="fild_author" maxlength="100" /></td>
</tr>
<tr>
<td width="150">Город :</td>
<td><input type="text" name="fild_city" maxlength="100" /></td>
</tr>

<tr>
<td colspan="2" align="center">
<input type="submit" class="buttons" value="Отправить запрос" />
<input type="reset" class="buttons" value="Очистить" />
</td>
</tr>
</table>
</form>

И файл save.php:
[PHP]<?php
/* Соединяемся с базой данных */
$conn = mysql_connect("localhost", "root");
/* Выбираем базу данных. */
$db = mysql_select_db("mybd", $conn);

$query = "INSERT INTO city SET city='".$_POST['fild_city']."'";
$result = mysql_query($query);

$query = "INSERT INTO author SET name_author='".$_POST['fild_author']."'";
$result = mysql_query($query);

$query = "INSERT INTO author SET id_city=city.id where city.city='".$_POST['fild_city']."'";
$result = mysql_query($query);

/* Закрываем соединение */
mysql_close();

[/PHP]
Нужно чтобы поле id_city из таблицы Авторы заполнялось автоматически, в соответствии с названием города, вводимым с формы. Но последний запрос
[PHP]$query = "INSERT INTO author SET id_city=city.id where city.city='".$_POST['fild_city']."'";
$result = mysql_query($query);[/PHP]
неверный. Подскажите пожалуйста как его можно исправить
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
BigBoy_hb
BigBoy_hb
сообщение 9.7.2011, 16:33; Ответить: BigBoy_hb
Сообщение #2


[PHP]mysql_query ("INSERT INTO author
SELECT 0, '".$_POST['field_author'"]."', id FROM city WHERE city = '".$_POST['field_city']."'");[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Ledy
Ledy
Topic Starter сообщение 9.7.2011, 16:38; Ответить: Ledy
Сообщение #3


а первое значение 0 для id_author? у меня просто стоит auto-increment для поля id_author. или это что-то другое?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Ledy
Ledy
Topic Starter сообщение 9.7.2011, 17:58; Ответить: Ledy
Сообщение #4


предложенный работает, если убрать "0" и перечислить поля, которые необходимо заполнять. Ключевое поле заполняется автоматически.
А если делать несколько дочерних таблиц, то запрос такой:

[PHP]$result = mysql_query ("INSERT INTO author (login, name_author, id_city, id_org, id_email, id_degree)
SELECT '".$_POST['fild_login']."', '".$_POST['fild_author']."', city.id, organization.id, email.id, degree.id
FROM city, organization, email, degree
WHERE city.city = '".$_POST['fild_city']."' and organization.org = '".$_POST['fild_org']."' and email.email = '".$_POST['fild_email']."' and
degree.degree = '".$_POST['fild_degree']."'");[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 10.7.2011, 15:46; Ответить: Mulder_hb
Сообщение #5


[PHP]<?php

$city = htmlspecialchars(trim($_POST['fild_city']));
$author = htmlspecialchars(trim($_POST['fild_author']));

$conn = mysql_connect('localhost', 'root')
or die(mysql_error());
mysql_select_db("mybd", $conn)
or die(mysql_error());
$result = mysql_query("INSERT INTO `city` (`city`) VALUES ('" . mysql_real_escape_string($city) . "')");
$cityId = mysql_insert_id();
if (!$cityId) { // запись уже существует
$result = mysql_query("SELECT `id` FROM `city` WHERE `city` = '" . mysql_real_escape_string($city) . "'");
$cityId = (int) mysql_result($result, 0);
}
$result = mysql_query("INSERT INTO `author` (`name`,`id_city`) VALUES ('" . mysql_real_escape_string($city) . "', $cityId)");
if (!$result) {
die('Что-то пошло не так...');
}

mysql_close();[/PHP]
Или так:
[PHP]<?php

$city = htmlspecialchars(trim($_POST['fild_city']));
$author = htmlspecialchars(trim($_POST['fild_author']));

$conn = new mysqli('localhost', 'root', '', 'mybd');
if (mysqli_connect_errno()) {
die('Ошибка соединения: ' . mysqli_connect_error());
}

$stmt = $conn->prepare("INSERT INTO city (city) VALUES (?)");
$stmt->bind_param('s', $city);
$stmt->execute();
if (!$stmt->affected_rows) { //запись уже существует
$stmt = $conn->prepare("INSERT INTO author (name,id_city) VALUES (?, (SELECT id FROM city WHERE city = ?))");
if (!$stmt) {
die('Что-то пошло не так...');
}
$stmt->bind_param('ss', $author, $city);
$stmt->execute();
$stmt->close();
} else {
$cityId = $stmt->insert_id;
$stmt = $conn->prepare("INSERT INTO author (name,id_city) VALUES (?, ?)");
if (!$stmt) {
die('Что-то пошло не так...');
}
$stmt->bind_param('ss', $author, $cityId);
$stmt->execute();
$stmt->close();
}

$conn->close();[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
BigBoy_hb
BigBoy_hb
сообщение 11.7.2011, 1:57; Ответить: BigBoy_hb
Сообщение #6


а зачем столько лишнего кода на php? не проще это все сделать путём sql? ибо так вы получается лишний раз "грузите" субд
как по мне проще написать хранимую процедуру и пусть она сама там всё делает
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 11.7.2011, 10:48; Ответить: Mulder_hb
Сообщение #7


(BigBoy_hb @ 11.7.2011, 04:57) *
а зачем столько лишнего кода на php?

Весь этот "лишний", как вы выразились, код призван защитить сайт от прыщявых хацкеров. Данные перед вставкой в бд нужно обрабатывать.
(BigBoy_hb @ 11.7.2011, 04:57) *
как по мне проще написать хранимую процедуру и пусть она сама там всё делает

Хранимая процедура не обладает гибкостью и расширяемостью.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Ledy
Ledy
Topic Starter сообщение 11.7.2011, 21:25; Ответить: Ledy
Сообщение #8


(Mulder_hb @ 10.7.2011, 18:46) *
if (!$stmt->affected_rows) { //запись уже существует
$stmt = $conn->prepare("INSERT INTO author (name,id_city) VALUES (?, (SELECT id FROM city WHERE city = ?))");
if (!$stmt) {
die('Что-то пошло не так...');
}

это проверка записи в таблице города?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 12.7.2011, 12:17; Ответить: Mulder_hb
Сообщение #9


(Ledy @ 12.7.2011, 00:25) *
это проверка записи в таблице города?

Проверка записи была выше. Кстати, код надо проверять, я то писал прямо тут через веб-форму форума, не проверяя ни синтаксис, ни работу.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Ledy
Ledy
Topic Starter сообщение 12.7.2011, 13:46; Ответить: Ledy
Сообщение #10


да синтаксис вроде правильный.
а вот как сделать чтобы при записи данных в таблице Города не создавались дубликаты? Insert ignore и Replace выдает ошибку (когда указано что поле city - название города - уникальное). Пробовала ничего не добавлять в таблицу-справочник Города, а просто сравнивать значение из формы fild_city с полем city таблицы Города, но тогда в таблицу Авторы тоже ничего не добавляется
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыBropush - Твой бро в монетизации через Push-уведомления
31 bropush 11884 Сегодня, 13:00
автор: bropush
Открытая тема (нет новых ответов) Если в сайт с одними ключами, которые там долго, добавить новую рубрику с новыми ключами
2 Tutich 1333 16.4.2024, 8:27
автор: Tutich
Открытая тема (нет новых ответов) Через какой браузер и как можно найти в кэшэ браузера видео
10 Room 2390 23.3.2024, 7:41
автор: Room
Открытая тема (нет новых ответов) Продвижение сайта через краудинг с поддержкой
Полный комплекс мер по продвижению сайта
0 alexey 1016 22.8.2023, 16:33
автор: alexey
Открытая тема (нет новых ответов) Куплю группы ВК - только через гаранта
1 robot_yaga2 882 30.5.2023, 16:51
автор: GlazAlmaz


 



RSS Текстовая версия Сейчас: 25.4.2024, 13:12
Дизайн