Autor Zpráva
Tomáš123
Profil
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` = '')");
Potom v cykle prechádzam výsledky a skúšam súbor vymazať zo zložky:
while ($row = mysql_fetch_assoc($result)) {
  echo $row['mp3upload']; //Pre test
  if(file_exists($row)) {
    if(!exec("rm .\$row")) {
      $not_erased_files[] = $row['mp3upload'];
    }
  }
}
Do cyklu sa ale vôbec nevstúpi a testovací reťazec sa nevypíše.

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
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
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());
Čo vráti správný výsledok. Zmaže to správny počet správnych riadkov.
Monkeys
Profil *
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"
}
Ale pri práci s $row je výsledok iba Array. $row['mp3upload'] už funguje správne. Z mne neznámeho dôvodu presmerovávania vyhovuje podmienke existencie súboru iba relatívna adresa ("../{$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é dole v kóde príspevku vyššie). Teraz, keď mi už fungujú všetky podmienky, potreboval by som ešte pomoc so samotným mazaním.
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)
Keďže výpis chýb je na serveri vypnutý, nič som nevidel. Skúsim to prestaviť...

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?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0