Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Правильно ли связал таблицы, связь таблиц
Astin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 24 дня
Карма: 7




Приветствую Форумчане!

Вот немного подошел к теме связей таблиц.
Сделал две тестовые таблицы и решил связать их и сделать вывод и удаление.

Прошу посмотреть мой код, правильно ли я делаю?

Таблица №1. Здесь название фирмы и ее адрес
CREATE TABLE IF NOT EXISTS `nam` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`adres` varchar(100) NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;


Таблица №2. Здесь Процентные ставки
CREATE TABLE IF NOT EXISTS `zol` (
`z_id` int(11) NOT NULL,
`zol` int(11) NOT NULL,
`teh` int(11) NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;


Связал таблицы через вот такой запрос:
ALTER TABLE  `zol` ADD FOREIGN KEY (`z_id`) REFERENCES  `nam` (`id`)



Вот тестовый код где я заношу в базу данные
<?php
include 'conect.php';

//Если переменная ok передана
if (isset($_POST["ok"])) {

$name = htmlspecialchars(trim($_POST["name"]));
$adres = htmlspecialchars(trim($_POST["adres"]));
$zol = htmlspecialchars(trim($_POST["zol"]));
$teh = htmlspecialchars(trim($_POST["teh"]));

$query = "
INSERT INTO
`nam`
SET

`name` = '"
.mysql_real_escape_string($name)."',
`adres` = '"
.mysql_real_escape_string($adres)."'
"
;
$sql = mysql_query($query) or die("Ошибка данных!");
// получаем номер добавленной записи (id)
$id = mysql_insert_id();

$query = "
INSERT INTO
`zol`
SET

`zol` = '"
.(int)($zol)."',
`teh` = '"
.(int)($teh)."'

"
;
$sql = mysql_query($query) or die("Ошибка данных!");
// получаем номер добавленной записи (id)
$id = mysql_insert_id();


//Если вставка прошла успешно
if (mysql_affected_rows() > 0) {
echo 'Успех!!!';
}
}

?>
<!DOCTYPE HTML>
<html lang="ru-RU">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>
GGGG'Успех!!!'</title>
</head>
<body>
<form
action="" method="post">
<p>
Имя</p>
<input
type="text" name="name" minlength="3" placeholder="" required />
<p>
Адрес</p>
<input
type="text" name="adres" placeholder="" required />
<p>
Золото</p>
<input
type="text" name="zol" placeholder="" required />
<p>
Техника</p>
<input
type="text" name="teh" placeholder="" required />
<br>
<button
name="ok" type="submit">Отправить заявку</button>
</form>
</body>
</html>


Вот код в котором вывожу и могу удалять данные в связанных таблицах
 <?php
include 'conect.php';

//Удаляем, если что
if (isset($_GET['del']) > 0) {
$id = strip_tags(trim($_GET['del']));
$id = intval($id);
$query ="DELETE `nam`, `zol` FROM `nam` LEFT JOIN `zol` ON `nam`.id = `zol`.z_id WHERE id='".$id."'";
$sql = mysql_query($query) or die("Ошибка данных!");
if (mysql_affected_rows() > 0) {
echo 'Отлично!';
}
else {
echo 'Неудача'; }
}



//Получаем данные
$query = "SELECT * FROM `nam` LEFT JOIN `zol`
ON `nam`.id = `zol`.z_id ORDER BY `nam`.id DESC LIMIT 5"
;
// Если таблица не существует то ошибка
$sql = mysql_query($query) or die("Ошибка данных!");
// Проверяем существование строк в таблице
// Если строк больше нуля то выводим, если нет строк выводим сообщение

if(mysql_num_rows($sql) > 0){
$table = "<table>\n";
while ($result = mysql_fetch_assoc($sql)) {
$table .= "<tr>\n";
$table .= "<td>№ </td>\n";
$table .= "<td>Название  </td>\n";
$table .= "<td>Город  </td>\n";
$table .= "<td>Золото </td>\n";
$table .= "<td>Техника </td>\n";
$table .= "<td></td>\n";
$table .= "</tr>\n";
$table .= "<tr>\n";
$table .= "<td></td>\n";
$table .= "<td>".$result['name']."</td>\n";
$table .= "<td>".$result['adres']."</td>\n";
$table .= "<td>".$result['zol']."</td>\n";
$table .= "<td>".$result['teh']."</td>\n";
$table .= "<td><a href='./wm.php?del=".$result['id']."'>Удалить</a></td>\n";
$table .= "</tr><br />\n";
}
$table .= "</table>\n";
echo $table;
}
else{
echo "<b>Записей НЕТ!</b>"; //Если записи закончились
die();
}


Правильно ли написан код?

И если что то не то, то прошу подскажите пожалуйста.

_

Это сообщение отредактировал Astin - 16.03.2016 - 00:38
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 24 дня
Карма: 7




Так то код работает, но очень важно знать правильно ли я связал таблицы, да и
вообще правильно ли и корректно написан код
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 7 дней
Карма: 77




Есть что не то .
Цитата (Astin @ 15.03.2016 - 23:31)
  $query = "
INSERT INTO
    `zol`
SET

`zol` = '".(int)($zol)."',
`teh` = '".(int)($teh)."'

";
1) где добавления z_id ? Или связанные таблицы сами номера прописывают ... сам пока не сталкивался.
Если ты указываешь значение в кавычках, это говорит о том что ты добавляешь строку. Да Mysql это нормально проглатывает, и сама приводит значение к выбранному типу.
Цитата (Astin @ 15.03.2016 - 23:31)
$zol = htmlspecialchars(trim($_POST["zol"]));
$teh = htmlspecialchars(trim($_POST["teh"]));
зачем ты это делаешь с числами ?
$zol = (int)$_POST["zol"];
....

