Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Problem z edycją rekordów - formularz edycji nie ukazuje się w przeglądarce.
Forum PHP.pl > Forum > Przedszkole
LeoMInor
Witam forumowiczów smile.gif

Nie znalazłem podobnego tematu w wyszukiwarce, więc:

Mam problem z edycją rekordów bazy z poziomu panelu admina.
Pisałem stronę na webserv i wszystko śmigało. Po zalogowaniu wyświetlały się nazwy pozycji menu strony a przy nich przycisk edytuj.
Po kilknięciu na niego wchodził formularz edycji.

Teraz wrzuciłem stronę na serwer OVH i ku mojemu zdziwieniu co prawda po zalogowaniu pozycje menu się wyświetlają, ale po wybraniu edycji strona nie wyświetla formularza edycji, a tylko się przeładowuje no i mogę tak klikać edytuj do przyszłego wieku.
W pasku przeglądarki widzę, że zmienne $p i $ile są przekazywane przez zapytanie (/admin.php?p=e&id=1).

Kod:
  1. <?
  2.  
  3. if (isset($_GET["logout"]) && ($_GET["logout"]=="1")) {unset($_SESSION["access"]);}
  4.  
  5. $sql = mysql_connect("***","***","***");
  6. mysql_query('set charset utf8');
  7.  
  8. if((isset($_POST['user']) && $_POST['user'] !== "") && (isset($_POST['pass']) && $_POST['pass'] !== "")) {
  9. $result=mysql_query("select * from users where user='".$_POST["user"]."' and pass='".md5($_POST["pass"])."'");
  10. $ile=mysql_num_rows($result);
  11.  
  12. if ($ile=="1"){
  13. $_SESSION["access"]=1;
  14. }}
  15.  
  16.  
  17.  
  18. if (isset($_SESSION["access"]) && ($_SESSION["access"]=="1")){
  19.  
  20.  
  21. $wynik = mysql_query("select id,link from menu");
  22.  
  23. while ($w = mysql_fetch_row($wynik)) {
  24. echo $w[1]." - "."\n";
  25. echo "<A HREF=\"admin.php?p=e&id=$w[0]\">edytuj</A><BR> ";
  26. }
  27.  
  28. echo "<A HREF=\"admin.php?logout=1\">Wyloguj</A>";
  29.  
  30.  
  31. if (isset($p) && ($p == "e")) {
  32. $wynik = mysql_query("select * from menu where id='$id'");
  33. $w = mysql_fetch_row($wynik);
  34. echo "<FORM METHOD=\"post\" ACTION=\"admin.php\">";
  35. echo "<TEXTAREA NAME=\"tresc\">$w[2]</TEXTAREA><BR>";
  36. echo "<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"$w[0]\"><BR>";
  37. echo "<INPUT TYPE=\"submit\" VALUE=\"edytuj\">";
  38. echo "</FORM>";
  39. }
  40.  
  41. if (isset($tresc) && ($tresc != "")) {
  42. echo "<BR>Zaktualizowano.";
  43. mysql_query("UPDATE menu SET tresc = '$tresc' where id = '$id'");
  44. }
  45.  
  46. }
  47.  
  48. else {
  49. echo "<FORM METHOD=\"post\" ACTION=\"admin.php\">";
  50. echo "login:<BR>";
  51. echo "<INPUT TYPE=\"text\" NAME=\"user\"><BR>";
  52. echo "hasło:<BR>";
  53. echo "<INPUT TYPE=\"password\" NAME=\"pass\"><BR>";
  54. echo "<INPUT TYPE=\"submit\" VALUE=\"loguj\">";
  55. echo "</FORM>";
  56. }
  57.  
  58. ?>
  59.  
  60.  


co_jest.gif Pomożecie?
mat-bi
Pierwsze, co mi się rzuciło, to straszna podatność na SQL Injection wink.gif

Hmm, czy mi się wydaje, czy register_globals jest problemem?
LeoMInor
Strzał w 10, dzięki. snitch.gif Jak rozumiem ustawienie jedynki przy zmiennych globalnych w .htaccess nie sprzyja bezpieczeństwu (?) a moje problemy w tym miejscu zamiast się kończyć, dopiero się zaczynają.
Więc powstaje pytanie jak wygląda metoda pozwalająca działać temu formularzowi bez włączania zmiennych globalnych?
No i czy podatność na atak wynikła z braku zastosowania jakiejś konkretnej nazwijmy to - sztuczki, czy kod jest że tak powiem skopany od podstaw?
mat-bi
Temat: SQL Injection Insertion - poczytaj sobie.

A żeby ten formularz działał, jest kilka dróg m.in. włączenie register_globals(cholernie niepolecane) oraz po prostu przerobienie odpowiednich zmiennych w elementy tablicy $_POST/$_GET/$_REQUEST etc.
LeoMInor
Cytat(mat-bi @ 4.03.2012, 20:11:03 ) *
(...) oraz po prostu przerobienie odpowiednich zmiennych w elementy tablicy $_POST/$_GET/$_REQUEST etc.


ok, trochę szukałem, ba - nawet próbowałem przerobić, ale chyba nie wiem jak to ma wyglądać.. jest jakiś dział poniżej przedszkola? brzydal.gif

