Avatar billede blach Nybegynder
12. januar 2004 - 22:06 Der er 26 kommentarer og
1 løsning

Script som ændrer filnavne

Jeg har en database hvor jeg gemmer en masse filnavne som er gemt i en mappe. Nu vil jeg gerne have lavet et script som kalder disse filnavne for nogle tal. Jeg er sådan set lige glad hvilke - bare ikke de samme!

$foresp = mysql_query("SELECT fil_navn FROM links WHERE mappe='koncert'");

Og så skal den selvfølgelig ændre disse "fil_navn" samtidig med at den giver nye navne til filerne i mappen "koncert".
Avatar billede googolplex Novice
12. januar 2004 - 22:23 #1
Er det et engangs-script, der henter alle filnavnene ud, laver dem om til nogle tilfældige tal og smider dem i databasen igen ?
Avatar billede blach Nybegynder
12. januar 2004 - 22:24 #2
Ja... som dog også ændrer filnavnene i mapperne...
Avatar billede stingbat Nybegynder
12. januar 2004 - 22:28 #3
Omdøbning er nu simpelt nok - kan du kigge her:
http://www.php.net/rename
Avatar billede blach Nybegynder
12. januar 2004 - 22:36 #4
yes.. det ved jeg godt! Men gider en af jer lave scriptet? Jeg kan ikke finde ud af hvordan man ændrer en masse navne i databasen... Vel noget med at den skal gemme navnene i et array !?
Avatar billede stingbat Nybegynder
13. januar 2004 - 03:51 #5
Hvis man bruger tager array-løsningen, kan det gøres således:
---
$foresp = mysql_query("SELECT fil_navn FROM links WHERE mappe = 'koncert'");

$files = array();
while ($row = mysql_fetch_array($foresp, MYSQL_ASSOC))
    $files[] = $row["fil_navn"];

mysql_free_result($foresp);

for ($fIndex = 1; $fIndex <= count($files); $fIndex++) {
    mysql_query("UPDATE links SET fil_navn = '" . $fIndex . "' WHERE fil_navn = '" . mysql_escape_string($files[$fIndex]) . "'");
    rename("path/" . $files[$fIndex], "path/" . $fIndex);
}
---

Dog kan det være at du skal ændre:
"path/" . $fIndex
til:
"path/" . $fIndex . "jpg"
eller hvad filerne nu hedder...

Hvis de har forskellige, kan du benytte:
"path/" . $fIndex . preg_replace("/^.*\.([a-z]+)$/", "\\1", $files[$fIndex])

Håber at det kan hjælpe dig lidt...
Avatar billede blach Nybegynder
13. januar 2004 - 20:47 #6
Det vil jeg da lige prøve...
Avatar billede blach Nybegynder
13. januar 2004 - 21:09 #7
Stringbat: Der må være noget i vejen med dit script, for den ændrer hverken noget i databasen eller filens navn - den kan ikke engang finde filen!

MEN:
Du mangler at gemme mappen ved $files
Den tager "WHERE mappe= 'koncert'", dvs. at den "path" den skal ændre filnavne ved er "koncert/" (altså mappen fra databasen).

Og hvad mener du med de ændringer? Kan den ikke ændre filer med alle former for endelser?
Avatar billede blach Nybegynder
13. januar 2004 - 21:12 #8
Og det jeg har gjort er at oprette et testbibliotek (test) med filen "test66.doc".

Hvis jeg skriver " echo $files[0];" så udskriver den faktisk "test66.doc". Men den kan hverken finde ud af at omdøbe den i /test/ eller i databasen...
Avatar billede stingbat Nybegynder
13. januar 2004 - 21:36 #9
Prøv følgende i stedet:
--
$mappe = "koncert";

$foresp = mysql_query("SELECT `fil_navn` FROM `links` WHERE `mappe` = '" . mysql_escape_string($mappe) . "'");

$files = array();
while ($row = mysql_fetch_array($foresp, MYSQL_ASSOC))
    $files[] = $row["fil_navn"];

mysql_free_result($foresp);

