Autor | Zpráva | ||
---|---|---|---|
Tomáš123 Profil |
#1 · Zasláno: 27. 11. 2015, 18:42:23
Ahoj diskusia, skúšam vymazávať z databázy nekompletné riadky. Najprv si vyberiem stĺpec, ktorý obsahuje cestu k súboru nahranému na server podľa stĺpcov, ktoré sú a nesmú byť prázdne:
$result = mysql_query("SELECT `mp3upload` FROM `mp3source` WHERE (`song_name` = '' OR `artist_name` = '')"); while ($row = mysql_fetch_assoc($result)) { echo $row['mp3upload']; //Pre test if(file_exists($row)) { if(!exec("rm .\$row")) { $not_erased_files[] = $row['mp3upload']; } } } To čo sa deje vo vnútri cyklu predpokladám tiež nie je úplne nezávadné, ale plánujem sa tomu venovať až po vyriešení tohoto problému. Pre lepšie pochopenie vkladám celý úsek kódu: $message = ""; $boolean = FALSE; if($_GET['action'] == "delete") { $result = mysql_query("SELECT `mp3upload` FROM `mp3source` WHERE (`song_name` = '' OR `artist_name` = '')"); if(!$result) { $message .= "Invalid query: " . mysql_error(); } else { while (($row = mysql_fetch_assoc($result)) !== FALSE) { echo $row['mp3upload']; if(file_exists($row)) { if(!exec("rm .\$row")) { $not_erased_files[] = $row['mp3upload']; } } } foreach($not_erased_files as $not_erased_file) { $files[] = "'".$not_erased_file."'"; } $sql = "DELETE FROM mp3source WHERE (`mp3upload` = '' OR `song_name` = '' OR `artist_name` = '')"; $sql .= (!empty($files) ? " AND `mp3upload` NOT IN (".implode(", ", $files).")" : ""); $boolean = mysql_query($sql); $message .= is_successful($boolean, mysql_affected_rows()); } } Vedeli by ste mi poradiť, čo spôsobuje, že sa neskočí do bloku cyklu? Ďakujem vopred za pomoc. |
||
Dan Charousek Profil |
#2 · Zasláno: 27. 11. 2015, 18:52:34
Tomáš123:
Zkus si manuálně (třeba v PHPMyAdmin) provést ten dotaz, jestli ti to vrátí nějaké výsledky. |
||
Tomáš123 Profil |
#3 · Zasláno: 27. 11. 2015, 19:09:41
Dan Charousek:
Áno, vráti to správne výsledky. Len pri spustení sa nevstúpi do cyklu, pole $files teda pochopiteľne býva prázdne a teda z celej tej časti sa prevedie len toto:
$sql = "DELETE FROM mp3source WHERE (`mp3upload` = '' OR `song_name` = '' OR `artist_name` = '')"; $boolean = mysql_query($sql); $message .= is_successful($boolean, mysql_affected_rows()); |
||
Monkeys Profil * |
#4 · Zasláno: 27. 11. 2015, 19:20:22
Tomáš123:
if(file_exists($row)) je spravna cesta ? |
||
Tomáš123 Profil |
Po upravení výrazu na
$row = mysql_fetch_array($result, MYSQL_BOTH) sa cyklus pohol a vypisuje testovací reťazec.
Monkeys: „je spravna cesta ?“ var_dump($row) vo vnútri cyklu vráti:
array(2) { [0]=> string(21) "uploaded/96299783.mp3" ["mp3upload"]=> string(21) "uploaded/96299783.mp3" } $row je výsledok iba Array . $row['mp3upload'] už funguje správne. Z "../{$row['mp3upload']}" ). Absolútna adresa ani adresa od koreňového adresára nefungujú tak, ako by som predpokladal. Teraz je problém v samotnom príkaze mazania. Všetky prvky poľa sa presunú do poľa položiek, ktoré nebolo možné vymazať. Nižšie ich skript pekne vypíše. Ešte zmienim, že tam už funguje aj adresa od koreňového adresára.
Predtým, než som prešiel na exec() som skúšal súbory mazať cez unlink() . Ten mi totiž nefungoval a starý kód mazal súbory práve tým, čo som skopíroval do výrazu podmienky (uvedené Skúšal som: unlink($row['mp3upload']); exec("rm .\$row['mp3upload']"); //Tu som skúsil predznačiť lomítko i obaliť premennú do zložených zátvoriek (kombinovane) Hmm, exec("rm .\\{$row['mp3upload']}") sa správa rovnako ako exec("rm .\$row['mp3upload']") . Avšak nerieši to môj problém. Predtým som asi niekde urobil chybu alebo nepočkal dosť dlho kým sa súbor nahral.
exec() vracia prázdny reťazec.
|
||
Kubo2 Profil |
Použi najlepšie
unlink(realpath("./{$row['mp3upload']}")) a hlavne si zapni výpis chýb alebo použi nejaký PHP nástroj na ich odchytávanie (Tracy, ...).
Na Linuxe ti cesta .\niečo nebude fungovať podľa očakávania a Windows zožere aj / .
|
||
Tomáš123 Profil |
Kubo2:
„Použi najlepšie unlink(realpath("./{$row['mp3upload']")) “
To mi akurát povyberalo dôležité časti z adresy... Zloženú zátvorku som pri skúšaní doplnil. Zdá sa mi, že som včera večer skúšal mazať aj relatívnu adresu, ktorou som splnil podmienku, teda: (unlink("../".$row['mp3upload'])) . Až dnes mi to zafungovalo. Neviem. Nižšie som nechal vypísať počet zmazaných súborov a všetko sedí. Mazanie z databázy správne reaguje na neexistenciu súboru a zdá sa správne odčítava aj súbory, ktoré nebolo možné vymazať. Chyby sa nevypisujú žiadne.
Problém som teda vyriešil. Ďakujem všetkým za pomoc. Čo mi nie je celkom jasné, prečo úprava výrazu v cykle na $row = mysql_fetch_array($result, MYSQL_BOTH) spôsobila splnenie podmienky?
|
||
Časová prodleva: 9 let
|
0