Avatar billede Slettet bruger
09. juli 2005 - 00:59 Der er 15 kommentarer og
2 løsninger

Indeksering af billeder fra mappe

Hej

Jeg søger en måde at indekser (indsætte url og filnavn i en DB) billeder, som ligger i en mappe.
Det skal fungere sådan at man upload billederne til mappen, via ftp. Så kører man scriptet, efter man har skrevet mappe navnet og så går scriptet i gang med at indsætte url (den som man skrev) og filnavnet (på filerne i mappen) og det gør den så ved alle billederne.

Eks.

En mappe med 2 billeder. Billede.jpg og billede2.jpg og de ligger i mappen test. DB vil så se sådan ud efter scriptet er kørt:

Id: 1
url: test
filnavn: billede.jpg

-----

id: 2
url: test
filnavn: billede2.jpg

Håber der er nogen som forstår mig og kan hjælpe mig.
Avatar billede jaw Nybegynder
09. juli 2005 - 01:28 #1
Måske det her kan bruges:

<?

echo"<form action='".$_SERVER['PHP_SELF']."' method='post'>";
echo"Indtast bibliotek: <input type='text' name='path'>";
echo"</form>";

if(isset($_POST['path']) && !empty($_POST['path'])) {
    //connect her
    $handle=opendir('./'.$_POST['path']);
    while (false !== ($file = readdir($handle))) {
        if($file != "." && $file != "..") {
            mysql_query("INSERT INTO tabel (url, filnavn) VALUES('".$_POST['path']."','".$file."')") or die(mysql_error());
        }
    }
    closedir($handle);
}

?>

Dog tager den lige pt. ikke højde for, hvis det allerede eksisterer i databasen...
Avatar billede Slettet bruger
09. juli 2005 - 02:07 #2
Det ser spændende ud. Jeg prøver lige at lege lidt med det her i nat eller i morgen tidlig
Avatar billede nielle Nybegynder
09. juli 2005 - 07:33 #3
Hvis man tidligere har kørt scriptet på mappen, får man dubletter. Dette undgås hvis man sletter de relevante rækker før at man lægger nye i:

<?
echo "<form action='" . $_SERVER['PHP_SELF'] . "' method='post'>";
echo "Indtast bibliotek: <input type='text' name='path'>";
echo "</form>";

if (isset($_POST['path']) && !empty($_POST['path']))
{
    //connect her
    mysql_query("DELETE FROM tabel WHERE url='" . $_POST['path'] . "'") or die(mysql_error());

    $handle = opendir('./' . $_POST['path']);
    while (false !== ($file = readdir($handle)))
    {
        if ($file != "." && $file != "..")
        {
            mysql_query("INSERT INTO tabel (url, filnavn) VALUES('" . $_POST['path'] . "','" . $file . "')") or die(mysql_error());
        }
    }
    closedir($handle);
}
?>
Avatar billede Slettet bruger
09. juli 2005 - 10:33 #4
nielle > Ja det rigtig. Men det ville i mit tilfælde være mere smart, at den indsatte de nye billeder. Fordi billede id bliver brugt på nogle andre sider og så vil der gå lidt ged i det, hvis billederne ikke fik det samme id - hvis du forstår
Avatar billede nielle Nybegynder
09. juli 2005 - 10:44 #5
Det kan sagtens laves:

<?
echo "<form action='" . $_SERVER['PHP_SELF'] . "' method='post'>";
echo "Indtast bibliotek: <input type='text' name='path'>";
echo "</form>";

if (isset($_POST['path']) && !empty($_POST['path']))
{
    //connect her

    $result = mysql_query("SELECT * FROM tabel WHERE url='" . $_POST['path'] . "'") or die(mysql_error());
    $num_rows = mysql_num_rows($result);

    if ($num_rows == 0)
    {
        $handle = opendir('./' . $_POST['path']);
        while (false !== ($file = readdir($handle)))
        {
            if ($file != "." && $file != "..")
            {
                mysql_query("INSERT INTO tabel (url, filnavn) VALUES('" . $_POST['path'] . "','" . $file . "')") or die(mysql_error());
            }
        }
        closedir($handle);
    }
}
?>
Avatar billede nielle Nybegynder
09. juli 2005 - 10:47 #6
Det var noget værre vrøvt. Prøv dette i stedet:

<?
echo "<form action='" . $_SERVER['PHP_SELF'] . "' method='post'>";
echo "Indtast bibliotek: <input type='text' name='path'>";
echo "</form>";

if (isset($_POST['path']) && !empty($_POST['path']))
{
    //connect her

    $handle = opendir('./' . $_POST['path']);
    while (false !== ($file = readdir($handle)))
    {
        if ($file != "." && $file != "..")
        {
            $result = mysql_query("SELECT * FROM tabel WHERE url='" . $_POST['path'] . "' AND filnavn='" . $file . "'") or die(mysql_error());
            $num_rows = mysql_num_rows($result);

            if ($num_rows == 0)
                mysql_query("INSERT INTO tabel (url, filnavn) VALUES('" . $_POST['path'] . "','" . $file . "')") or die(mysql_error());
        }
    }
    closedir($handle);
}
?>
Avatar billede Slettet bruger
09. juli 2005 - 11:24 #7
nielle > Jeg har lige prøvet at ændre lidt i din kode, så det kommer til at passe til mig. Det virker fint første gang man kører scriptet på en mappe. Hvis man så fx glemt at upload et billede, så gør man det bagefter og kører så igen scriptet, men så skulle det kun indsætte en ny række (det nye billede). Men det har jeg ikke haft held med. Jeg har følgende kode:


