// Other variables
$MAX_FILENAME_LENGTH = 260;
$file_name = $_FILES[$upload_name]['name'];
//echo "testing-".$file_name."<br>";
//$file_name = strtolower($file_name);
$file_extension = end(explode('.', $file_name)); //ERROR ON THIS LINE
$uploadErrors = array(
0=>'There is no error, the file uploaded with success',
1=>'The uploaded file exceeds the upload max filesize allowed.',
2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
3=>'The uploaded file was only partially uploaded',
4=>'No file was uploaded',
6=>'Missing a temporary folder'
);
Des idées? Après 2 jours encore coincé.
Réponses:
Attribuez le résultat de
explode
à une variable et passez cette variable àend
:Le problème est que cela
end
nécessite une référence, car il modifie la représentation interne du tableau (c'est-à-dire qu'il fait pointer le pointeur de l'élément courant vers le dernier élément).Le résultat de
explode('.', $file_name)
ne peut pas être transformé en référence. Il s'agit d'une restriction dans le langage PHP, qui existe probablement pour des raisons de simplicité.la source
error_reporting
. Est-il sûr de le faire?error_reporting
. Il n'est pas sûr d'ignorer aveuglément les erreurs. La désactivationerror_reporting
est une étape importante vers l'ignorance aveugle des erreurs. Dans l'environnement de production, désactivez-le à ladisplay_errors
place et écrivez les erreurs dans un fichier journal.Utilisation correcte compatible Php 7:
la source
@
préfixe?Tout le monde vous a déjà donné la raison pour laquelle vous obtenez une erreur, mais voici la meilleure façon de faire ce que vous voulez faire:
$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
la source
enregistrez le tableau d'explode () dans une variable, puis appelez end () sur cette variable:
btw: J'utilise ce code pour obtenir l'extension de fichier:
où
strrchr
extrait la chaîne après la dernière.
etsubstr
coupe le.
la source
Essaye ça:
La raison en est que l'argument de
end
est passé par référence, carend
modifie le tableau en avançant son pointeur interne vers l'élément final. Si vous ne transmettez pas de variable, il n'y a rien pour indiquer une référence.Voir
end
dans le manuel PHP pour plus d'informations.la source
PHP se plaint car
end()
attend une référence à quelque chose qu'il veut changer (qui ne peut être qu'une variable). Vous passez cependant le résultat deexplode()
directement àend()
sans l'enregistrer d'abord dans une variable. Au moment oùexplode()
renvoie votre valeur, elle n'existe qu'en mémoire et aucune variable ne la pointe. Vous ne pouvez pas créer une référence à quelque chose (ou à quelque chose d'inconnu dans la mémoire), qui n'existe pas.Ou en d'autres termes: PHP ne sait pas, si la valeur que vous lui donnez est la valeur directe ou juste un pointeur vers la valeur (un pointeur est également une variable (entier), qui stocke le décalage de la mémoire, où la valeur réelle réside). PHP attend donc toujours ici un pointeur (référence).
Mais comme il ne s'agit que d'une notification (même pas obsolète) en PHP 7, vous pouvez ignorer les notifications et utiliser l'opérateur ignore au lieu de désactiver complètement le rapport d'erreur pour les notifications:
la source
explode
dans une variable temporaire, comme d'autres l'ont écrit ici. Mais encore une fois: ce n'est pas une erreur, il est donc correct d'utiliser cet opérateur. PHP est généralement mauvais dans la gestion des erreurs. Par conséquent, je suggère d'utiliserset_error_handler
etset_exception_handler
pour la gestion des erreurs et comme solution la plus propre.Tout comme vous ne pouvez pas indexer le tableau immédiatement, vous ne pouvez pas non plus l'appeler end. Attribuez-le d'abord à une variable, puis appelez end.
la source
end(...[explode('.', $file_name)])
fonctionne depuis PHP 5.6. Ceci est documenté dans le RFC mais pas dans les documents PHP eux-mêmes.la source
Puisqu'il soulève un drapeau depuis plus de 10 ans, mais fonctionne très bien et retourne la valeur attendue, un petit opérateur stfu est la meilleure mauvaise pratique que vous recherchez tous:
la source
Manuel PHP officiel: end ()
Paramètres
Le tableau. Ce tableau est transmis par référence car il est modifié par la fonction. Cela signifie que vous devez lui passer une variable réelle et non une fonction renvoyant un tableau car seules les variables réelles peuvent être transmises par référence.
la source
Tout d'abord, vous devrez stocker la valeur dans une variable comme celle-ci
Ensuite, vous pouvez utiliser la fonction de fin pour obtenir le dernier index d'un tableau comme celui-ci
J'espère que cela fonctionnera pour vous.
la source
la source