Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
opendir / readdir / unlink von files [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
opendir / readdir / unlink von files


 
rEd1Z1_2K
24-02-2005, 17:55 
 
Hallo an alle,

hab mal 2 kleine problemchen die das arbeiten mit datei handling auf dem ftp server zusammen hängen

das erste ist,

ich habe vor einem monat in mein upload script ein fehler eingebaut,
bei hochladen wurden die erweiterungen nicht mit an die files gehängt

wie kann ich z.b. mit nem php script evtl alle bild datein die keine erweiterung bekommen das jpg ans ende ran hängen,


( die bild datein wurden alle mit ner fortlaufenden ID die aus ner SQL tabelle gezogen wurde gespeichert,)

sieht wie folgt aus

1234.
3124.
23.
435.
123.

uswm es steht immer nur der . dort, aber nicht die erweiterung, das sind nun leider etliche hundertevon files und per hand wollt ich das nicht unbedingt machen.

evtl läst sich sowas ja auch via ftp programm oder ähnliches lösen.

---------------------------- 2ter punkt-------------------

//Bildleichen löschen


if(isset ($action) && $action =='deleteold'){

$ordner = "../upload/thumbs";

$befehl = opendir("$ordner");
$i=0;
while ($datei=readdir($befehl)) {

if (file_exists($ordner."/".$datei)){
$thispic= $datei;

$res_pics=mysql_query("SELECT * FROM niv_images WHERE p_minipic='upload/thumbs/$thispic'") or error (mysql_error());
$piccount=mysql_num_rows($res_pics);
if($piccount == 0){
unlink("../upload/thumbs/$thispic");
}

}
$i++;
}


closedir($befehl);


$ordner2 = "../upload";

$befehl2 = opendir("$ordner2");
$j=0;
while ($datei2=readdir($befehl2)){


if (file_exists($ordner2."/".$datei2)) {
$thispic2= $datei2;

$res_pics2=mysql_query("SELECT * FROM niv_images WHERE p_minipic='upload/thumbs/$thispic2'") or error (mysql_error());

$piccount2=mysql_num_rows($res_pics2);
if($piccount2 == 0) {
unlink("../upload/$thispic2");

$thispic2 = explode(".",$thispic);
$pmg=$thispic2[0];

$scom=mysql_query("SELECT c_id FROM niv_comments WHERE c_forpicid =$pmg") or error (mysql_error());
while($com=mysql_fetch_array($scom)){
mysql_query("DELETE FROM niv_comments WHERE c_id='$com[c_id]") or error (mysql_error());
}
}

}
$j++;
}


closedir($befehl2);

das ist ein php code der in meinem script mit drinne steht,
dieser ermittelt bild leichen die auf de ftp server stehen, aber nicht mehr in der datenbank zu finden sind,
da ich hier aber auch etliche hunderte von bildleichen habe (hab das schonmal anhand der SQL zahlen und der ftp client daten des ordners errechnet) möchte ich diese auch gerne ermitteln und löschen,
aber dieses script arbeitet ziemlich umständliche und mein server arbeitet nie weiter, sprich. da es wohl zuviel daten zum verarbeiten sind, macht er nicht weite,r
führe ich dieses script local auf meinem xampp aus, (AMD Athlon XP 2000+ 1GB DDR-RAM) hängt der sich selbst auf bzw arbeitet sehr sehr stockend)

gibt s hierfür irgendwie ne andre möglichkeit die nicht so das system beansprucht aber trotzdem alle bildleichen löscht?

was direkte datei dinge angeht in php bin ich nicht so der experte, mein gebiet geht eher auf umfangreiche mysql abfragen etc.

ich danke für eure hilfe :)

 
Shurakai
24-02-2005, 17:59 
 
Das dein Server nicht so gut arbeitet etc. hängt vllt. damit zusammen, dass du in den Schleifen mehrere Queries machst. Bei einigen hundert Files -> einige hundert Queries....

 
rEd1Z1_2K
24-02-2005, 18:14 
 
das ist mir bekannt das dann dementsprechend die querys sind..

aber es wird doch evtl eine möglichkeit geben,
alle files die nich eine der ID's haben, die in der datenbank vorhanden sind, zu löschen?

evt ja auf eine andre art,

in einer sql abfrage werden alle datein ermittelt,
und wie blich in ein array geschrieben,
danach wird eine while schleife erstellt die alle dtein auflistet (anhand readdir) aber es sollen mir NUR die bilder aufgelistet werden die NICHT in der sql abfrage vorhanden sind und wenn möglich diese auch gleich löschen, ist das möglich?