$sql = "
INSERT INTO
`zol`
SET
`z_id` =
$id,
`zol` =
$zol,
`teh` =
$teh
";
Удаление. Не знаю как твой код, но этот должен работать.
Удалит одну запись из `nam`( id = $id) , все из `zol` (z_id = $id)
$query ="
DELETE FROM
`nam`
LEFT JOIN
`zol` ON `nam`.id = `zol`.z_id
WHERE
`nam`.id =
$id ";
Пишите запросы более читаемо (ниже вроде лучше ?)
$query = "
SELECT
*
FROM
`nam`
LEFT JOIN
`zol` ON `nam`.id = `zol`.z_id
ORDER BY
`nam`.id
DESC
LIMIT 5
"
;

А теперь главный вопрос .

Как пользователь добавит вторую запись, от своего имени? Нужно его запомнить индивидуально. Это можно сделать очень разными способами.

Это сообщение отредактировал Kusss - 16.03.2016 - 18:10
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Есть и концептуальный вопрос:
Цитата
ENGINE=MyISAM и FOREIGN KEY

WTF?
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 7 дней
Карма: 77




Кстати да , на MyISAM не работает связь таблиц.
Нужно InnoDB
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 24 дня
Карма: 7




Цитата
<pre class="sh_sourceCode" rel="code">Удаление. Не знаю как твой код, но этот должен работать.
Удалит одну запись из `nam`( id = $id) , все из `zol` (z_id = $id)
$query ="
DELETE FROM
   `nam`
LEFT JOIN
   `zol` ON `nam`.id = `zol`.z_id
WHERE
   `nam`.id = $id ";</pre>

Kusss Когда я ставил так как ты написал, удаляло все записи в таблице nam

Я немного переделывал код, короче вот код удаления мой
//Удаляем, если что
if (isset($_GET['del']) > 0) {
$id = strip_tags(trim($_GET['del']));
$id = intval($id);
$query ="DELETE `nam`, `zol` FROM `nam`

LEFT JOIN zol ON nam.id = zol.z_id

WHERE id ='".$id."'
";
$sql = mysql_query($query) or die("Ошибка данных!");
if (mysql_affected_rows() > 0) {
echo 'Отлично!';
}
else {
echo 'Неудача'; }
}


