Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP][MySQL]kasowanie rekordu wg id
Forum PHP.pl > Forum > Przedszkole
Lucky Luke
Witam. Robię taki drobny skrypt ogłoszeń, dodałem kilka rzeczy i pojawił mi się problem z usuwaniem rekordów. Mianowicie każdy rekord w bazie ma inne id (u mnie: idnum) i dodatkowo w każdym rekordzie jest ustawione hasło. Gdy chcę usunąć konkretny rekord z np. id 50 i podaję poprawne hasło to usuwa zupełnie inny rekord niż ten wybrany z id 50 i z innym hasłem. Nie wiem gdzie tkwi problem. Proszę o podpowiedzi. Niżej kody 3 plików.

1. strona z numerem id który ma być skasowany i pytaniem o hasło:
  1. <?
  2. require("config.php");
  3. include("conf/config_main_options.php");
  4. include("db_connect.php");
  5. polacz_z_baza();
  6.  
  7. $idnum=$row['idnum'];
  8. $id_get=$_GET['idnum'];
  9.  
  10. $id_get = mysql_escape_string($id_get);
  11. $zap = mysql_query("SELECT * FROM baza WHERE idnum='$id_get'");
  12.  
  13. echo $html_naglowek;
  14. echo '<div id="content">';
  15. <TABLE BORDER=0 WIDTH=750 bgcolor=#FFFFFF cellspacing=1 cellpadding=1>
  16. <tr>
  17. <td colspan=2 width=700 bgcolor=#FFD47F><center>
  18. <font FACE=ARIAL COLOR=000000 size=3 align=center>&nbsp; <b>Usunięcie ogłoszenia:</b></font></center>
  19. </td>
  20. </tr>
  21. </table>
  22. <TABLE BORDER=0 WIDTH=750 bgcolor=#FFFFFF cellspacing=1 cellpadding=1>
  23. <tr>
  24. <td colspan=2 width=700 bgcolor=#EBEBEB><center>
  25. <font FACE=ARIAL COLOR=000000 size=3><b>Uwaga!</b></font>
  26. <font FACE=ARIAL COLOR=000000 size=2>Proces usuwania ogłoszenie został rozpoczęty. Podaj hasło do ogłoszenia.</font>
  27. </center>
  28. </td>
  29. </tr>
  30. </table>
  31. <TABLE BORDER=0 WIDTH=750 bgcolor=#EBEBEB cellspacing=1 cellpadding=1>
  32. <TR>
  33. <TD align=right width=50% height=25>
  34. <form action="delete_ads_form.php" method="post" name="usun_ogl">
  35. <font FACE=ARIAL COLOR=#000000 size=2>&nbsp;<b>Numer #ID ogłoszenia:</b>&nbsp;</font>
  36. </td>
  37. <td align=left width=50%>
  38. <input type="text" name="delete_id" value="'.$id_get.'" size="10" class="formst">
  39. </td>
  40. </tr>
  41. <TR>
  42. <TD align=right width=50% height=25>
  43. <font FACE=ARIAL COLOR=#000000 size=2>&nbsp;<b>Hasło:</b>&nbsp;
  44. </td>
  45. <td align=left width=50%>
  46. <input type="password" name="passw" size="10" class="formst">
  47. </td>
  48. </tr>
  49. </table>
  50. <TABLE BORDER=0 WIDTH=750 bgcolor=#FFFFFF cellspacing=1 cellpadding=1>
  51. <TR>
  52. <TD align=center width=100% height=25>
  53. <input type="submit" value="Dalej !" class="formst" STYLE="FONT-WEIGHT: bold;"></form>
  54. </td>
  55. </tr>
  56. </table>
  57. ';
  58. echo '</div>';
  59. echo $html_stopka;
  60. ?>


