13. marts 2006 - 23:06Der 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....
$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 ;
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());
"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>."; } ?>
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.
$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>."; } ?>
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.
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.)
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>."; } ?>
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?
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>."; } ?>
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
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.
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
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.
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.