for ($fIndex = 1; $fIndex <= count($files); $fIndex++) {
    mysql_query("UPDATE `links` SET `fil_navn` = '" . $fIndex . "' WHERE `fil_navn` = '" . mysql_escape_string($files[$fIndex]) . "' AND `mappe` = '" . mysql_escape_string($mappe) . "'");
    rename($mappe . "/" . $files[$fIndex], $mappe . "/" . $fIndex . "." . preg_replace("/^.*\.([a-z]+)$/", "\\1", $files[$fIndex]);
}
--

Både db og den fysiske fil, burde meget gerne blive ændret... Kan dog ikke se hvorvidt det virker hos dig eller ej, eftersom jeg hverken har din db, eller de filer du har (i forhold til placering). Så du må prøve at lege lidt med det.
Avatar billede blach Nybegynder
13. januar 2004 - 22:01 #10
Ok, jeg tester lige, vender tilbage om max 20 min...
Avatar billede blach Nybegynder
13. januar 2004 - 22:04 #11
Parse error: parse error in /var/www/html/lektiecafe/opgaver/lav_filer_om.php on line 17

DVS:

rename($mappe . "/" . $files[$fIndex], $mappe . "/" . $fIndex . "." . preg_replace("/^.*\.([a-z]+)$/", "\\1", $files[$fIndex]);
Avatar billede stingbat Nybegynder
13. januar 2004 - 22:48 #12
rename($mappe . "/" . $files[$fIndex], $mappe . "/" . $fIndex . "." . preg_replace("/^.*\.([a-z]+)$/", "\\1", $files[$fIndex]));

Manglede lige en ")" ...
Avatar billede blach Nybegynder
13. januar 2004 - 22:55 #13
Warning: Rename failed (Ugyldigt argument) in /var/www/html/lektiecafe/opgaver/lav_filer_om.php on line 21

Der er et eller andet i vejen med dem du gemmer:
$files[$fIndex];
$fIndex;


For den ændrer hverken filnavnet i databasen eller i mappen...

Men hvis jeg skriver:
rename($mappe . "/test66.doc", ...

Så ændrer den filen...
Avatar billede blach Nybegynder
13. januar 2004 - 22:57 #14
og den sletter også fil-endelsen (f.eks. ".doc").
Avatar billede blach Nybegynder
13. januar 2004 - 23:00 #15
Hvis jeg udskriver "$fIndex" i løkken giver det ikke andet end 1 - og det er jo ikke filnavnets navn...
Altså som her:
for ($fIndex = 1; $fIndex <= count($files); $fIndex++) {
//echo $files[$fIndex]
echo $fIndex;
    mysql_query("UPDATE osv...
Avatar billede blach Nybegynder
13. januar 2004 - 23:01 #16
Skal det ikke være $files[$fIndex] ?
Avatar billede stingbat Nybegynder
13. januar 2004 - 23:12 #17
$files[$fIndex] indeholder hele filnavnet (inkl. .doc osv)
$fIndex indeholder det nye ID, som filen får... 1, 2, 3, 4....

Når du så har nr. 3, bliver det hvis man "oversætter" det til $files[3] bliver det til "filnavn.doc" osv...

Anyway, der dog en lille bug...:
--
$mappe = "koncert";

$foresp = mysql_query("SELECT `fil_navn` FROM `links` WHERE `mappe` = '" . mysql_escape_string($mappe) . "'");

$files = array();
while ($row = mysql_fetch_array($foresp, MYSQL_ASSOC))
    $files[] = $row["fil_navn"];

mysql_free_result($foresp);

for ($fIndex = 0; $fIndex <= count($files); $fIndex++) {
    mysql_query("UPDATE `links` SET `fil_navn` = '" . ($fIndex+1) . "' WHERE `fil_navn` = '" . mysql_escape_string($files[$fIndex]) . "' AND `mappe` = '" . mysql_escape_string($mappe) . "'");
    rename($mappe . "/" . $files[$fIndex], $mappe . "/" . ($fIndex+1) . "." . preg_replace("/^.*\.([a-z]+)$/", "\\1", $files[$fIndex]));
}
--

Men seriøst - kan som sagt ikke se hvor dine filer, mapper osv ligger - eller hvordan dine informationer ser ud i din database.

Men du kan prøve at "debugge" lidt med følgende:
--
$mappe = "koncert";

$foresp = mysql_query("SELECT `fil_navn` FROM `links` WHERE `mappe` = '" . mysql_escape_string($mappe) . "'");

$files = array();
while ($row = mysql_fetch_array($foresp, MYSQL_ASSOC))
    $files[] = $row["fil_navn"];

mysql_free_result($foresp);

for ($fIndex = 0; $fIndex <= count($files); $fIndex++) {
    echo("UPDATE `links` SET `fil_navn` = '" . ($fIndex+1) . "' WHERE `fil_navn` = '" . mysql_escape_string($files[$fIndex]) . "' AND `mappe` = '" . mysql_escape_string($mappe) . "'<br />");
    echo($mappe . "/" . $files[$fIndex] . " &gt;&gt; " . $mappe . "/" . ($fIndex+1) . "." . preg_replace("/^.*\.([a-z]+)$/", "\\1", $files[$fIndex]) . "<br />");
    echo("<br />");
}
--

Prøv det i første omgang - og se hvordan det ser ud...
Avatar billede blach Nybegynder
13. januar 2004 - 23:22 #18
Okay, jeg har som sagt 1 i databasen (test66.doc under test) og den udskriver:
UPDATE `links` SET `fil_navn` = '1' WHERE `fil_navn` = 'test66.doc' AND `mappe` = 'test'
test/test66.doc >> test/1.doc

UPDATE `links` SET `fil_navn` = '2' WHERE `fil_navn` = '' AND `mappe` = 'test'
test/ >> test/2.


Ser bedre ud...
Den sidste update skal jeg vel helst være foruden? (jeg har kun 1 i databasen)
Og så skal der også gerne sættes ".doc" på:
UPDATE `links` SET `fil_navn` = '1' <-- 1.doc
Avatar billede blach Nybegynder
13. januar 2004 - 23:29 #19
men den sidste update er alligevel umulig, så kan være lige meget... og det indsættelse af ".doc" i databasen, er vel også rimelig let!?
Avatar billede blach Nybegynder
13. januar 2004 - 23:33 #20
Endelsen på filerne er altid 3 karakterer... Kan det hjælpe?
Avatar billede stingbat Nybegynder
14. januar 2004 - 00:03 #21
Så burde det vidst være fixed:
--
$mappe = "koncert";

$foresp = mysql_query("SELECT `fil_navn` FROM `links` WHERE `mappe` = '" . mysql_escape_string($mappe) . "'");

$files = array();
while ($row = mysql_fetch_array($foresp, MYSQL_ASSOC))
    $files[] = $row["fil_navn"];

mysql_free_result($foresp);

for ($fIndex = 0; $fIndex <= count($files); $fIndex++) {
    $newFile = ($fIndex+1) . "." . preg_replace("/^.*\.([a-z]+)$/", "\\1", $files[$fIndex]);
    mysql_query("UPDATE `links` SET `fil_navn` = '" . $newFile . "' WHERE `fil_navn` = '" . mysql_escape_string($files[$fIndex]) . "' AND `mappe` = '" . mysql_escape_string($mappe) . "'");
    rename($mappe . "/" . $files[$fIndex], $mappe . "/" . $newFile);
}
--
Avatar billede blach Nybegynder
14. januar 2004 - 19:05 #22
Det ser ud til at virke helt perfekt... Tak skal du have!
Avatar billede stingbat Nybegynder
14. januar 2004 - 20:16 #23
Rart at høre :-)
Var skam så lidt...

Husk at lukke spørgsmålet... *S*
Avatar billede blach Nybegynder
14. januar 2004 - 20:49 #24
Hehe, yup yup... Du har fuldt ud fortjent pointene!
Avatar billede stingbat Nybegynder
16. januar 2004 - 22:38 #25
blach:
Husk nu at lukke spørgsmålet... ;-) *G*
Avatar billede blach Nybegynder
17. januar 2004 - 15:34 #26
sorry...
Avatar billede stingbat Nybegynder
17. januar 2004 - 16:26 #27
I orden :-)
Er mere for go' ordens skyld (exp's regler osv)
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