Ik ben bezig met het Handboek PHP 5.3. Ik wil nu een plaatje uploaden naar een map en de link toevoegen aan de database. Het uploaden lukt alleen niet. Ook het script dat ik bij het boek heb gedownload, werkt niet. Hij gaat rechtstreeks naar de melding "Het uploaden is niet gelukt". Dat zou betekenen dat er al iets foutgaat in de regel: if (is_uploaded_file($_FILES['afbeelding']['tmp_name']))

Iemand enig idee? Hieronder het script.

<?php
if ($_POST["knop"]) {
$doelbestandsnaam = "plaatje";
$pad = "C:/xampp/htdocs/leerphp/images";
if (is_uploaded_file($_FILES['afbeelding']['tmp_name'])) {
// bestandgrootte controleren
if ($_FILES['afbeelding']['size'] > 150000){
echo "Het bestand is te groot";
exit;
}
//extensie controleren
if (!preg_match("/((.gif|.jpg|.png)$)/", $_FILES['afbeelding']['name'], $extensie)) {
echo "Het bestand is niet van het juiste type";
exit;
}
if (!move_uploaded_file($_FILES['afbeelding']['tmp_name'], $pad.$doelbestandsnaam.$extensie[0])){
echo "Het bestand kon niet verplaatst worden";
}
echo "Het bestand ".$_FILES['afbeelding']['name']." is geupload";
} else {
echo "Het uploaden is niet gelukt";
}
} else {
?>
<form enctype="multipart/form-data" action="<?php echo $_SERVER["PHP_SELF"]?>" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="15000" />
Upload afbeelding: <input name="afbeelding" type="file" />
<input type="submit" value="Uploaden" name="knop" />
</form>
<?php
}
?>
Kijk hier eens naar:

$pad.$doelbestandsnaam.$extensie[0]
...

Dit betekent dat $pad moet eindigen met een / .
Dus sowieso moet dat worden

$pad = "C:/xampp/htdocs/leerphp/images/";
Dank je Kris, ik pas het aan.

Maar dat verklaart nog niet de fout.
Hallo Karin,

lees eens http://www.tizag.com/phpT/fileupload.php. je ziet daar dat is_uploaded_file() niet gebruikt wordt. Wat mij betreft kun je regel 5 en dus ook regel 20 tm 22 er uit halen. met move_uploaded_file() komt de fout dat er geen bestand is toch wel aan het licht. de foutmelding van regel 17 kun je dan beter wel even aanpassen naar iets als 'het uploaden is niet gelukt probeer het later nog eens'

Groet frank
Karin,

Het is niet aan te raden om 'het echte pad' op te geven wat je op regel 4 doet. Maar bijvoorbeeld alleen /images.

Tevens controleer je niets in je if statements, wat een beetje raar is.
<?php
if ($_POST["knop"])
//als het wat is?
?>

<?php
if (is_uploaded_file($_FILES['afbeelding']['tmp_name']))
//als het wat is?
?>

<?php
if (!move_uploaded_file($_FILES['afbeelding']['tmp_name'], $pad.$doelbestandsnaam.$extensie[0])
//dit ook geen goede if statement*
?>


Het is bijvoorbeeld
<?php
if (isset($_POST["knop"]))
//Nu kijkt hij of je $_POST['knop'] gevult is
?>


Dit pas je ook zo toe bij de if is_uploaded_file statement om te kijken of het gevult is. Je kunt ook empty gebruiken, beide doen in principe het zelfde alleen omgedraaid!

isset kijkt of er een waarde is, en empty kijkt of er geen waarde is. !isset kijkt of er geen waarde is, en !empty kijkt of er wel een waarde is.
@Chris: jouw beredenering klopt niet volledig. Zowel is_uploaded_file() en move_uploaded_file() returnen allebei true on succes en false bij een failure. Die if statements zijn dus prima in orde.
Ozzie PHP op 18/10/2012 08:20:04

@Chris: jouw beredenering klopt niet volledig. Zowel is_uploaded_file() en move_uploaded_file() returnen allebei true on succes en false bij een failure. Die if statements zijn dus prima in orde.


Ik zeg ook niet dat ze niet prima zijn, echter is het niet gebruikelijk om ze niet te controleren. Bijvoordbeeld met een isset of if (is_uploaded_file($_FILES['afbeelding']['tmp_name']) == true ). Voor zover ik weet krijg je ook in elk PHP boek bij if statements een controle, en niet alleen if (is_uploaded_file($_FILES['afbeelding']['tmp_name'])) bijvoorbeeld.

Tevens heb ik nog nooit een if statement gezien waar zo gecontroleerd wordt met een , ertussen.

Aanghezien ze aan het leren is, kun je het toch net zo goed meteen correct doen niet dan?
"Ik zeg ook niet dat ze niet prima zijn, echter is het niet gebruikelijk om ze niet te controleren."

Ze worden wel gecontroleerd... de functie zelf geeft 'true' of 'false' terug. Feitelijk staat er dus dit:

if (TRUE) {
...
}

"Tevens heb ik nog nooit een if statement gezien waar zo gecontroleerd wordt met een , ertussen."

Ik weet niet wat je hiermee bedoelt. Die komma is gewoon een scheiding van parameters binnen de functie.
Ozzie,

Hoe weet jij nu of je controleerd of true of false? Als je eenmaal meer uitgebreidere scripts gaat schrijven controleer je welleens op true en in sommige situaties op false. Als je het niet controleerd en aangeeft wat je verwacht, verlies je compleet het overzicht van je script en wordt troubleshooten heel lastig.

Want van een script met 30 regels is dat nog wel te overzien, maar wanneer het er 200+ gaan worden is het verhaal compleet anders. Nogmaals de TS is aan het leren, waarom het op deze manier aanleren wanneer de kans groot is dat je in de problemen komt.

Over de comma , ik heb een ) over het hoofd gezien, dus niet in de gaten gehad dat het extra parameters waren voor de move_uploaded_file. Dus dat is een domme leesfout van mij ;)
"Hoe weet jij nu of je controleerd of true of false"

Omdat die functies altijd true of false returnen. Dit kun je per functie terugvinden op php.net. Bij een functie die true of false retourneert is een dergelijke controle gebruikelijk.

"Over de comma , ik heb een ) over het hoofd gezien, dus niet in de gaten gehad dat het extra parameters waren voor de move_uploaded_file. Dus dat is een domme leesfout van mij ;)"

Kan gebeuren ;)
Chris, als je aan het programmeren bent of debuggen of wat dan ook en je ziet staan:

<?php
if ( $bool )
{
	//doe iets
}
?>

Dan weet je toch dat hij checkt op true? PHP doet dit standaard en zal dan nooit controleren op false.
Zo zou je false kunnen checken met:


<?php
if ( !$bool )
{
	//doe iets
}
?>

Reageren