Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL][MySQL]Relacja pomiedzy dwoma tabelami i inserty
Forum PHP.pl > Forum > Przedszkole
viamarimar
Witam mam strukture tabel jak ponizej. Problem w tym ze gdy probuje dodac jakiegos uzytkownika do tej struktury za pmoca insertow ponizej mam 0 w polach `dane_users_id` i `users_dane_id` czyli tam gdzie powinny byc powiazania relacjyjne? Powie mi ktos co robie zle lub wskaze jakis przyklad na ktorym moglbym sie zawzrorowac zeby wykonac cos podobnego czyli relacja pomiedzy dwiema tabelami i wpisanie do bazy.

  1. mysql_query("SET FOREIGN_KEY_CHECKS=0");
  2.  
  3. $zapytanie="INSERT INTO ".$prefix."users ( `users_id` , `users_login` , `users_haslo` , `users_token` , `users_aktywny`)
  4. VALUES ( '', '".$_POST['login']."', '$hash', '$s', '0')";
  5. mysql_query($zapytanie) or die(mysql_error());
  6.  
  7. $zapytanie2="INSERT INTO ".$prefix."dane ( `dane_id` , `dane_imie` , `dane_nazwisko` , `dane_email`)
  8. VALUES ( '', '".$_POST['imie']."', '".$_POST['nazwisko']."', '".$_POST['email']."')";
  9. mysql_query($zapytanie2) or die(mysql_error());


  1. -- phpMyAdmin SQL Dump
  2. -- version 4.0.9
  3. -- <a href="http://www.phpmyadmin.net" target="_blank">http://www.phpmyadmin.net</a>
  4. --
  5. -- Host: localhost
  6. -- Czas wygenerowania: 12 Lut 2015, 14:49
  7. -- Wersja serwera: 5.5.34
  8. -- Wersja PHP: 5.3.27
  9.  
  10. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
  11. SET time_zone = "+00:00";
  12.  
  13.  
  14. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  15. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  16. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  17. /*!40101 SET NAMES utf8 */;
  18.  
  19. --
  20. -- Baza danych: `projekt2`
  21. --
  22.  
  23. -- --------------------------------------------------------
  24.  
  25. --
  26. -- Struktura tabeli dla tabeli `wpl_dane`
  27. --
  28.  
  29. CREATE TABLE IF NOT EXISTS `wpl_dane` (
  30. `dane_id` int(11) NOT NULL AUTO_INCREMENT,
  31. `dane_users_id` int(11) NOT NULL,
  32. `dane_imie` varchar(50) NOT NULL,
  33. `dane_nazwisko` varchar(50) NOT NULL,
  34. `dane_email` varchar(50) NOT NULL,
  35. PRIMARY KEY (`dane_id`),
  36. KEY `usersdane_users_id` (`dane_users_id`)
  37. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
  38.  
  39. --
  40. -- Zrzut danych tabeli `wpl_dane`
  41. --
  42.  
  43. INSERT INTO `wpl_dane` (`dane_id`, `dane_users_id`, `dane_imie`, `dane_nazwisko`, `dane_email`) VALUES
  44. (1, 1, 'ssssk', 'ssss', 'p.sssss@gmail.com');
  45.  
  46. -- --------------------------------------------------------
  47.  
  48. --
  49. -- Struktura tabeli dla tabeli `wpl_users`
  50. --
  51.  
  52. CREATE TABLE IF NOT EXISTS `wpl_users` (
  53. `users_id` int(11) NOT NULL AUTO_INCREMENT,
  54. `users_dane_id` int(11) NOT NULL,
  55. `users_login` varchar(50) NOT NULL,
  56. `users_haslo` varchar(50) NOT NULL,
  57. `users_token` varchar(10) NOT NULL,
  58. `users_aktywny` int(11) NOT NULL,
  59. PRIMARY KEY (`users_id`),
  60. KEY `users_usersdane_id` (`users_dane_id`)
  61. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
  62.  
  63. --
  64. -- Zrzut danych tabeli `wpl_users`
  65. --
  66.  
  67. INSERT INTO `wpl_users` (`users_id`, `users_dane_id`, `users_login`, `users_haslo`, `users_token`, `users_aktywny`) VALUES
  68. (1, 1, 'root', '6758e143593bd7ffbc9c9996fed95890ab7db3debae19b1a9f', '4cEKyhKtoC', 0);
  69.  
  70. --
  71. -- Ograniczenia dla zrzutów tabel
  72. --
  73.  
  74. --
  75. -- Ograniczenia dla tabeli `wpl_dane`
  76. --
  77. ALTER TABLE `wpl_dane`
  78. ADD CONSTRAINT `fk_users` FOREIGN KEY (`dane_users_id`) REFERENCES `wpl_users` (`users_id`);
  79.  
  80. --
  81. -- Ograniczenia dla tabeli `wpl_users`
  82. --
  83. ALTER TABLE `wpl_users`
  84. ADD CONSTRAINT `wpl_users_ibfk_1` FOREIGN KEY (`users_dane_id`) REFERENCES `wpl_dane` (`dane_id`);
  85.  
  86. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  87. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  88. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
robertpiaty
Po pierwsze masz małą ilość kolumn w jednej i drugiej tabeli więc ja bym to wszystko w jednej tabeli.

Po drugie jak już robisz relację to po co tak?
Cytat
ALTER TABLE `wpl_dane`
ADD CONSTRAINT `fk_users` FOREIGN KEY (`dane_users_id`) REFERENCES `wpl_users` (`users_id`);

--
-- Ograniczenia dla tabeli `wpl_users`
--
ALTER TABLE `wpl_users`
ADD CONSTRAINT `wpl_users_ibfk_1` FOREIGN KEY (`users_dane_id`) REFERENCES `wpl_dane` (`dane_id`);


Robisz relację z pierwszej tabeli do drugiej a potem z drugiej do pierwszej nerdsmiley.png

Jak się uparłeś że to ma być w dwóch tabelach to moim zdaniem powinna tu być relacja 1:1 i wystarczy tylko jeden Foreign Key

Wracając do pytania To proponuję zrobić tak:
Dodaj na kluczach głównych UNSIGNED co sprawi że będą mogły być tam tylko liczby dodatnie

W insertach nie podawaj kolumny która jest FK (mają przecież auto_increment).

Wywal z tabeli z users kolumnę i klucz do tabeli dane

Zakładam że login i hasło jest unikalne.

  1. $zapytanie="INSERT INTO ".$prefix."users ( `users_login` , `users_haslo` , `users_token` , `users_aktywny`)
  2. VALUES ( '".$_POST['login']."', '$hash', '$s', '0')";
  3. mysql_query($zapytanie) OR die(mysql_error());
  4.  
  5. $zapytanie2="INSERT INTO ".$prefix."dane (`dane_users_id`, `dane_id` , `dane_imie` , `dane_nazwisko` , `dane_email`)
  6. SELECT users_id, '".$_POST['imie']."', '".$_POST['nazwisko']."', '".$_POST['email']." FROM ".$prefix."users WHERE `users_login` = '".$_POST['login']."' AND `users_haslo` = '$hash' LIMIT 1";
  7. mysql_query($zapytanie2) OR die(mysql_error());


I taka rada na koniec - nie dodawaj żmienne do SQL bezpośrednio z formularza bo ktoś Ci bazę danych zniszczy. Poczytaj o PDO w manualu PHP

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.