2. Strona pyta czy napewno usunąć rekord
  1. <?
  2. require("config.php");
  3. include("conf/config_main_options.php");
  4.  
  5. include("db_connect.php");
  6.  
  7. polacz_z_baza();
  8.  
  9. $idnum=$row['idnum'];
  10. $id_get=$_GET['idnum'];
  11.  
  12. $id_get = mysql_escape_string($id_get);
  13. $zap = mysql_query("SELECT * FROM baza WHERE idnum Like '%".$_POST['delete_id']."%'");
  14. while($rek = mysql_fetch_array($zap)) {
  15.  
  16. $idnum = $rek[0];
  17. $title = $rek[11];
  18. $passw = $rek[23];
  19. }
  20. echo $html_naglowek;
  21. echo '<div id="content">';
  22.  
  23. if($passw === $_POST['passw']){
  24. <form action="delete_ads.php" method="post" name="usun_ogl">
  25.  
  26. <TABLE BORDER=0 WIDTH=750 bgcolor=#FFFFFF cellspacing=1 cellpadding=1>
  27. <tr>
  28. <td colspan=2 width=700 bgcolor=#EBEBEB><center>
  29. <font FACE=ARIAL COLOR=990033 size=3><b>Uwaga!</b></font><br>
  30. <font FACE=ARIAL COLOR=000000 size=2>To jest ostatni etap usuwania ogłoszenia.<br>
  31. Jesteś pewny, że chcesz usunąć ogłoszenie: <font FACE=ARIAL COLOR=990033 size=2><b>'.$title.'</b></font> które ma ID: <font FACE=ARIAL COLOR=990033 size=2><b>#'.$idnum.'</b> </font>?
  32. </font><br><br>
  33. <p align="center">
  34. <input type="submit" value="Tak!" class=formst STYLE="FONT-WEIGHT: bold; width: 150px;">
  35. <input type="button" name="backButton" id="backButton" value="Nie" onclick="java script:history.go(-2)" class=formst STYLE="FONT-WEIGHT: bold; width: 150px;"></p><br>
  36. </form>
  37. </center>
  38. </td>
  39. </tr>
  40. </table>
  41. ';
  42. }else
  43. <br>
  44. <font FACE="ARIAL" COLOR="#c90000" size="3"><b>Podałeś złe hasło</b></font><br>
  45. <font FACE="ARIAL" COLOR="#000000" size="2">Kliknij <a href="java script:history.back()"><b> wstecz </b></a> i podaj poprawne hasło dla ogłoszenia.</font><br>
  46. <font FACE="ARIAL" COLOR="#c90000" size="1"><b>Jesli napotkales jakies problemy prosimy o <a href="contact.php"> kontakt</a> z administratorem.</b></font><br>
  47. ';
  48. echo '</div>';
  49. echo $html_stopka;
  50. ?>


