2017-07-14 2 views
-1

Je reçois quand vous essayez d'envoyer e-mail via php mailer tout ami peut l'aider à sortir ici est le code que j'utiliseSeules les variables doivent être transmises par référence par erreur?

<?php 
if(isset($_FILES['image'])){ 
    $errors= array(); 
    $file_name = $_FILES['image']['name']; 
    $file_size = $_FILES['image']['size']; 
    $file_tmp = $_FILES['image']['tmp_name']; 
    $file_type = $_FILES['image']['type']; 
    $file_ext=strtolower(end(explode('.',$_FILES['image']['name']))); 

    $expensions= array("jpeg","jpg","png"); 

    if(in_array($file_ext,$expensions)=== false){ 
     $errors[]="extension not allowed, please choose a JPEG or PNG file."; 
    } 

    if($file_size > 2097152) { 
     $errors[]='File size must be excately 2 MB'; 
    } 

    if(empty($errors)==true) { 
     move_uploaded_file($file_tmp,"images/".$file_name); 
     echo "Success"; 
    }else{ 
     print_r($errors); 
    } 
} 
?> 
+2

s'il vous plaît montrer un message d'erreur exacte, y compris le numéro de ligne – Jeff

+0

@ Jeff Ran cela par mon serveur comme un test, je présume que c'est l'erreur qu'il obtient: 'PHP Remarque: Seules les variables doivent être passées par référence dans E: \ sierr \ Docum ents \ Sync \ sync \ code \ snippets-php \ tmp.php sur la ligne 16' Qui référence cette ligne: '$ file_ext = strtolower (fin (explode ('.', $ _ FICHIERS ['image'] [ 'nom']))); ' – SierraKomodo

+0

Copie possible de [Seules les variables doivent être transmises par référence] (https://stackoverflow.com/q/4636166/1255289) – miken32

Répondre

2

end est une fonction qui déplace le pointeur interne de tableau à la fin du tableau. Il le fait en prenant une référence de tableau et en modifiant son pointeur de tableau. Cette ligne émettra un avertissement:

$file_ext=strtolower(end(explode('.',$_FILES['image']['name']))); 

La raison pour laquelle il fait cela est parce que explode est une fonction qui retourne un tableau. PHP vous dit simplement que vous essayez de déplacer le pointeur du tableau mais que vous ne suivez pas le tableau sur lequel vous déplacez le pointeur.

Cependant, en tant qu'effet secondaire end renvoie également l'élément à la fin (ce que vous voulez que je suppose). Fractionnement en deux lignes fonctionnera:

$array = explode('.',$_FILES['image']['name']); 
$file_ext=strtolower(end($array)); // Now a variable. 
2

La question est dans cette ligne:

$file_ext=strtolower(end(explode('.',$_FILES['image']['name']))); 

paramètre de la fonction end() est passée « par référence », ce qui signifie la fonction modifie directement la variable qui est passé dans la fonction. Pour cette raison, vous ne pouvez pas passer une fonction directement dans end() - Vous devez d'abord stocker la sortie de explode() dans une variable, puis passer cette variable dans end(). Certains documents pertinents:

http://php.net/manual/en/language.references.php

http://php.net/manual/en/function.end.php

Ce changement à la ligne ci-dessus devrait fonctionner:

$file_name_array = explode('.',$_FILES['image']['name']); 
    $file_ext=strtolower(end($file_name_array));