Вообще это я пока просто шаблон для тренировки сделал. Плюс сделал редактирование
записи, но пока для проверки только одного поля в таблице zol,
выбирается для редактирования нужная запись с помощью сессии. Плюс
сделал так, если к примеру данные из таблицы nam есть, а данных в таблицы zol нет
для выбранных полей полей из таблицы nam, то при выборе редактирования пустого или
вообще несуществующего поля из таблицы zol оно атоматом добавляется к выбраной записи

Понятно написал, нет))) Сам в шоке....

Вот код
<?php
if (isset($_POST['save'])) {
$zolt = (int)$_POST["zolt"];

//Выбираем таблицу для редактирования
$query = "UPDATE `zol`

SET `zolt` = '"
.$zolt."'

WHERE `z_id`='"
.$_SESSION['z_id']."'
"
;
// Если не правильный запрос то ошибка
$sql = mysql_query($query) or die("Ошибка данных!");

if (mysql_affected_rows() > 0) {

echo 'Удачно Изменено!';
}
else {

$query = "
INSERT INTO `zol`

SET `z_id`='"
.$_SESSION['z_id']."',

`zolt` = '"
.$zolt."'

"
;
$sql = mysql_query($query) or die("Ошибка данных!");
// получаем номер добавленной записи (id)

echo 'Создали!';
}
}


?>
<!DOCTYPE HTML>
<html lang="ru-RU">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>
Панель</title>
</head>
<body>
<form
action="" method="post">
<p>
Выберите сумму золота:</p>
<textarea
name="zolt"><? print $zolt; ?></textarea>
<br />
<input
class="submit" name="save" type="submit" value="Сохранить" />
</form>
</body>
</html>
<?php

// Запоминаем в сессию id выбраной записи
$_SESSION['z_id']= $stat;
?>




Цитата
1) где добавления z_id ? Или связанные таблицы сами номера прописывают ... сам пока не сталкивался.

Вот же стоит $id = mysql_insert_id(); или не то? Я проверочный код наскоряк писал
чтоб проверить связь таблиц и еще кое что. Если неправильно поправь.

Цитата
$zol = htmlspecialchars(trim($_POST["zol"]));
$teh = htmlspecialchars(trim($_POST["teh"]));
зачем ты это делаешь с числами ?

Это я вообще делал для отправки сообщений на почту, типа добавилась новая
запись и пришло письмо админу))) Естественно такое с регистрацией на сайте я
делать не буду. Прикинь ели в день более 50 будут регистрироваться и заполнять заявки...


Я немного имена в таблицах поменял, добавил еще отдельную таблицу городов и добавляю
город. Плюс поменял FOREIGN KEY. В таблицу zol в новое поле id_nam занашу id
из таблицы nam. Поле id_nam у меня FOREIGN KEY.

Вот честно говоря Kusss не знаю правильно ли заношу данные в таблицу для поля
FOREIGN KEY. Kusss глянь пожалуйста и если что не так поправь пожалуйста.

Вот код
<?php

// Массив с городов писать не буду, ужу очень много там, и то
// сделал его ради проверки работы, а так вообще на сайте вывожу
// их из таблицы в селект

// Выводим Города в select

$select = '<select name="city_id" required>';
$select .= '<option value="">Не выбрано...</option>';

foreach($city as $key => $value){
$select .= '<option value='.$value.'>'.$key.'</option>';
}

$select .= '</select>';

//Если переменная ok передана
if (isset($_POST["ok"])) {

$name = trim($_POST["name"]);
$adres = trim($_POST["adres"]);
$zolt = (int)$_POST["zolt"];
$teh =(int)$_POST["teh"];

$query = "
INSERT INTO
`nam`
SET
`name` = '"
.mysql_real_escape_string($name)."',
`adres` = '"
.mysql_real_escape_string($adres)."',
`city_id` = '"
.(int)($_POST["city_id"])."'
"
;
$sql = mysql_query($query) or die("Ошибка данных!");
// получаем номер добавленной записи (id)
$id = mysql_insert_id();

$query = "
INSERT INTO
`zol`
SET

`zolt` = '"
.$zolt."',
`teh` = '"
.$teh."',
`id_nam` = '"
.(int)($id)."'

"
;
$sql = mysql_query($query) or die("Ошибка данных!");
// получаем номер добавленной записи (id)
$id = mysql_insert_id();


//Если вставка прошла успешно
if (mysql_affected_rows() > 0) {
echo 'Успех!!!';
}
}

