Lucky Luke
4.03.2011, 15:13:05
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:
<?
require("config.php");
include("conf/config_main_options.php");
include("db_connect.php");
polacz_z_baza();
$idnum=$row['idnum'];
$id_get=$_GET['idnum'];
$zap = mysql_query("SELECT * FROM baza WHERE idnum='$id_get'");
echo '<div id="content">'; <TABLE BORDER=0 WIDTH=750 bgcolor=#FFFFFF cellspacing=1 cellpadding=1>
<tr>
<td colspan=2 width=700 bgcolor=#FFD47F><center>
<font FACE=ARIAL COLOR=000000 size=3 align=center> <b>Usunięcie ogłoszenia:</b></font></center>
</td>
</tr>
</table>
<TABLE BORDER=0 WIDTH=750 bgcolor=#FFFFFF cellspacing=1 cellpadding=1>
<tr>
<td colspan=2 width=700 bgcolor=#EBEBEB><center>
<font FACE=ARIAL COLOR=000000 size=3><b>Uwaga!</b></font>
<font FACE=ARIAL COLOR=000000 size=2>Proces usuwania ogłoszenie został rozpoczęty. Podaj hasło do ogłoszenia.</font>
</center>
</td>
</tr>
</table>
<TABLE BORDER=0 WIDTH=750 bgcolor=#EBEBEB cellspacing=1 cellpadding=1>
<TR>
<TD align=right width=50% height=25>
<form action="delete_ads_form.php" method="post" name="usun_ogl">
<font FACE=ARIAL COLOR=#000000 size=2> <b>Numer #ID ogłoszenia:</b> </font>
</td>
<td align=left width=50%>
<input type="text" name="delete_id" value="'.$id_get.'" size="10" class="formst">
</td>
</tr>
<TR>
<TD align=right width=50% height=25>
<font FACE=ARIAL COLOR=#000000 size=2> <b>Hasło:</b>
</td>
<td align=left width=50%>
<input type="password" name="passw" size="10" class="formst">
</td>
</tr>
</table>
<TABLE BORDER=0 WIDTH=750 bgcolor=#FFFFFF cellspacing=1 cellpadding=1>
<TR>
<TD align=center width=100% height=25>
<input type="submit" value="Dalej !" class="formst" STYLE="FONT-WEIGHT: bold;"></form>
</td>
</tr>
</table>
';
?>
2. Strona pyta czy napewno usunąć rekord
<?
require("config.php");
include("conf/config_main_options.php");
include("db_connect.php");
polacz_z_baza();
$idnum=$row['idnum'];
$id_get=$_GET['idnum'];
$zap = mysql_query("SELECT * FROM baza WHERE idnum Like '%".$_POST['delete_id']."%'");
$idnum = $rek[0];
$title = $rek[11];
$passw = $rek[23];
}
echo '<div id="content">';
if($passw === $_POST['passw']){
<form action="delete_ads.php" method="post" name="usun_ogl">
<TABLE BORDER=0 WIDTH=750 bgcolor=#FFFFFF cellspacing=1 cellpadding=1>
<tr>
<td colspan=2 width=700 bgcolor=#EBEBEB><center>
<font FACE=ARIAL COLOR=990033 size=3><b>Uwaga!</b></font><br>
<font FACE=ARIAL COLOR=000000 size=2>To jest ostatni etap usuwania ogłoszenia.<br>
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>?
</font><br><br>
<p align="center">
<input type="submit" value="Tak!" class=formst STYLE="FONT-WEIGHT: bold; width: 150px;">
<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>
</form>
</center>
</td>
</tr>
</table>
';
}else
<br>
<font FACE="ARIAL" COLOR="#c90000" size="3"><b>Podałeś złe hasło</b></font><br>
<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>
<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>
';
?>
3. Wykonanie kasowania rekordu
<?
include("conf/config_main_options.php");
include("db_connect.php");
$id = $_POST['idnum'];
polacz_z_baza();
$idnum=$row['idnum'];
if (!isset($_POST['submit'])) { $zap = @mysql_query("DELETE FROM baza WHERE idnum Like '%".$_POST['delete_id']."%' LIMIT 1");
if($zap) {
<div id=content>
<table width=750 bgcolor=#FFFFFF border=0 cellspacing=0 cellpadding=0>
<TR>
<td width=750>
<center>
<br>
<p>
<b>
<font FACE=ARIAL COLOR=#aa0000 size=-1><META HTTP-EQUIV='Refresh' CONTENT='3; URL=index.php'>Ogłoszenie usunięte. </font> </b>
<br><br>
<font FACE=ARIAL COLOR=#000000 size=-1> <b>Dziękujemy za korzystanie z naszego serwisu. Zapraszamy do wystawienia nowej oferty!</b> </font>
</center>
<p>
</td></TR>
</table> </div>
";}
else
}
?>
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
Lucky Luke
4.03.2011, 15:34:36
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
4.03.2011, 15:56:53
A to, że nie kasujesz rekordu z danym id, ale z id podobnym do tego. Na przykład id 1 i 111
modern-web
4.03.2011, 16:24:04
Pamiętaj, że znak % oznacza
dowolny ciąg znaków. Jeśli zatem masz id
1 to jest to rozpoznawane tak samo jak:
1112
5
13
83
12
192
731
186
146
itd...
Chyba wiesz co powinieneś w tym przypadku zrobić

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
4.03.2011, 17:11:43
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
4.03.2011, 17:26:10
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
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:
if (isset($_POST['submit']) && isset($_POST['delete_id'])) {
4. przekonamy się czy delete_id przekazywane jest do 3 pliku...

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
4.03.2011, 18:11:10
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:
if (isset($_POST['submit']) && isset($_POST['delete_id'])) {
4. przekonamy się czy delete_id przekazywane jest do 3 pliku...

no niestety nic to nie daje

. Jest jakaś szansa, żeby to delete_id przekazać do 3 pliku?
modern-web
4.03.2011, 18:29:18
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

Jeśli nie wiesz jak zrobić takie pole to www.google.pl
ciekawskiii
4.03.2011, 18:32:17
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
4.03.2011, 18:41:50
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
4.03.2011, 18:47:10
Musi działać... Więc powiedz na czym teraz stoimy

Nadal problem z identyfikatorami? Kasują się wszystkie, tak?
ciekawskiii
4.03.2011, 18:51:19
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
4.03.2011, 18:52:48
Cytat(modern-web @ 4.03.2011, 18:47:10 )

Musi działać... Więc powiedz na czym teraz stoimy

Nadal problem z identyfikatorami? Kasują się wszystkie, tak?
Teraz wygląda, że działa tak jak zaplanowałem

, 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
4.03.2011, 18:58:48
@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

Pozdrawiam!
ciekawskiii
4.03.2011, 19:13:53
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
4.03.2011, 19:17:45
ok dzięki
modern-web
4.03.2011, 19:31:24
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

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.