$result = mysql_query("SELECT * FROM billeder WHERE filnavn='" . $file . "' AND url='" . $_POST['path'] . "'") or die(mysql_error());
    $num_rows = mysql_num_rows($result);

    if ($num_rows == 0)
    {
        $handle = opendir('./' . $_POST['path']);
        while (false !== ($file = readdir($handle)))
        {
            if ($file != "." && $file != "..")
            {
                mysql_query("INSERT INTO billeder (lan, filnavn, url) VALUES('" . $_POST['lan'] . "','" . $file . "','" . $_POST['path'] . "')") or die(mysql_error());
            }
        }
        closedir($handle);
    }
}


Hvis jeg kører det igen, så vil den indsætte alle billederne igen - dvs der er 2 af hver. Kan du se hvad jeg gør forkert?
Avatar billede Slettet bruger
09. juli 2005 - 11:30 #8
Ups. Havde hvis glemt at opdater siden. SÅ havde ikke set dine beskeder. Sorry. Kigger lige på det
Avatar billede Slettet bruger
09. juli 2005 - 11:34 #9
Ja. Det virker lige som jeg havde håber på. Mange tak for hjælpen. Smidder I lige et svar, så dele jeg lige point ud. Mange tak for hjælpen
Avatar billede nielle Nybegynder
09. juli 2005 - 11:59 #10
Svar - men giv bare de fleste point til jaw. :^)
Avatar billede Slettet bruger
09. juli 2005 - 12:14 #11
Det gør jeg. Jeg tager på arbejde nu, så jeg givber point engang i aften.

Husk at lægge et svar jaw :-)
Avatar billede jaw Nybegynder
09. juli 2005 - 20:12 #12
Beklager jeg først er her nu, men stranden var så fristende i dag :)

Glad for at det virker - og selv tak...
Avatar billede Slettet bruger
09. juli 2005 - 22:52 #13
Tænkte på om det er muligt at tilføjde lidt mere kode, så det også virker hvis man sletter et billede, at det så også bliver slette i DB?
Avatar billede jaw Nybegynder
09. juli 2005 - 23:50 #14
Det kommer jo an på, hvordan du vil slette det. Hvor kommer "slet kommandoen" fra?
Avatar billede Slettet bruger
10. juli 2005 - 01:02 #15
Jeg ville slette billede via ftp og så kører scriptet og så skulle den slette række, med det billede som ikke længere findes i mappen.
Avatar billede jaw Nybegynder
10. juli 2005 - 01:11 #16
Jeg har ikke testet det, og måske der nok også er en bedre løsning, men mit umiddelbare forslag vil være:

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

$result = mysql_query("SELECT * FROM billeder WHERE filnavn='" . $file . "' AND url='" . $_POST['path'] . "'") or die(mysql_error());

while($row = mysql_fetch_array($result) {
  if(!in_array($row['filnavn'], $file_array)) {
    mysql_query("DELETE FROM billeder WHERE filnavn = '".$row['filnavn']."' AND url='".$_POST['path']."'") or die(mysql_error());
  }
}
Avatar billede nielle Nybegynder
10. juli 2005 - 09:20 #17
Det var også nogenlunde hvad jeg vil gøre (som om at der er så mange alternativer ;^). Men siden at vi nu har filerne i et array, skal resten også laves en smule om:

<?
echo "<form action='" . $_SERVER['PHP_SELF'] . "' method='post'>";
echo "Indtast bibliotek: <input type='text' name='path'>";
echo "</form>";

if (isset($_POST['path']) && !empty($_POST['path']))
{
    //connect her

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

    $result = mysql_query("SELECT filnavn FROM billeder WHERE filnavn='" . $file . "' AND url='" . $_POST['path'] . "'") or die(mysql_error());
    while ($row = mysql_fetch_array($result)
    {
        if (!in_array($row['filnavn'], $file_array))
            mysql_query("DELETE FROM billeder WHERE filnavn = '" . $row['filnavn'] . "' AND url='" . $_POST['path'] . "'") or die(mysql_error());
    }

    foreach ($file_array as $file)
    {
        $result = mysql_query("SELECT * FROM tabel WHERE url='" . $_POST['path'] . "' AND filnavn='" . $file . "'") or die(mysql_error());
        $num_rows = mysql_num_rows($result);

        if ($num_rows == 0)
            mysql_query("INSERT INTO tabel (url, filnavn) VALUES('" . $_POST['path'] . "','" . $file . "')") or die(mysql_error());
    }
}
?>
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