seta17
11.05.2010, 08:36:09
witam jestem poczatkujący w tematyce PHP i zabardzo nie wiem czemu mi nie działa funkcja do usuwania rekordu z bazy mysql. Różne rzeczy próbowałem zrobić ale ciągle ten sam błąd jest;/
Cytat
Warning: Unknown: failed to open stream: Brak dost�pu in Unknown on line 0
Fatal error: Unknown: Failed opening required '/opt/lampp/htdocs/strona/skrypty/usun.php' (include_path='.:/opt/lampp/lib/php') in Unknown on line 0
myślę że mam gdzieś błąd skłądni ale sam sobie poradzić nie mogę...
plik news.php
<?php
$zapytanie="select * from news";
$idu=$wypis['id'];
$tytul=$wypis['tytul'];
$zdjecie=$wypis['zdjecie'];
$tresc=$wypis['tresc'];
<div style="width:500px; height:150px; border:1px solid black;">
<div style="width:150px; height:150px; background:#444; border-right:1px solid black; float:left;"><img src="'; echo $zdjecie; echo '"/></div>
<div style="width:349px; height:150px; background:gold; float:left;">
<div style="width:349px; height:25px; border-bottom:1px solid black;">'; echo $tytul; echo '</div>
<div style="width:349px; height:124px;">'; echo $tresc; echo '</div>
</div>
</div>
<form action="usun.php" method="get">
<a href="skrypty/usun.php?id='; echo $idu; echo '"><button type="submit">usun</button></a> </form>
';}
?>
plik usun.php
<?php
$id=$_GET['id'];
include('polacz.php');
$query="DELETE FROM contacts WHERE id=$id";
?>
Ociu
11.05.2010, 08:38:41
seta17
11.05.2010, 09:16:25
no ten błąd aż taki prosty nie jest:P dalej problem nie rozwiązany i to samo wyskakuje...
mortus
11.05.2010, 10:17:43
Ten błąd jest banalny. Po pierwsze atrybut action formularza jest inny niż adres w odnośniku niżej (linie 44 i 45) i skrypt nie może znaleźć pliku usun.php. A po drugie albo usuwasz dane za pomocą odnośnika, albo za pomocą formularza. W tej chwili kod w liniach 44-46 włącznie nie ma w ogóle sensu.
teka
11.05.2010, 10:21:57
spróbuj w pliku usun.php w linii 2 zamiast:
$_POST wstawić
$_GET (linie 3-5 sa niepotrzebne)
oraz zamiast:
include(polacz.php);
wstawić:
jeśli zadziała, to masz problem z połączeniem do bazy MySQL w pliku polacz.php
mortus
11.05.2010, 10:25:49
Zauważyłem jeszcze jeden błąd. Formularz wysyłasz metodą get, a dane w pliku usun.php pobierasz z tablicy POST.
@teka Komunikat błędu wyraźnie wskazuje, co jest nie tak. Kolejnymi błędami należałoby się zająć później, bo w tej chwili skrypt nie ma prawa działać.
seta17
11.05.2010, 11:22:16
@teka polaczenie z baza jest na 100% sprawne bo tego pliku używam jeszcze w kilku miejscach
@mortus: to jak wg ciebie powinno wygladac odwolanie?
plik usun.php po modyfikacji w 1 poscie
plik news.php edycja 44-46 lini
<form action="skrypty/usun.php" method="get">
<a href="skrypty/usun.php?id='; echo $idu; echo '">
<button type="submit">usun</button></a>
</form>
mortus
11.05.2010, 11:36:33
Albo formularz (1), albo odnośnik (2).
Opcja 1
news.php - formularz
...
<form action="skrypty/usun.php" method="post">
<input type="hidden" name="id" value="
<?php echo $idu; ?>" /><br />
<input type="submit" value="Usuń" />
</form>
...
usun.php
// sprawdzamy, czy formularz został wysłany
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$id = $_POST['id'];
// usuwanie
}
Opcja 2
news.php - odnośnik
<a href="skrypty/usun.php?id=
<?php echo $idu; ?>">Usuń</a>
usun.php
if(isset($_GET['id']) && $_GET['id'] == '') { $id = $_GET['id'];
// usuwanie
}
Dodatkowo przy drugiej opcji warto byłoby zastosować formularz, poprzez który będziemy potwierdzać usuwanie danych. Np. zawierający dwa przyciski button TAK i NIE.
seta17
11.05.2010, 11:42:58
bede robil to przez formularz... blad nadal wystepuje... jedyne co sie zmienilo to sa polskie znaki:)
<?php
include('polacz.php');
if($_SERVER['REQUEST_METHOD'] == 'GET') {
$id = $_GET['id'];
$query="DELETE FROM news WHERE id=$id";
}
?>
mortus
11.05.2010, 13:03:27
Jeżeli przez formularz, to proponowałbym użyć jednak metody post. Plik z formularzem
<form action="skrypty/usun.php" method="post">
<input type="hidden" name="id" value="
<?php echo $idu; ?>" /><input type="submit" value="Usuń" />
</form>
i plik usun.php
<?php
include 'polacz.php';
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$id = $_POST['id'];
$query = "DELETE FROM news WHERE id=$id";
}
Ogólnie metodą post powinniśmy przesyłać informacje, które mają jakikolwiek wpływ na zmianę danych. Metoda get się do tego nie nadaje, ponieważ każdy mógłby usunąć obojętnie jaki wpis, podając jego id w adresie w przeglądarce. Polecam poczytać co nieco o sposobach przesyłania danych na stronach www. Jeżeli to nadal nie będzie działać, to napisz jaki konkretnie błąd występuje.
phpion
11.05.2010, 13:10:08
Cytat(mortus @ 11.05.2010, 14:03:27 )