___________________________________
EDIT:

foreach (glob("*.jpg") as $filename) {
echo $filename ." size " . filesize($filename) . "\n";
unlink($filename);
}

läst sich hiermit evtl was machen das die function alle files ignoriert, die die sql abfrage zurückgibt?

 
ghostgambler
24-02-2005, 18:52 
 
Original geschrieben von rEd1Z1_2K
$scom=mysql_query("SELECT c_id FROM niv_comments WHERE c_forpicid =$pmg") or error (mysql_error());
while($com=mysql_fetch_array($scom)){
mysql_query("DELETE FROM niv_comments WHERE c_id='$com[c_id]") or error (mysql_error());
}
Warum machst du daraus nicht einfach mysql_query('DELETE FROM niv_comments WHERE c_forpicid = ' . $pmg)or die(mysql_error())
Sollte funktionieren und spart dir schonmal die ggf. tausenden Querys für die Kommentare...

 
rEd1Z1_2K
24-02-2005, 18:55 
 
hat damit nix zu tun, dieser query ist überflüssig. das script ist ja da nicht von mir
ich habsauch nocht nicht überarbeitet, werd ich aber gleich mal un dann die neuen code hier posten..

das ist ja auch nicht das relevante, das sind ja nur bild commentare, ich will ja bild leichen löschen.. (und um überfglüssige kommentare zu löschen benutzt ich nen andren SQL befehl der mit LEFT JOIN arbeitet (ist noch einfacher)

 
rEd1Z1_2K
24-02-2005, 22:01 
 
zu meinem erstem problem was die datein ohne erweiterung angeht hab ich die lösung gefunden.

mir bleibt nur noch das mit dem bild leichen löschen ^^

hellpp:dontknow:

 
Shurakai
24-02-2005, 22:29 
 
Original geschrieben von rEd1Z1_2K
zu meinem erstem problem was die datein ohne erweiterung angeht hab ich die lösung gefunden.


Dann poste sie hier bitte auch - manche Leute finden so einen Thread z.B. über ne Suchmaschine, und dann ist die Lösung sehr sehr hilfreich...

 
rEd1Z1_2K
25-02-2005, 01:08 
 
nennt sich Total Commander das tool und hat unter dem Reiter "Datein" ein Mehrfachumbenennungstool..

damit gings ohne probleme und sehr sehr schnell :D
selbst direkt auf FTP antwendebar, muste nichtmal die datein erst runterladen oder so. konnte sie so direkt oben selectieren und die neue erweiterung angeben..

un wer hilft mir jetzt bei meine 2ten problem?

// Bildleichen löschen (wenn GET deleteold übergeben wird //

if($_GET['action'] == "deleteold"){

$ordner = "../upload/thumbs";

$befehl = opendir($ordner);

while($datei = readdir($befehl)) {
$res_pics = mysql_result(mysql_query("SELECT * FROM niv_images WHERE p_minipic = 'upload/thumbs/".$datei."'"),0);
if( empty($res_pics) ){
@unlink("../upload/thumbs/".$datei);
@unlink("../upload/".$datei);
echo "<div style=\"border-bottom:1px solid #000000;\">../upload/thumbs/".$datei." <-(THUMBDNAIL)<br />\n | ../upload/".$datei." <-(ORGINAL)</div> <br />\n";
}
}
closedir($befehl);
}

das ist die neue function die ich mir gebastelt habe.
aber immer noch sehr speicher fresend und server belastend..

 
wahsaga
25-02-2005, 01:23 
 
Original geschrieben von rEd1Z1_2K
aber immer noch sehr speicher fresend und server belastend..
natürlich.
das dürften queries innerhalb von schleifen fast immer sein.

$res_pics = mysql_result(mysql_query("SELECT * FROM niv_images
WHERE p_minipic = 'upload/thumbs/".$datei."'"),0);
if( empty($res_pics) ){
m.E. sinnfrei, hier auf empty abzufragen - wenn die query nicht fehlgeschlagen ist, wird $res_pics immer eine resource ID enthalten.
bitte nicht "mysql_query liefert false" mit "query liefert keinen ergebnisdatensatz" verwechseln.


p.s.: bitte brich den code in deinem beitrag um, damit man bei gängier auflösung nicht so weit querscrollen muss.

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:06 Uhr.