Avatar billede Morten Professor
28. april 2015 - 13:45 Der er 8 kommentarer og
1 løsning

Unlink flere billeder på engang

Hej

Jeg har et problem med at unlink flere billeder på engang.
Da jeg skal skal slette dem der er over 7 dage gamle.

Men kan vare ikke få det til at virker.

Har en kode her jeg prøver at lege med:

$deleteSQL = sprintf("SELECT FROM billeder billednavn WHERE DATE(dato) < DATE(DATE_SUB( NOW(), INTERVAL 7 DAY) ) and dato >'00:00:00'; ");
  $deleteSQL = sprintf("DELETE FROM billeder WHERE DATE(dato) < DATE(DATE_SUB( NOW(), INTERVAL 7 DAY) ) and dato >'00:00:00'; ");
  unlink("../Uploads/".$row_rsDelete['billednavn']);
Avatar billede jakobdo Ekspert
28. april 2015 - 14:09 #1
Nu vil jeg ikke kode din løsning.
Men det du skal gøre er følgende:

Lav dit UDTRÆK (SELECT....)

Loop dette udtræk igennem.
Så har du billeder/billednavn.

I det loop kan du så lave:

# Slet billede i filsystem
unlink(....)

# Slet billede i db.
DELETE FROM billeder WHERE billednavn = billednavn fra udtræk...

Alternativt kan du gøre:

UDTRÆK BILLEDER
LOOP BILLEDER
UNLINK

Efter alt er slettet, kør DELETE som du har nu.
Avatar billede Morten Professor
28. april 2015 - 14:39 #2
Hvordan looper jeg, jeg har prøvet før men det virkede ikke.
Avatar billede jakobdo Ekspert
28. april 2015 - 14:52 #3
$sql = "SELECT FROM billeder billednavn WHERE DATE(dato) < DATE(DATE_SUB( NOW(), INTERVAL 7 DAY) ) and dato > '00:00:00';";
if ($result = $mysqli->query($sql)) {
  while($obj = $result->fetch_object()){
    echo "Sletter filen: " . $obj->billednavn;
    unlink("../Uploads/".$obj->billednavn);
  }
}

$sql = "DELETE FROM billeder WHERE DATE(dato) < DATE(DATE_SUB( NOW(), INTERVAL 7 DAY) ) and dato >'00:00:00';";
if ($result = $mysqli->query($sql)) {
  echo "Alt er slettet i DB";
}
$result->close();
Avatar billede olsensweb.dk Ekspert
28. april 2015 - 15:57 #4
som du sikkert så i http://www.eksperten.dk/spm/1003314 #25 skrev jeg Pseudocode.
dvs det skal oversættes til php og mysqli.

hvis vi tager udgangs punkt i jakobdo code i #3 og skriver den procedural style som du normalt gør, vil den se sådan ud:

(utested)

$sql = "SELECT billedid, billednavn FROM billeder WHERE DATE(dato) < DATE(DATE_SUB( NOW(), INTERVAL 7 DAY) ) and dato >'00:00:00";
if ($result = mysqli_query($hellestrik, $sql)) {
  while($row = mysqli_fetch_assoc($result)  ){   
   
    // testere om filen findes
    if(file_exists("Uploads/".$row['billednavn'])) {
        echo "Sletter filen: " . $row['billednavn']. "<br>";
        // den findes, vi sletter
        unlink("Uploads/".$row['billednavn'];
    }
    else{
        echo "filen "."Uploads/".$row['billednavn']." findes ikke <br>";
    }
   
    // ligger normalt i en function
    // sletter referancen fra databasen
    $sql1 = "DELETE FROM billeder WHERE billedid = $row['billedid']";
    mysqli_query($hellestrik, $sql1);
   
  }
}


man kan også som jakobdo's code i #3 er inde på først slette filerne, og dernæst slette i databasen, hvilke er færrer query's, hvilke giver bedre performance
Avatar billede Morten Professor
28. april 2015 - 16:46 #5
Hej jakobdo og ronols

ronols din virkede upåklageligt, super skøn. Tak for det.

Er glad for i begge kom med noget, som jeg kunne arbejde mig ud efter.
Så nu virker det bare super.

ronols vil du give et svar så du kan få point.
Men når i nu har arbejdet så godt sammen, vil jeg gerne dele point.
Hvad siger du til det ronols?

Med venlig hilsen
Morten
Avatar billede olsensweb.dk Ekspert
28. april 2015 - 16:51 #6
får du her
>Hvad siger du til det ronols
fint med mig
Avatar billede olsensweb.dk Ekspert
04. maj 2015 - 21:30 #7
@morticms
en næsten en til en omskrivning af jakobdo code fra #3, så du har den i OOP og Procedural style, jeg har valgt at anvende  fetch_assoc() istedet for fetch_object() da jeg tror fetch_assoc() er nemmere for dig lige pt, samt anvendt det connection navn du anvender.
hvis du opbygger det som functioner, er du ikke så meget bundet af dine variabel navne, og vil kunne genbruge mere.


(utested)
    
$sql = "SELECT billednavn FROM billeder WHERE DATE(dato) < DATE(DATE_SUB( NOW(), INTERVAL 7 DAY) ) and dato >'00:00:00'";
if ($result = mysqli_query($hellestrik, $sql)) { // procedural style
//if ($result = $hellestrik->query($sql)) { // oop style

  while($row = mysqli_fetch_assoc($result)  ){  // procedural style
  // while($row = $result->fetch_assoc()){ // oop style
 
    echo "Sletter filen: " . $row['billednavn'];   
    unlink("../Uploads/".$row['billednavn']);
  }
 
}



$sql = "DELETE FROM billeder WHERE DATE(dato) < DATE(DATE_SUB( NOW(), INTERVAL 7 DAY) ) and dato >'00:00:00'";
if ($result = mysqli_query($hellestrik, $sql)) { // procedural style
//if ($result = $hellestrik->query($sql)) { // oop style

  echo "Alt er slettet i DB";
}

på sigt bør du vende dig til at anvende OOP style, da det er mere effektivt, og nutiden/fremtiden er OOP baseret.
og som skrevet i en anden tråd kig på Prepare Statement, afh sikkerhed kort intro  http://www.eksperten.dk/guide/1480


@jakobdo
smider du et svar ?, så vi kan få lukket denne tråd.
Avatar billede Morten Professor
05. maj 2015 - 08:02 #8
Ja det må jeg hellere, ser lidt indviklet ud når jeg lige skal vende mig til mysqli, men det er bare med at komme igang. Er glad for du viser mig det eks. Det giver mig et godt indblik i hvad jeg skal lave fremover.

Med venlig hilsen
Morten
Avatar billede olsensweb.dk Ekspert
15. maj 2015 - 16:10 #9
tfp.

som jeg skrev tidligere ville jeg lave det med functioner, personligt har jeg nogle std CRUD functioner som vist
http://www.eksperten.dk/spm/998598 #6
disse er så mine skabeloner, som bliver modificeret fra tabel til tabel

kig på nedenstående


functioer (utested)
div]