Metoda get się do tego nie nadaje, ponieważ każdy mógłby usunąć obojętnie jaki wpis, podając jego id w adresie w przeglądarce. Polecam poczytać co nieco o sposobach przesyłania danych na stronach www.
Ty natomiast poczytaj o bezpieczeństwie aplikacji. Myślisz, że POST cię w jakikolwiek sposób przed tym zabezpieczy? W jednej chwili mogę FireBugiem podmienić wartość pola w formularzu i wyjdzie na to samo.
mortus
11.05.2010, 13:14:48
@phpion Wiem o tym, ale generalnie zaleca się przesyłane metodą post informacji, które mają jakikolwiek wpływ na dane, z których korzysta aplikacja.
phpion
11.05.2010, 13:17:50
Kto tak zaleca? Jak dla mnie usuwanie rekordów za pomocą formularza i metody POST to bezsensowny pomysł - stosuję zwykły link z identyfikatorem rekordu do usunięcia. Co innego formularz zapisu danych w bazie - tam przesyłam dużo informacji więc wygodniej jest użyć POSTa.
nospor
11.05.2010, 13:18:03
@mortus ale napisales to tak, ze zabrzmialo jakby POST byl super bezpieczny a GET jest zły. A pierwszy lepszy "hakier" "złamie" tego POSTA.
Ja tam IDiki też przesyłam GETem. Post sluzy w wiekszosci wypadków to większej liczby danych a nie do głupiego IDka przy usuwaniu rekordu.
To po stronie serwera (php) masz napisac zabezpieczenie by user mogl usunac tylko to co moze. POST czy GET nie ma w tym przypadku nic do gadania
thek
11.05.2010, 13:19:16
@mortus: phpion ma rację. Jedyne co możesz robić to sprawdzać uprawnienia po stronie serwera do wykonania określonych akcji. Sam jakiś czas temu przesadziłem z tym do tego stopnia, że tylko user-właściciel mógł swoje dane modyfikowac. Musiałem pisać "furtkę" by także admin miał to prawo, bo skrypt nawet usera z prawami admina blokował wypisując: "Nie masz uprawnień do tej operacji"
phpion
11.05.2010, 13:23:29
Dobry mechanizm ACL to podstawa

my w pracy mamy akurat dość sprytne ustrojstwo do kontrolowania dostępu do akcji (kontroler + akcja) oraz pól w formularzu (blokowanie pola + dodatkowa kontrola w momencie zapisu danych do bazy gdyby ktoś sobie spryciarsko odblokował pole

). I tak jak pisze ~nospor: metoda POST/GET nie ma tu żadnego znaczenia.
mortus
11.05.2010, 13:24:34
Ale ja nie mówię, że ktoś nie ma racji. Sam osobiście użyłbym odnośnika z id rekordu do usunięcia, kolega wybrał sposób z formularzem, więc tylko metodę post poleciłem, choć oczywiście nie jest ona bezpieczna, podobnie jak i get. W obu przypadkach należy odpowiednie zabezpieczenie zaimplementować.
phpion
11.05.2010, 13:27:11
Cytat(mortus @ 11.05.2010, 14:24:34 )

Sam osobiście użyłbym odnośnika z id rekordu do usunięcia, kolega wybrał sposób z formularzem, więc tylko metodę post poleciłem
A czym by się różnił formularz wysyłany metodą GET od zwykłego id przekazanego w linku?
mortus
11.05.2010, 13:33:56
Tylko długością kodu HTML i PHP. Poza tym niczym, ale w temacie nie chodzi o różnice pomiędzy odnośnikiem, a formularzem przesyłanym metodą get.
Zresztą napisałem koledze, że można tak i tak, ale nie równocześnie, bo to bez sensu. O tym jaką metodą prześle formularz i jak zabezpieczy swój skrypt zadecyduje on sam.
seta17
11.05.2010, 16:42:36
no wiec teraz chyba trzeba odbiec od błędów w moim kodzie a skupić się na wyrzucanym błędzie, gdyż mój pierwszy kod do usuwania odpaliłem w domu i zadziałał bez problemu wiec to co jest innego... tam gdzie robię tą stronę jest linux (CentOS) oraz XAMPP... w domu pracuje na win7 oraz wampserv na przemian z xampp'em
@edit
co do zabezpieczeń to bym chciał zrobić coś takiego że przed wykonaniem zapytania SQL będzie trzeba podać hasło oraz login, ale tym zajmę się później... jeżeli da się coś takiego zrobić.
@edit2:
użyłem teraz plików w pracy z domu i działają, więc nie wiem w czym był problem... więc zostaje kod pliku o taki:
plik usun.php
<?php
include("polacz.php");
include("polecenia.php");
$idu=$_GET['id'];
$query="DELETE FROM news WHERE id='$idu'";
echo "<br><A href='../index.php'>wróć</a>"; ?>
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.