Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z tworzeniem artykułów
Forum PHP.pl > Forum > Przedszkole
mic4ael
Dopiero raczkuję w tematyce PHP, dlatego też postanowiłem napisać prosty skrypt dzięki któremu można tworzyć artykuły (tytuł, autor, treść). Jednak mam z nim pewien problem. Jeżeli we wszystkich polach wprowadzę jakieś wartości i zaakceptuje to jeszcze działa poprawnie, ale jak zacznę odświeżać stronę, to po każdym odświeżeniu do bazy danych dodaje się ten sam rekord (który został poprzednio wprowadzony). Próbowałem po zapisaniu do bazy danych, niszczyć zmienne, przypisywać wartości NULL, ale nic nie działa. Przy okazji, mój sposób wykonania tego nie jest zapewne wyrafinowany, więc liczę na jakieś podpowiedzi co można usprawnić, czy jak to można by było inaczej zrobić.

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
  5. <title> Tworzenie i wyświetlanie artykułów </title>
  6. <style type="text/css">
  7. #spis {
  8. float: left;
  9. width: 400px;
  10. height: 300px;
  11. border: 1px solid black;
  12. }
  13.  
  14. #tworzenie {
  15. float: right;
  16. width: 700px;
  17. height: 500px;
  18. border: 2px solid blue;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div id="spis">
  24. <p align="center"> Spis artykułów </p>
  25. <?php
  26. function artykul($autor, $tytul, $id)
  27. {
  28. //echo "</br>";
  29. echo "\n\t\t" .$id .". Autorem artykułu pod tytułem <b><a href=\"#\" style=\"text-decoration: none\"> ". $tytul;
  30. echo " </a></b> jest ". $autor . ".</br>\n";
  31. }
  32.  
  33. $hostname = 'localhost';
  34. $user = 'root';
  35. $password = 'haslo';
  36. $dbName = 'articles';
  37.  
  38. $lacz = mysql_connect($hostname, $user, $password) or die(mysql_error());
  39. $db = mysql_select_db($dbName, $lacz) or die(mysql_error());
  40.  
  41.  
  42. $query = "SELECT * FROM `articles` WHERE `numer`>=1";
  43. $rezultat = mysql_query($query, $lacz) or die(mysql_error());
  44.  
  45. while ($tablica = mysql_fetch_assoc($rezultat))
  46. {
  47. artykul($tablica["autor"], $tablica["tytul"], $tablica["numer"]);
  48. }
  49.  
  50. ?>
  51. </div>
  52. <div id="tworzenie" style="min-width: 300px;">
  53. <p align="center"> Tworzenie artykułu </p>
  54. <form align="center" method="GET">
  55. Tytuł artykułu: <input type="text" name="tytul"/></br>
  56. Autor artykułu: <input type="text" name="autor"/></br></br>
  57. Artykuł: </br><textarea name="tresc" cols="50" rows="10"></textarea></br>
  58. <input type="submit" value="Stwórz" name="tworz"/>
  59. </form>
  60. <?php
  61. $hostname = 'localhost';
  62. $user = 'root';
  63. $password = 'haslo';
  64. $dbName = 'articles';
  65.  
  66. $lacz = mysql_connect($hostname, $user, $password) or die(mysql_error());
  67. $db = mysql_select_db($dbName, $lacz) or die(mysql_error());
  68.  
  69. if($_GET['autor']!=NULL && $_GET['tytul']!=NULL && $_GET['tresc']!=NULL)
  70. {
  71. $aut = $_GET['autor'];
  72. $tyt = $_GET['tytul'];
  73. $tre = $_GET['tresc'];
  74. $sql = "INSERT INTO `articles`(`autor`, `tytul`,`tresc`) VALUES ('$aut', '$tyt', '$tre')";
  75. $rezultat = mysql_query($sql, $lacz) or die(mysql_error());
  76. //unset($aut);
  77. //unset($tyt);
  78. //unset($tre);
  79. } else {
  80. echo "</br>Jakis blad";
  81. }
  82. ?>
  83. </div>
  84. </body>
  85. </html>
  86.  
bostaf
Z pomocą przychodzi technika PRG (Post/Redirect/Get). Chodzi o to, żeby po przetworzeniu danych wejściowych odświeżyć stronę przekierowując ją do siebie samej i "gubiąc" w ten sposób dane formularzy. Z POST jest prosto, z GET trudniej ale jak załapiesz jedno to dasz radę z drugim.

Kod PHP, który nie generuje żadnego wyjścia (np. HTMLa) dajesz na samą górę pliku. U Ciebie będzie to ten kawałek od "if($_GET['autor']!=NULL && $_GET['tytul']!=NULL && $_GET['tresc']!=NULL)". Przetwarzasz tam dane wejściowe i wrzucasz je do bazy. Problem z tym, że parametry, które przechowują Twoje dane (autor, tytul, tresc) pozostają w URLu i dlatego odświeżanie strony powoduje ponowne ich przetworzenie. Żeby tego uniknąć, na koniec przetwarzania dajesz wymuszenie przekierowania: "header('Location: ' . $_SERVER['SCRIPT_NAME']);". W ten sposób, strona przeładuje się bez parametrów, a zatem nie dojdzie do przetworzenia danych. Są tu dwie rzeczy, z którymi musisz sobie poradzić:
  1. funkcja header nie może być poprzedzona ani jednym znakiem wysłanym do przeglądarki. Dlatego wcześniej wspomniałem o tym, że cały kod przetwarzający dane musi być na samym początku całego skryptu i nie może wyrzucać żadnych znaków.
  2. przekierowanie do "$_SERVER['SCRIPT_NAME']" spowoduje "zgubienie" parametrów. Z jednej strony to dobrze, bo tego chcemy. Z drugiej - może się okazać, że potrzebujesz któregoś parametru, żeby poprawnie wyświetlić treść strony. W tym wypadku musisz ręcznie dodać te parametry po "$_SERVER['SCRIPT_NAME']" (np: "header('Location: ' . $_SERVER['SCRIPT_NAME'] . "?artykul=$id_article");"). Z POST nie ma takiego problemu - przekierowujesz do $_SERVER['REQUEST_URI'] a dane z formularza "giną" po drodze.
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.