No nic, mimo wszystko dzięki za wskazówkę. Będę szukał dalej jak to zrobić. Pozdrawiam smile.gif

cześć, wznawjając temat:

Pojawiła się odpowiedź, że jedną z opcji jest "przerobienie odpowiednich zmiennych w elementy tablicy $_POST/$_GET/$_REQUEST etc. "
Problem w tym, że nie wiem jak to ma wyglądać. Podpowie ktoś?

No i jeszcze kwestia SQL injection - czy zastosowanie addslashes wystarczy żeby się obronić?

nospor
nie
$zmienna
a
$zmienna = $_POST['zmienna'];
Tu żadnej filozofii nie ma
LeoMInor
Cytat(nospor @ 15.03.2012, 15:15:00 ) *
nie
$zmienna
a
$zmienna = $_POST['zmienna'];
Tu żadnej filozofii nie ma


ok, ale jeśli mam coś takiego
  1. if ($_GET["logout"]=="1") {unset($_SESSION["access"]);}


i wiadomość typu Notice: Undefined index: logout in /(...)admin.php on line 8

to ja mogę dać POSTa zamiast GETa?

lub tutaj:

  1. if ($ile=="1"){
  2. $_SESSION["access"]=1;
  3. }
  4.  
  5. if ($_SESSION["access"]=="1"){


tu z kolei jest błąd dla accessa.
jaslanin
to oznacza że element taki element tablicy nie został zainicjowany tj. nie została mu przypisana żadna wartość, najlepiej

zanim użyje się jakiejś zmiennej dobrze jest sprawdzać czy istnieje za pomocą isset:

Temat: PHP Notice Undefined index

możesz też wyłączyć tę informację:

  1. <?php error_reporting (E_ALL ^ E_NOTICE); ?>


ale lepiej tego nie robić bo taka informacja się przydaje przy debugowaniu
LeoMInor
Tylko, że jak dam issety to rzeczywiście giną te powiadomienia, ale formularz nie działa.
Bardziej chodziło mi o to co napisali @mat-bi i @nospor smile.gif
jaslanin
Tutaj ustawiłeś że formularz ma przesyłać dane metodą POST

  1. if (isset($p) && ($p == "e")) {
  2. $wynik = mysql_query("select * from menu where id='$id'");
  3. $w = mysql_fetch_row($wynik);
  4. echo "<FORM METHOD=\"post\" ACTION=\"admin.php\">";
  5. echo "<TEXTAREA NAME=\"tresc\">$w[2]</TEXTAREA><BR>";
  6. echo "<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"$w[0]\"><BR>";
  7. echo "<INPUT TYPE=\"submit\" VALUE=\"edytuj\">";
  8. echo "</FORM>";
  9. }


tutaj natomiast robisz coś takiego:

  1. if (isset($tresc) && ($tresc != "")) {
  2. echo "<BR>Zaktualizowano.";
  3. mysql_query("UPDATE menu SET tresc = '$tresc' where id = '$id'");
  4. }


w starym PHP była możliwość że dane przesyłane przez POST, GET itd. były od razu dostępne przez zwykłe zmienne, dlatego @mat-bi napisał o register_globals (to jest właśnie to)

jak widzisz nigdzie wcześniej w kodzie nie przypisałeś wartości do zmiennej $tresc, a skoro powyższa opcja którą opisałem jest wyłączona ze względów bezpieczeństwa Twój skrypt nie działa

żeby działał musisz go zmienić tak jak napisał @nospor, czyli dla przykładu:

  1. $tresc = $_POST['tresc'];
  2. if (isset($tresc) && ($tresc != "")) {
  3. echo "<BR>Zaktualizowano.";
  4. mysql_query("UPDATE menu SET tresc = '$tresc' where id = '$id'");
  5. }


Dodatkowo zamiast ciągle robić echo kodu HTML lepiej wielokrotnie zamykać blok kodu PHP, przykład:

  1. <div class="user_controls">
  2. <?php if ($user = Current_User::user()): ?>
  3. Hello, <em><?php echo $user->username; ?></em> <br/>
  4. <?php echo anchor('logout', 'Logout'); ?>
  5. <?php else: ?>
  6. <?php echo anchor('login','Login'); ?> |
  7. <?php echo anchor('signup', 'Register'); ?>
  8. <?php endif; ?>
  9. </div>
  10.  
  11. <h1>My Message Board</h1>
  12.  
  13. <?php foreach($categories as $category): ?>
  14.  
  15. <div class="category">
  16.  
  17. <h2><?php echo $category->title; ?></h2>
  18.  
  19. <?php foreach($category->Forums as $forum): ?>
  20.  
  21. <div class="forum">
  22.  
  23. <h3>
  24. <?php echo anchor('forums/'.$forum->id, $forum->title) ?>
  25. (<?php echo $forum->Threads->count(); ?> threads)
  26. </h3>
  27.  
  28. <div class="description">
  29. <?php echo $forum->description; ?>
  30. </div>
  31.  
  32. </div>
  33.  
  34. <?php endforeach; ?>
  35.  
  36. </div>
  37.  
  38. <?php endforeach; ?>
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.