Avatar billede baronen20 Nybegynder
16. januar 2003 - 18:09 Der er 23 kommentarer og
1 løsning

fil-flushing

Jeg har en database med nogle fil-navne i. Alle filerne ligger i den samme mappe.
Nu er det sådan, at alle de filer som IKKE er i databasen skal slettes ved klik på en knap eller et link.

Hvordan gør jeg det?
Avatar billede fangel Nybegynder
16. januar 2003 - 18:52 #1
minder meget om noget jeg lavede tidligere... ser lige om jeg kan fidne som'et...

Morten
Avatar billede fangel Nybegynder
16. januar 2003 - 19:12 #2
jeg kan desværre ikke finde det spm... hvis du gidder lede alle spm. som jeg har deltaget igennem, så kan du finde dig svaret...

det spm gik på at lave en liste over alle filer i en mappe, som også var i databasen, det er ca. det samme du skal, bortset fra at dine ikke skal være i databasen (sætte et ! det rigtige sted), og slette filerne istedet for at lave en liste over dem...

så hvis du kan finde det spm, så er det problem løst...

Morten
Avatar billede iqzero Nybegynder
16. januar 2003 - 19:27 #3
Hej,

Først skal du have to arrays. $arrayDB og $arrayFile
Det ene med database-værdierne.
Det andet med de egentlige filer. Hvis du ikke kender til fil-håndtering i php, så gør sådan her:
(snip fra php-manualen samt lidt modifficering)
-------------------
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $arrayFile[]=$file;
        }
    }
    closedir($handle);
}
-------------------

Nu har du de to arrays. Nu skal vi bare finde forskellen. Det har vi den smare funktion, array_diff() til at gøre for os.

$arrayDims=array_diff($arrayFile,$arrayDB);

Nu har du $arrayDims, og den skal du bare traversere og slette hver fil i den (unlink($filnavn))
Avatar billede fangel Nybegynder
16. januar 2003 - 19:30 #4
igzero => du skal nok passe på med array_diff, for som Manualen skriver

Warning:
This was broken in PHP 4.0.4!


Morten
Avatar billede fangel Nybegynder
16. januar 2003 - 19:39 #5
jeg ville, efter at have lavet de to arrays, lave en pæn lille lykke...

for($i = 0;$i<count($array_filer);$++){
  if(!in_array($array_filer[$i],$array_db)){
    unlink($array_filer[$i]);
  }
}

Morten
Avatar billede iqzero Nybegynder
16. januar 2003 - 19:45 #6
Ja, i fald at baronen20 bruger php 4.0.4 er det den rigtige løsning, men ellers er array_diff mere effektiv.
Avatar billede fangel Nybegynder
16. januar 2003 - 20:49 #7
igzero => man ved jo aldrig... ;)
Avatar billede iqzero Nybegynder
16. januar 2003 - 22:59 #8
Det' jo det'...
Avatar billede baronen20 Nybegynder
16. januar 2003 - 23:40 #9
wow, sikke en smøre :)

nu er jeg forholdsvis amatør såå...

mappen hedder (fra rod): /pics/
filnavnene i db ligger i en kolonne der hedder 'picture', og indeholder kun navn+extension på filen, ikke stien.

Forestil dig at tabellen heddet 'table1'. Kan du lave et eksempel?
Avatar billede iqzero Nybegynder
18. januar 2003 - 04:02 #10
<?php

$query="SELECT filename FROM table1";
$res=mysql_query($query);

while($row=mysql_fetch_row($res)) {
  $arrayDB[]=$row[0];
}

if ($handle = opendir('/pics')) {
  while (false !== ($file = readdir($handle))) {
    if ($file != "." && $file != "..") {
      $arrayFile[]=$file;
    }
  }
  closedir($handle);
}

$arrayDims=array_diff($arrayFile,$arrayDB);

while(list($key,$val)=each($arrayDims)) {
  unlink($val);
}

?>

Og som dea_pg siger, hvis du kører php 4.0.4 så skift lige array_diff linjen ud med hans stykke kode.

NB! jeg har drukket flere øl og mange glas vin, og klokken er mange - så læs lige koden grundigt igennem før du eksekverer den. (Man kan aldrig være for forsigtig med sletning af filer)

Desuden er jeg ikke sikker på om $val ender med at indeholde kun filnavnet, eller sti+filnavn.. Så det kan være du skal bruge  unlink("/pics/".$val); i stedet for unlink($val);

GONAT, og sccchgåååål...
Avatar billede iqzero Nybegynder
18. januar 2003 - 04:03 #11
Og jeg kan ikke læse. ;)

Lav
$query="SELECT filename FROM table1";
om til
$query="SELECT picture FROM table1";
Avatar billede baronen20 Nybegynder
19. januar 2003 - 02:39 #12
Hvis jeg kopierer koden direkte, så virker det ikke.

Jeg kører php 4.1.2
Avatar billede baronen20 Nybegynder
19. januar 2003 - 02:42 #13
<?php

$query="SELECT picture FROM team";
$res=mysql_query($query);

while($row=mysql_fetch_row($res)) {
  $arrayDB[]=$row[0];
}

if ($handle = opendir('/pics/')) {
  while (false !== ($file = readdir($handle))) {
    if ($file != "." && $file != "..") {
      $arrayFile[]=$file;
    }
  }
  closedir($handle);
}

$arrayDims=array_diff($arrayFile,$arrayDB);

while(list($key,$val)=each($arrayDims)) {
  unlink($val);
}

?>

hvor er fejlen?
Avatar billede iqzero Nybegynder
19. januar 2003 - 12:56 #14
Hvilken fejlmeddelelse får du?
Avatar billede baronen20 Nybegynder
19. januar 2003 - 14:03 #15
hov, tilføj lige i toppen:

include("connect.php");

iqzero> ingen! blank side
Avatar billede baronen20 Nybegynder
19. januar 2003 - 22:02 #16
er der ingen der kan hjælpe?
Avatar billede iqzero Nybegynder
20. januar 2003 - 12:38 #17
Hvad prøver du da at printe?
Avatar billede baronen20 Nybegynder
23. januar 2003 - 19:55 #18
Jeg printer intet, jeg har kopieret koden direkte ind.

Jeg ville gerne have, at den gik videre til en anden side, med

header("Location:default.php?mode=files_flushed");
Avatar billede iqzero Nybegynder
23. januar 2003 - 20:09 #19
Så lav noget fejl-finding.. Prøv evt. at skift

unlink($val); ud med

echo unlink($val);
echo $val;
Avatar billede baronen20 Nybegynder
24. januar 2003 - 17:38 #20
den er fortsat blank
Avatar billede baronen20 Nybegynder
24. januar 2003 - 18:00 #21
rettelse! det havde lavet en mindre stavefejl...

unlink($val);
echo $val;

udskriver filnavnene, men de bliver ikke slettet
Avatar billede iqzero Nybegynder
24. januar 2003 - 18:46 #22
hvad giver echo unlink($val); så ?

Og udskriver den filnavnet, eller filnavnet samt stien?
Avatar billede baronen20 Nybegynder
24. januar 2003 - 19:19 #23
den udskriver intet
Avatar billede baronen20 Nybegynder
31. juli 2003 - 21:47 #24
Fik det aldrig til at virke, men fik alligevel aldrig rigtig brug for det...
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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