?>
<!DOCTYPE HTML>
<html lang="ru-RU">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>
GGGG'Успех!!!'</title>
</head>
<body>
<form
action="" method="post">
<p>
Имя</p>
<input
type="text" name="name" minlength="3" placeholder="Ф И О" required />
<p>
Город</p>
<input
type="text" name="adres" placeholder="" required />
<p>
Золото</p>
<input
type="text" name="zolt" placeholder="" required />
<p>
Техника</p>
<input
type="text" name="teh" placeholder="" required />
<br>
<p>
Город:</p>
<?=
$select?>
<br>
<button
name="ok" type="submit">Отправить заявку</button>
</form>

</body>
</html>


Буду рад ели поправите что не так, плюс правильным ли путем записываю в таблицу
данные для поля id_nam который есть FOREIGN KEY?

В данном случае id_nam связан с таблицей nam где id PRIMARY KEY

Это сообщение отредактировал Astin - 16.03.2016 - 19:17
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 24 дня
Карма: 7




Цитата (Kusss @ 16.03.2016 - 18:34)
Кстати да , на MyISAM не работает связь таблиц.
Нужно InnoDB

Kusss а MyISAM это что, тоже самое что и MySQL?

Кстати, есть вопрос еще, надеюсь подскажешь,

Вот у меня есть еще две таблицы, одна с городами, вторая с областями,
теперь я эти данные вывожу в select, но разные естественно селекты.

Хотел сделать один запрос на выборку, и нифига, выводит как попало данные,
пробовал через UNION и все равно криво косо выводит, берет данные из таблицы
областей и запихивает в города в выводе. Сделал два запроса.

Вот код
<?php
// Выводим Города в select
$query = "SELECT * FROM `city` ";
// Если таблица не существуе то ошибка
$sql = mysql_query($query) or die("Ошибка данных!");

$select = '<select name="city_id" required><option value="">Не выбрано...</option>';
while ($res = mysql_fetch_assoc($sql)) {

$select .= '<option value="'.$res['c_id'].'">'.$res['cit'].'</option>';
}
$select .= '</select>';


// Выводим Регионы в select
$query = "SELECT * FROM `regions` ";
// Если таблица не существуе то ошибка
$sql = mysql_query($query) or die("Ошибка данных!");

$region = '<select name="region_id" required><option value="">Не выбрано...</option>';
while ($rest = mysql_fetch_assoc($sql)) {

$region .= '<option value="'.$rest['id_r'].'">'.$rest['region'].'</option>';
}
$region .= '</select>';



Может есть какой вариант проще, если да то подскажи.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14973
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев
Карма: 443




Цитата (Astin @ 16.03.2016 - 19:25)
а MyISAM это что, тоже самое что и MySQL?

Он знает правильный ответ: https://www.google.ru/search?q=myisam&ie=ut...zOcnlywPgk5voDA


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 24 дня
Карма: 7




Цитата (sergeiss @ 16.03.2016 - 19:27)
Цитата (Astin @ 16.03.2016 - 19:25)
а MyISAM это что, тоже самое что и MySQL?

Он знает правильный ответ: https://www.google.ru/search?q=myisam&ie=ut...zOcnlywPgk5voDA

Ха-Ха..))) Sergeiss Спасибо за ссылку, я просто занят сейчас больше обучением занят
нежели вот такое по гуглу искать, но все равно гляну
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 24 дня
Карма: 7




Что-то никого нет.... Кто нибудь подскажет по коду выше
Можно его сократить по запросу или как?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса