ugrás a tartalomhoz

Törlés adatbázisból és fájl törlés php-vel, hiba...

Mycro · 2009. Dec. 1. (K), 10.58
Sziasztok, problémám az hogy nem tudok, "egyszerre" adatbázisból törölni, és fájlt törölni. Az űrlapból megkapja a szükséges értéket (GET-el adom át az $id-t (pt)).
Vagy törölni tudom a fájlt, vagy adatbázisból tudok adatot törölni. A kérdés:
Hogy kapcsoljam össze a kettőt, hogy működjön?

Itt a legutóbbi próbálkozásom:
(Ha teljesül a fájltörlés, törölnie kéne adatbázisból, de az nem megy neki, pedig $id még megvan...).
ad_motor.php
	include ('mysql.php');

function torles_partner () {
	if(isset($_GET["pt"])) {
		$id = $_GET["pt"];
		$sql = "SELECT logo FROM hivatkozasok WHERE id='$id' ";
		$select = mysql_query($sql);
		while ($sor = mysql_fetch_array($select)) {
		$logo = $sor["logo"];	}
		$torol = unlink ("../elemek/h_belyeg/".$logo."");
		if ($torol) {
		$sql = "DELETE * FROM hivatkozasok WHERE id='$id' ";
		$tor = mysql_query($sql);
		echo "<center><span class='nev'>Az törlés sikeres volt!</span></center>";
		} else {
		echo "<center><span class='nev'>Sikertelen törlés!</span></center>";
	} } }
 
1

Relatív útvonalak és egyéb hibák

vbence · 2009. Dec. 1. (K), 11.23
Relatív útvonalat sosem célszerű használni ("../elemek/h_belyeg/".$logo). A rekordot csak akkor törtlöd ha a fájl is sikeresen törölve lett. Lehet, hogy már kellőképpen összeavartad a tesztadatokat, hogy a fájl már nem létezik, de a rekord még igen (írtad, hogy külön-külön próbálgattad őket).

Más:
$sql = "DELETE * FROM hivatkozasok WHERE id='$id' ";
Ez az SQL injection melegágya...

A mysql_xxx függvényeket nem szokás direktben hívogatni. Készíts egy saját wrapper osztályt az adatbázis absztrakcióra.
2

?!

Mycro · 2009. Dec. 1. (K), 11.58
Köszi, a biztonsági problémákkal kapcsolatban még kicsit tapasztalatlan vagyok (bár ez az egész védve lesz, mert csak admin felületről lesz elérhető).

Az a helyzet, hogy a képet (amit törölni akarok), mindig visszamásoltam, máskülönben kiadja, hogy nem sikerült a törlés nincs meg a kép...
Azt nem írtam (sorry), hogy ennél a megoldásnál, is törli a képet, csak az adatbázisban, nem törli a rekordot, de kiírja, hogy "Sikeres törlés!".
Most jutott eszembe, hogy oda is kell raknom, egy ellenőrzést, hogy rekord törlés megtörtént-e.

Még valami; miért ne használjak relatív útvonalat??
Nem szoktam abszolút útvonalcímet használni.. (Bocs, ha arra gondoltál, hogy tároljam le változóban törlés előtt az útvonalat.)
3

Útvonal

vbence · 2009. Dec. 1. (K), 12.14
Ne feltételezd, hogy az aktuáls könyvtár az a könyvtár lesz ahol a PHP fájlod található. Így a kódod működésképtelen lesz ha más könyvtárba helyezed, vagy időközben valamelyik függvényedben könyvtárat váltasz. Használhatsz mondjuk a $_SERVER["DOCUMENT_ROOT"] -hoz képesti útvonalakat.

Nem ellenőrzöd, hogy a MYSQL milyen hibát ad (ha ad) vissza törlésnél, próbáld:

$tor = mysql_query($sql);
if (!$tor)
    echo ('Mysql error ' . $mysql_errno () . ': ' . $mysql_error ());
... ha wrapper funkciót használnál akkor ott elég lenne egy helyen megoldanod az ilyen dolgokat, mint hibajelzés.
4

delete from

atxatx · 2009. Dec. 1. (K), 15.17
Sztem a delete után nem kell a csillag:
   $sql = "DELETE FROM hivatkozasok WHERE id='$id' ";  
Mellesleg a $id -t kicsit még "gyomláld" mielőtt beteszed az sql kifejezésbe.
5

THX!

Mycro · 2009. Dec. 2. (Sze), 16.39
Köszi, már kiderült otthon, tényleg az a hiba, hogy törlésnél nem kell *. Azóta találtam új problémát magamnak...

Köszönöm a segítséget mindenkinek! :-D