Avatar billede stengaard Praktikant
13. marts 2006 - 23:06 Der er 27 kommentarer og
1 løsning

Hvor virker dette ikke

har lidt problemmer med mit upload script hvor man har mulighed i mit community at upload et profilbilled som skal uploades til en mappe ved navn "files" og skrives ud for brugerne i mySql  det eneste der sker er at skærmen bliver hvid....

------ Upload form ----

<form action="changephotoparse.php" method="post" enctype="multipart/form-data">
                   
<input type="hidden" name="MAX_FILE_SIZE" value="81920">
Profil billed:                   
<input type="file" name="images">
<input type="submit" name="submit" value="Upload Profil billed">
</form>
<input type= "button"  value="Tilbage"  onclick="history.back()" style="cursor:pointer;">

------- upload scriptet ------

<?php

$id = $_SESSION['navn'];
include("access.php");
$maxfilesize = 81920;
// check if there was a file uploaded
if (!is_uploaded_file($_FILES['images']['tmp_name'])) {
    $error = "Du skal huske at vælge en fil der skal oploades.<br />";
// if it was, go ahead with other checks
} else {
    if ($_FILES['images']['size'] > $maxfilesize) {
        $error = "Dit Profil billed er for stort.<br />";
        unlink($_FILES['images']['tmp_name']);
    } else {
        $ext = strrchr($_FILES['images']['name'], ".");
        if ($ext != ".gif" AND $ext != ".jpg" AND $ext != ".jpeg" AND $ext != ".bmp" AND $ext != ".GIF" AND $ext != ".JPG" AND $ext != ".JPEG" AND $ext != ".BMP") {
            $error = "Dit profil billed er af forkert filtype.<br />";
            unlink($_FILES['images']['tmp_name']);
        // if it's there, an okay size and type, copy to server and update the photo value in SQL
        } else {
            if ($_SESSION['images'] != "nopic.jpg") {
                unlink("/images/".$_SESSION['images']);
            }
            $newname = $_SESSION['images'].$ext;
            move_uploaded_file($_FILES['images']['tmp_name'],"images/".$newname);
            mysql_query("UPDATE login SET images='$newname' WHERE user = '".$id."'"; or die (mysql_error());
            $_SESSION['images'] = $newname;
        }
    }
}
?>
<?php
if ($error) {
echo "Dit Profil billed kunne ikke ændres fordi ".$error.".";
} else {
echo "Dit nye profil billed er blevet oploadet.  se din nye profil, <a href=\"redigerprofil.php\">Klik her</a>.";
}
?>

------ min table i mysql ------


CREATE TABLE `login` (
  `ID` int(11) NOT NULL auto_increment,
  `user` varchar(50) NOT NULL default '',
  `pass` varchar(25) NOT NULL default '',
  `navn` varchar(51) NOT NULL default 'Ikke oplyst',
  `member` text NOT NULL,
  `adresse` text NOT NULL,
  `postnr` varchar(4) NOT NULL default '',
  `kommune` text NOT NULL,
  `mobil` varchar(8) NOT NULL default '',
  `foedselsdag` char(2) NOT NULL default '00',
  `aar` varchar(4) NOT NULL default '',
  `maaned` varchar(14) NOT NULL default '',
  `image` varchar(100) NOT NULL default '',
  `email` varchar(50) NOT NULL default '',
  `timestamp` timestamp(14) NOT NULL,
  `tid` datetime NOT NULL default '0000-00-00 00:00:00',
  `oprettetaf` text NOT NULL,
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `idx_brugere` (`user`)
) TYPE=MyISAM PACK_KEYS=0 AUTO_INCREMENT=34 ;
Avatar billede pidgeot Nybegynder
13. marts 2006 - 23:18 #1
Hvis der ikke kommer noget output, selvom der burde, så tyder det på der er en syntaksfejl i scriptet, og at visning af disse fejl er slået fra. Hvis du bruger B-one kan du slå PHP error messages til inde under Avanceret i dit kontrolpanel for at se præcist hvad der er galt - andre udbydere har muligvis noget tilsvarende.

Umiddelbart vil jeg mene fejlen ligger i denne linie:
mysql_query("UPDATE login SET images='$newname' WHERE user = '".$id."'"; or die (mysql_error());

som burde være som følger:
mysql_query("UPDATE login SET images='$newname' WHERE user = '".$id."'") or die (mysql_error());
Avatar billede stengaard Praktikant
13. marts 2006 - 23:22 #2
har ændret det til følgende og den skriver

"Dit Profil billed kunne ikke ændres fordi Du skal huske at vælge en fil der skal oploades."

<?php

$id = $_SESSION['navn'];
include("access.php");
$maxfilesize = 81920;
// check if there was a file uploaded
if (!is_uploaded_file($_FILES['images']['tmp_name'])) {
    $error = "Du skal huske at vælge en fil der skal oploades.<br />";
// if it was, go ahead with other checks
} else {
    if ($_FILES['images']['size'] > $maxfilesize) {
        $error = "Dit Profil billed er for stort.<br />";
        unlink($_FILES['images']['tmp_name']);
    } else {
        $ext = strrchr($_FILES['images']['name'], ".");
        if ($ext != ".gif" AND $ext != ".jpg" AND $ext != ".jpeg" AND $ext != ".bmp" AND $ext != ".GIF" AND $ext != ".JPG" AND $ext != ".JPEG" AND $ext != ".BMP") {
            $error = "Dit profil billed er af forkert filtype.<br />";
            unlink($_FILES['images']['tmp_name']);
        // if it's there, an okay size and type, copy to server and update the photo value in SQL
        } else {
            if ($_SESSION['images'] != "nopic.jpg") {
                unlink("/files/".$_SESSION['images']);
            }
            $newname = $_SESSION['images'].$ext;
            move_uploaded_file($_FILES['images']['tmp_name'],"images/".$newname);
            mysql_query("UPDATE login SET images='$newname' WHERE user = '".$id."'") or die (mysql_error());
            $_SESSION['images'] = $newname;
        }
    }
}
?>
                <?php
if ($error) {
    echo "Dit Profil billed kunne ikke ændres fordi ".$error.".";
} else {
    echo "Dit nye profil billed er blevet oploadet.  se din nye profil, <a href=\"redigerprofil.php\">Klik her</a>.";
}
?>
Avatar billede pidgeot Nybegynder
13. marts 2006 - 23:29 #3
Prøv lige at sætte en print_r($_FILES); ind i starten af dit upload-script og skriv hvad den så kommer med. Jeg kan ikke lige se hvor der skulle være et problem, men burde bedre kunne få en ide med outputtet derfra.
Avatar billede stengaard Praktikant
13. marts 2006 - 23:35 #4
fandt fejlen

dette script virker

<?php

$id = $_SESSION['navn'];
include("access.php");
$maxfilesize = 81920;
// check if there was a file uploaded
if (!is_uploaded_file($_FILES['file']['tmp_name'])) {
    $error = "Du skal huske at vælge en fil der skal oploades.<br />";
// if it was, go ahead with other checks
} else {
    if ($_FILES['file']['size'] > $maxfilesize) {
        $error = "Dit Profil billed er for stort.<br />";
        unlink($_FILES['file']['tmp_name']);
    } else {
        $ext = strrchr($_FILES['file']['name'], ".");
        if ($ext != ".gif" AND $ext != ".jpg" AND $ext != ".jpeg" AND $ext != ".bmp" AND $ext != ".GIF" AND $ext != ".JPG" AND $ext != ".JPEG" AND $ext != ".BMP") {
            $error = "Dit profil billed er af forkert filtype.<br />";
            unlink($_FILES['file']['tmp_name']);
        // if it's there, an okay size and type, copy to server and update the photo value in SQL
        } else {
            if ($_SESSION['file'] != "nopic.jpg") {
                unlink("/images/".$_SESSION['file']);
            }
            $newname = $_SESSION['file'].$ext;
            move_uploaded_file($_FILES['file']['tmp_name'],"files/".$newname);
            mysql_query("UPDATE login SET image='$newname' WHERE user = '".$id."'") or die (mysql_error());
            $_SESSION['file'] = $newname;
        }
    }
}
?>
                <?php
if ($error) {
    echo "<strong>Dit Profil billed kunne ikke ændres fordi ".$error."<br> <a href=\"changephoto.php\">Prøv Igen Klik her</a></strong>.";
} else {
    echo "Dit nye profil billed er blevet oploadet.  se din nye profil, <a href=\"redigerprofil.php\">Klik her</a>.";
}
?>
Avatar billede stengaard Praktikant
13. marts 2006 - 23:37 #5
men hvorfor skriver den ikke hvad filen hedder andet ind .jpg både i mappen files og i mysql
Avatar billede stengaard Praktikant
13. marts 2006 - 23:39 #6
den kommer med

Array ( [file] => Array ( [name] => mig selv.jpg [type] => [tmp_name] => [error] => 2 [size] => 0 ) )

når man bruger

print_r($_FILES);
Avatar billede pidgeot Nybegynder
13. marts 2006 - 23:53 #7
Tag og upload en fil der passer til den begrænsning der er angivet i din formular, og kom så med et nyt output fra print_r($_FILES);.

Bemærk dog at jeg forventer at du, når vi er færdige, opretter et nyt spørgsmål til at uddele nogle eller alle af de point du netop selv har taget tilbage, ellers er der ikke mere hjælp fra mig af - godt nok er der nogle herinde der ikke samler point, men jeg er ikke en af dem.
Avatar billede stengaard Praktikant
14. marts 2006 - 00:00 #8
ja det prøver jeg

nyt svar
med print_r($_files);

Array ( [file] => Array ( [name] => r12.jpg [type] => image/jpeg [tmp_name] => /tmp/phpfDsEWZ [error] => 0 [size] => 61550 ) )

den skriver kun i mysqlog i mappen files .jpg ikke filesnavn

nyt spørgsmål oprettet

http://www.eksperten.dk/spm/694921
Avatar billede pidgeot Nybegynder
14. marts 2006 - 00:10 #9
I så fald gætter jeg på at indholdet af $_SESSION['file'] ikke er hvad du forventer - den er sikkert tom.

Jeg gætter på at access.php kalder session_start();, ellers er det i hvert fald det første problem.

Desuden virker det som en lidt pudsig ting du gør med $_SESSION['file'] - du sletter en fil, for dernæst at sætte den nye fils extension bagpå - du fjerner dog aldrig den gamle extension først, så efter nogle gange kan du ende med et filnavn der ser sådan ud:
billede.jpg.png.gif.jpeg.jpg.gif.png

For at få den gamle extension udskiftet med den nye kan du bruge følgende stump kode:
$arr=explode('.',$_SESSION['file']);
unset($arr[count($arr)-1]);
$_SESSION['file']=implode('.',$arr).$ext;

(Jeg lægger i øvrigt først et svar i det nye spørgsmål når vi er færdige - det er nemmere at administrere på den måde.)
Avatar billede stengaard Praktikant
14. marts 2006 - 00:23 #10
ok hvor skal den stump kode sættes ind hænde i upload scriptet min access.php er bare min opklad til mysql

og ser således ud

<?PHP
mysql_connect("localhost", "xxxxx", "xxxxx");
mysql_select_db("xxxxx");
?>
Avatar billede pidgeot Nybegynder
14. marts 2006 - 00:28 #11
Den stump kode skal sættes ind i stedet for der hvor du sætter $ext på filnavnet - men for at gøre det nemt, skal den sidste linie i stumpen nok bruges $newname i stedet for $_SESSION['file'].

Det betyder koden kommer til at se sådan ud:

<?php
session_start();
$id = $_SESSION['navn'];
include("access.php");
$maxfilesize = 81920;
// check if there was a file uploaded
if (!is_uploaded_file($_FILES['file']['tmp_name'])) {
    $error = "Du skal huske at vælge en fil der skal oploades.<br />";
// if it was, go ahead with other checks
} else {
    if ($_FILES['file']['size'] > $maxfilesize) {
        $error = "Dit Profil billed er for stort.<br />";
        unlink($_FILES['file']['tmp_name']);
    } else {
        $ext = strrchr($_FILES['file']['name'], ".");
        if ($ext != ".gif" AND $ext != ".jpg" AND $ext != ".jpeg" AND $ext != ".bmp" AND $ext != ".GIF" AND $ext != ".JPG" AND $ext != ".JPEG" AND $ext != ".BMP") {
            $error = "Dit profil billed er af forkert filtype.<br />";
            unlink($_FILES['file']['tmp_name']);
        // if it's there, an okay size and type, copy to server and update the photo value in SQL
        } else {
            if ($_SESSION['file'] != "nopic.jpg") {
                unlink("/images/".$_SESSION['file']);
            }
            $arr=explode('.',$_SESSION['file']);
            unset($arr[count($arr)-1]);
            $newname=implode('.',$arr).$ext;
            move_uploaded_file($_FILES['file']['tmp_name'],"files/".$newname);
            mysql_query("UPDATE login SET image='$newname' WHERE user = '".$id."'") or die (mysql_error());
            $_SESSION['file'] = $newname;
        }
    }
}
?>
                <?php
if ($error) {
    echo "<strong>Dit Profil billed kunne ikke ændres fordi ".$error."<br> <a href=\"changephoto.php\">Prøv Igen Klik her</a></strong>.";
} else {
    echo "Dit nye profil billed er blevet oploadet.  se din nye profil, <a href=\"redigerprofil.php\">Klik her</a>.";
}
?>
Avatar billede stengaard Praktikant
14. marts 2006 - 00:33 #12
mmm den skriver stadig ikke noget navn på filen hverken i mysql eller i mappen files
Avatar billede pidgeot Nybegynder
14. marts 2006 - 00:34 #13
Prøv lige at sætte echo $_SESSION['file']; ind efter session_start();, så vi kan se hvad den indeholder.
Avatar billede stengaard Praktikant
14. marts 2006 - 00:38 #14
den skriver kun filestype

.JPG
Avatar billede pidgeot Nybegynder
14. marts 2006 - 00:48 #15
Det viser at $_SESSION['file'] oprindeligt var tom - eller kun indeholdt en filtype.

Det er ved nærmere eftersyn egentlig ret klart at det er tilfældet, da den værdi tilsyneladende aldrig bliver initialiseret - dit script siger den skal fjerne den gamle fil og lægge den nye ind i stedet. Det er til en vis grad fint nok - men der opstår et problem hvis der ikke er noget data, hvilket der vil være i starten.

Med andre ord, så skal du finde ud af hvad filnavnet skal være på en anden måde. Hvad er det meningen filen skal hedde?
Avatar billede stengaard Praktikant
14. marts 2006 - 00:51 #16
man kan vel bare kalde den det samme om den fil man uploader

f.eks.  migselv.jpg
Avatar billede pidgeot Nybegynder
14. marts 2006 - 01:07 #17
Ja, det kan du godt - så skal du bare have fat i $_FILES['file']['name'] - men så kan du jo risikere at folk kan overskrive noget de ikke burde kunne.

Om det er et reelt problem, afhænger af hvad systemet skal bruges til - men da du snakker om profilbilleder, og det ikke lader til du har en seperat mappe pr. bruger, skal du nok snarere anvende brugernavn eller bruger-ID til formålet. Der kan du vel passende bruge det her:

$newname=$id.$ext;

da jeg går ud fra $_SESSION['navn'] indeholder noget der entydigt identificerer personens profil.

Det skal selvfølgelig også ændres der hvor du sletter den gamle fil - et script der bruger dette kan eks. se sådan ud:

<?php
session_start();
$id = $_SESSION['navn'];
include("access.php");
$maxfilesize = 81920;
// check if there was a file uploaded
if (!is_uploaded_file($_FILES['file']['tmp_name'])) {
    $error = "Du skal huske at vælge en fil der skal oploades.<br />";
// if it was, go ahead with other checks
} else {
    if ($_FILES['file']['size'] > $maxfilesize) {
        $error = "Dit Profil billed er for stort.<br />";
        unlink($_FILES['file']['tmp_name']);
    } else {
        $ext = strrchr($_FILES['file']['name'], ".");
        $validexts=Array(".gif", ".jpg", ".jpeg", ".bmp", ".GIF", ".JPG", ".JPEG", ".BMP");
        if (!in_array($ext,$validexts)) {
            $error = "Dit profil billed er af forkert filtype.<br />";
            unlink($_FILES['file']['tmp_name']);
        // if it's there, an okay size and type, copy to server and update the photo value in SQL
        } else {
            foreach($validexts as $possext) {
                unlink("/images/".$id.$possext);
            }
            $newname=$id.$ext;
            move_uploaded_file($_FILES['file']['tmp_name'],"files/".$newname);
            mysql_query("UPDATE login SET image='$newname' WHERE user = '".$id."'") or die (mysql_error());
            $_SESSION['file'] = $newname;
        }
    }
}
?>
                <?php
if ($error) {
    echo "<strong>Dit Profil billed kunne ikke ændres fordi ".$error."<br> <a href=\"changephoto.php\">Prøv Igen Klik her</a></strong>.";
} else {
    echo "Dit nye profil billed er blevet oploadet.  se din nye profil, <a href=\"redigerprofil.php\">Klik her</a>.";
}
?>
Avatar billede stengaard Praktikant
14. marts 2006 - 10:30 #18
ok prøver
Avatar billede stengaard Praktikant
14. marts 2006 - 10:32 #19
følgende fejl

Warning: unlink(): SAFE MODE Restriction in effect. The script whose uid is 132124 is not allowed to access / owned by uid 0 in /customers/familien-stengaard.dk/familien-stengaard.dk/httpd.www/changephotoparse.php on line 158
Avatar billede stengaard Praktikant
14. marts 2006 - 10:33 #20
linie 158 er følgende

unlink("/images/".$id.$possext);
Avatar billede pidgeot Nybegynder
14. marts 2006 - 11:29 #21
Prøv det her:
1) Start en kommandoprompt.
2) Skriv "ftp familien-stengaard.dk" (uden anførselstegnene) og tryk Enter.
3) Skriv dit brugernavn og adgangskode.
4) Skriv "literal site chmod images 777" (igen, uden anførselstegn) og tryk Enter. Du burde få beskeden "200 Permisions changed on images".
5) Skriv "quit" og tryk Enter. Prøv derefter igen.
Avatar billede stengaard Praktikant
14. marts 2006 - 11:39 #22
den skriver at directiores ikke findes
Avatar billede stengaard Praktikant
14. marts 2006 - 11:49 #23
jeg har chmod'et det med ftp også kommer der igen fejl frem samt billedet er uploadet du snakkede noget om bruger mapper af billedere det var måske en god ide så hver bruger evetuelt kan uploade flere billeder og selv vælge hvilken de vil bruge fra mappen samt redigere i mappen, eller upload et mere som de vil bruge eventuelt med et uploadmax på 10 i en størrelse på eventuelt med rezise til et billed med målende 125 x 190 er det noget man kan lave
Avatar billede stengaard Praktikant
14. marts 2006 - 11:49 #24
sætter gerne flere point af
Avatar billede pidgeot Nybegynder
14. marts 2006 - 11:52 #25
Hov, havde lige overset en mindre ting - brug den linie i stedet:

unlink("files/".$id.$possext);

Det var nok snarere det der gjorde at den Safe Mode-fejl kom.
Avatar billede pidgeot Nybegynder
14. marts 2006 - 12:11 #26
Men ja, det kan fint lade sig gøre at bruge mapper tilat en bruger kan have mere end en fil - men når der er tale om profilbilleder, mener jeg det er mere logisk kun at have et pr. bruger.
Avatar billede pidgeot Nybegynder
14. marts 2006 - 12:12 #27
Og hvad flere point angår - så giver du i forvejen det maksimale for et spørgsmål. Hvis du ville give flere, skulle det være for et andet spørgsmål.
Avatar billede stengaard Praktikant
14. marts 2006 - 12:19 #28
ja men så tror jeg laver et spørgsmål om rezise billederne ned til 125 x 190 px

bygget ind i upload scriptet

spørgsmål

http://www.eksperten.dk/spm/695018
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