3. Wykonanie kasowania rekordu

  1. <?
  2. include("conf/config_main_options.php");
  3. include("db_connect.php");
  4. $id = $_POST['idnum'];
  5.  
  6. polacz_z_baza();
  7.  
  8. $idnum=$row['idnum'];
  9. if (!isset($_POST['submit'])) {
  10. $zap = @mysql_query("DELETE FROM baza WHERE idnum Like '%".$_POST['delete_id']."%' LIMIT 1");
  11.  
  12. if($zap) {
  13. echo $html_naglowek;
  14. <div id=content>
  15. <table width=750 bgcolor=#FFFFFF border=0 cellspacing=0 cellpadding=0>
  16. <TR>
  17. <td width=750>
  18. <center>
  19. <br>
  20. <p>
  21. <b>
  22. <font FACE=ARIAL COLOR=#aa0000 size=-1><META HTTP-EQUIV='Refresh' CONTENT='3; URL=index.php'>Ogłoszenie usunięte. </font> </b>
  23. <br><br>
  24. <font FACE=ARIAL COLOR=#000000 size=-1> <b>Dziękujemy za korzystanie z naszego serwisu. Zapraszamy do wystawienia nowej oferty!</b> </font>
  25. </center>
  26. <p>
  27. </td></TR>
  28. </table> </div>
  29. ";}
  30. else
  31. echo 'nie usuniete';
  32.  
  33. echo $html_stopka;
  34. }
  35. ?>
ciekawskiii
A po co tam like przy usuwaniu? Po drugie skad bierzesz $_POST['delete_id']; ? Z pierwszego formularza a w drugim to juz nie istnieje
Lucky Luke
Cytat(ciekawskiii @ 4.03.2011, 15:25:57 ) *
A po co tam like przy usuwaniu? Po drugie skad bierzesz $_POST['delete_id']; ? Z pierwszego formularza a w drugim to juz nie istnieje



<input type="text" name="delete_id" value="'.$id_get.'" size="10" class="formst">


WHERE idnum Like '%".$_POST['delete_id']."%'

żeby wiedział co kasować. Czy to jest źle zrobione?
mat-bi
A to, że nie kasujesz rekordu z danym id, ale z id podobnym do tego. Na przykład id 1 i 111
modern-web
Pamiętaj, że znak % oznacza dowolny ciąg znaków. Jeśli zatem masz id 1 to jest to rozpoznawane tak samo jak:
1
112
513
831
2192
7311
86146
itd...

Chyba wiesz co powinieneś w tym przypadku zrobić smile.gif
Lecz wciąż nie mam pewności co do tego błędu. Nie wydaje mi się by był on spowodowany złym zapisem w WHERE bo pewnie tak to właśnie ma wyglądać.
LIMIT powinien ograniczyć kasowane rekordy ;/ a w Twoim wypadku tak się nie dzieje. Cóż... pokombinuj i daj nam więcej wskazówek bo szczerze mówiąc nie mam dziś nastroju do analizowania wszystkich fragmentów kodu w poszukiwaniu błędu logicznego.
Lucky Luke
Faktycznie co do % to wiem, że zastępuje dowolny ciąg znaków, ale to wygląda tak, że chcę usunąć id 50 a kasuje mi id 38 albo jakiś inny gdzie nie ma tych cyfer np 38. Już sprawdziłem, kiedy pominę ten plik z pytanie o potwierdzenie to usuwa rekordy z takim id jakie sobie wybiorę. Ale muszę zastosować jakieś pytanie o potwierdzenie.
ciekawskiii
Bo Ci tlumacze, ze w trzecim pliku juz $_POST['id_delete'] nie istnieje, przenosisz to z pierwszego formularza do drugiego tylko. (albo ja slepy jestem). Poczytaj o $_POST bo chyba nie wiesz jak to dziala
modern-web
Sprawdź to w prosty sposób by potwierdzić tezę ciekawskiii:

1. 3 plik
2. 9 wers
3. zastąp to takim kodem:

  1. if (isset($_POST['submit']) && isset($_POST['delete_id'])) {


4. przekonamy się czy delete_id przekazywane jest do 3 pliku... wink.gif

P.S.
Chyba miałeś błąd w tej linijce bo napisałeś !isset czyli na to wychodzi, że po wciśnięciu klawisza ta instrukcja nie powinna być wykonywana... no ale i tak klawisz w 2 pliku powinien mieć name="submit"...

Masz pełno podstawowych błędów no ale jak już mówiłem, nie chcę tego wszystkiego przeglądać pod tym kątem.
Lucky Luke
Cytat(modern-web @ 4.03.2011, 17:53:50 ) *
Sprawdź to w prosty sposób by potwierdzić tezę ciekawskiii:

1. 3 plik
2. 9 wers
3. zastąp to takim kodem:

  1. if (isset($_POST['submit']) && isset($_POST['delete_id'])) {


4. przekonamy się czy delete_id przekazywane jest do 3 pliku... wink.gif


no niestety nic to nie daje sad.gif. Jest jakaś szansa, żeby to delete_id przekazać do 3 pliku?
modern-web
No raczej... Najprościej dodaj do formularza znajdującego się na stronie 2 pole <input> z atrybutem hidden i name="delete_id" a następnie wczytaj do niego wartość delete_id otrzymaną z strony 1 (pole będzie niewidoczne ale wartość delete_id zostanie przekazana z całym formularzem do strony 3). Nic prostszego smile.gif Jeśli nie wiesz jak zrobić takie pole to www.google.pl tongue.gif
ciekawskiii
Mozesz w ukrytym hidden, w sesji albo w get, w sumie jakiegos id w get tam masz wiec to chyba to id? Troche sie w tym gubie
Lucky Luke
Dokładnie właśnie z tym nowym polem <input> zacząłem kombinować ale zamiast hidden miałem button i z tym nie działało a z hidden wygląda że działa dobrze.
modern-web
Musi działać... Więc powiedz na czym teraz stoimy smile.gif
Nadal problem z identyfikatorami? Kasują się wszystkie, tak?
ciekawskiii
Nastepnym razem wystarczy sobie wyswietlic wszystkie zmienne przed zapytaniem i zobaczyc czy w ogole sa, echo nie jest trudne a w ten sposob nauczysz sie wyszukiwac takie bledy samemu;)
Lucky Luke
Cytat(modern-web @ 4.03.2011, 18:47:10 ) *
Musi działać... Więc powiedz na czym teraz stoimy smile.gif
Nadal problem z identyfikatorami? Kasują się wszystkie, tak?


Teraz wygląda, że działa tak jak zaplanowałem smile.gif, czyli kasuje rekordy re które sobie wybiorę ze sprawdzaniem hasła, oczywiście dzięki Waszej pomocy.

Podpowiedzcie mi jeszcze tak poza tym tematem czy są jakieśprogramy które sprawdzą mi kod który piszę? Jestem raczej samoukiem staram się robić wiele sam ale czasem korzystam z poradników i różnych książek ale zapewne jet w tym sporo jakichś błędów i przydało by się jakieś narzędzie które może to sprawdzić.
modern-web
@ciekawskiii To życzę powodzenia w wyświetlaniu zmiennych w bardziej skomplikowanych skryptach o długościach 500 linijek... echo na wiele się nie zda; lepiej chwilę posiedzieć i logicznie pomyśleć; przeanalizować cały system i szukać błędu `logicznego`.

@Lucky Luke Nie ma programu, który sprawdzi Tobie skrypt pod kątem `logicznym`. Są różne techniki programowania i zawsze najlepiej robić skrypt jak najkrótsze, najszybsze i najbardziej czytelne... Programy typu Adobe Dreamweaver/CoreEditor lub inne tego typu z kolorowaniem składni pokażą Ci błędy w strukturze. To Ty sam musisz nauczyć się dobrych praktyk. Z czasem sam wszystko zrozumiesz wink.gif

Pozdrawiam!
ciekawskiii
Modern, zawsze tak robie, tak sie sam uczylem i jakos sobie radze z takimi rzeczami a tym bardziej polecam to poczatkujacym bo mozna szybko odnalezc w czym jest problem i wlasnie zmusza do przeanalizowania i do logicznego myslenia. Moze nie zawsze zda to egzamin ale w takich przypadkach tak bo gdyby sobie to wyswietlil w 3 pliku to juz by wiedzial ze id nieistnieje. P.s. Lucky Luke, poczytaj tez o zabezpieczeniach...
Lucky Luke
ok dzięki smile.gif
modern-web
I na wstępnie dodam, że nie sugeruj się stripslashes i addslashes przy zabezpieczeniach gdyż nie do tego te 2 funkcje służą. Mają swój odpowiednik: mysql_real_escape_string .
Najważniejsze jest i tak filtrowanie danych. Sprawdzaj je pod wieloma kątami... Poczytaj o SQL Injection/Insertion i innych atakach za pośrednictwem MySQL. Traktuj każdego odwiedzającego jak nieprzyjaciela smile.gif nigdy nie wiesz jakie ma zamiary wobec Twojego systemu.
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.