function billeder_Read_Older_X_Days($conn, $days=7){
    $sql = "SELECT * FROM billeder WHERE DATE(dato) < DATE(DATE_SUB( NOW(), INTERVAL ".$days." DAY) ) and dato >'00:00:00";
    //$rs = mysqli_query($conn, $sql);
    $rs = $conn->query($sql);
    $ar = array();
    //while ($row = mysqli_fetch_assoc($rs) ){
    while ($row = $rs->fetch_assoc()) {
        $ar[] = $row;
    }
    return $ar;
}

function billeder_Delete($conn, $id){
$msg=""
$sql = "DELETE FROM billeder WHERE billedid = $id";
if ($result = mysqli_query($conn, $sql)) { // procedural style
//if ($result = $conn->query($sql)) { // oop style

  $msg = "billed er slettet i DB";
}
return $msg;
}


function billeder_Delete_Older_X_Days($conn, $days=7){
$msg=""
$sql = "DELETE FROM billeder WHERE DATE(dato) < DATE(DATE_SUB( NOW(), INTERVAL ".$days." DAY) ) and dato >'00:00:00'";
if ($result = mysqli_query($conn, $sql)) { // procedural style
//if ($result = $conn->query($sql)) { // oop style

  $msg = "Alt er slettet i DB";
}
return $msg;
}
[/div]



anvendelse

henter alle den der er ældre end 14 dage, og udskriver disse
(utested)
     
<?php
    $liste = billeder_Read_Older_X_Days($hellestrik, 14);           
    for ($i = 0, $lng = count($liste); $i < $lng; $i++) {           
            echo $liste[$i]['billedid'] . " ";
            echo $liste[$i]['billednavn'] . "<br>";           
    }
?>




henter billednavne og sletter hver enkelt fil, og derefter fjerner den fra db
her er et kald til billeder_Delete() for hvert billed
(utested)
     
<?php
    $liste = billeder_Read_Older_X_Days($hellestrik); // 7 er default parameter           
    for ($i = 0, $lng = count($liste); $i < $lng; $i++) {                   
        $billednavn = $liste[$i]['billednavn'];
        // testere om filen findes
        if(file_exists("Uploads/".$billednavn)) {
            echo "Sletter filen: " . $billednavn. "<br>";
        // den findes, vi sletter
        unlink("Uploads/".$billednavn;
        }
        else{
            echo "filen "."Uploads/".$billednavn." findes ikke <br>";
        }           
        echo billeder_Delete($hellestrik, $liste[$i]['billedid']);           
        echo "<br>";
    }
?>



den effektive, henter billednavne og sletter hver enkelt fil, og derefter rydder op i db i et hug
     
<?php
    $liste = billeder_Read_Older_X_Days($hellestrik); // 7 er default parameter           
    for ($i = 0, $lng = count($liste); $i < $lng; $i++) {                   
        $billednavn = $liste[$i]['billednavn'];
        // testere om filen findes
        if(file_exists("Uploads/".$billednavn)) {
            echo "Sletter filen: " . $billednavn. "<br>";
        // den findes, vi sletter
        unlink("Uploads/".$billednavn;
        }
        else{
            echo "filen "."Uploads/".$billednavn." findes ikke <br>";
        }       
    }    
    echo billeder_Delete_Older_X_Days($hellestrik);   
?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester