Erreur de syntaxe PHP

Résolu/Fermé
Belokanfr Messages postés 19 Date d'inscription lundi 4 juillet 2011 Statut Membre Dernière intervention 28 juin 2012 - 15 juin 2012 à 00:16
Belokanfr Messages postés 19 Date d'inscription lundi 4 juillet 2011 Statut Membre Dernière intervention 28 juin 2012 - 15 juin 2012 à 17:05
Bonjour à tous !

Je me décide enfin à écrire pour trouver une réponse à mon problème.

En effet, cela fait maintenant plus de 2 jours que j'essaye de trouver la bonne syntaxe pour le code ci-dessous.

Voilà ce que je souhaite faire et ce qui fonctionne :

1/ J'ai créer, à partir de divers scripts, un script permettant d'uploader un fichier. En uploadant celui-ci, je souhaite :
1. Vérifier le type de fichier (ex. : pdf, avi, jpg, etc.) et si celui-ci est valide alors on passe à l'étape suivante, sinon on a un message d'alerte.
2. Vérifier son poids, si celui-ci ne dépasse pas un poids maximal et si tel est le cas, alors on a un message d'alert.
3. Si tous les autres critères sont valides, alors on vérifie si le fichier porte le même nom qu'un fichier existant se trouvant dans le même dossier, et si c'est le cas, alors on ajoute la date à son nom, sinon on copie simplement le fichier avec sont nom.
Et si possible, supprimer les espaces dans le fichier par le code suivant :
$extension_upload = substr( strrchr($_FILES['fichier']['name'], '.') ,1); 



Ce qui fonctionne :
Le dernier point (n°3) fonctionne, à savoir que j'upload un fichier, s'il n'est pas existant, alors il est copié tel quel, sinon la date est ajouté à son nom, mais laisse les espaces, donc le code cité ci-dessus ne fonctionne pas.

Mais mon soucis, c'est que j'upload tout et n'importe quoi, c'est à dire que je peux uploader des fichiers qui ne se retrouvent pas dans mon tableau d'acceptation, et en plus, j'upload sans tenir compte du poids.

Donc en somme, j'upload sans vérification au préalable, ce qui me fait dire que le script ne tient compte QUE de la partie d'ajout de la date (ligne 53 à 62).

Je me débrouille mieux en html qu'en PHP, mais là, j'ai essayé toutes les combinaisons qui me paraissaient faisables et logiques.

Donc j'en appelle à vos connaissance et à votre savoir-faire.

Un grand merci anticipé à ceux qui prennent de leur temps pour me guider, voire me remettre le script dans une syntaxe correcte.

LES ELEMENTS :
(1- Le html nommé "upload.html" et 2- Le script PHP nommé "ulpoad.php3)


***HTML ***
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Multi-upload facile avec JQUERY</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>
<form enctype="multipart/form-data" action="upload.php3" method="post">
Fichier : <input name="fichier" type="file">
<input type="submit" value="Envoyer">
</form>
</body>
</html>




***PHP***
<?
// Taille maximum
$MAX_FILE_SIZE = 100;

// Dossier de destination du fichier
$folder = "upload/";

// Tableau array des différents types
$allowed_types = array(
"image/bmp", 
"image/gif", 
"image/pjpeg", 
"image/jpeg", 
"image/jpg", 
"image/png", 
"image/tiff",
"application/postscript",
"image/psd",
"application/x-shockwave-flash", 
"multipart/x-zip", 
"application/msword", 
"application/excel",
"application/vnd.ms-powerpoint", 
"application/pdf",
"text/html", 
"text/css",
"audio/aiff",
"audio/mpeg",
"audio/wav",
"audio/x-ms-wma",
"video/msvideo", 
"video/avi",
"video/mpeg",
"video/x-ms-wmv"
);

// Variables récupérées par méthode POST du formulaire
$fname = $_FILES['fichier']['name'];
$ftype = $_FILES ['fichier']['type'];
$fsize = $_FILES ['fichier']['size'];
$ftmp = $_FILES ['fichier']['tmp_name'];
$extension_upload = substr( strrchr($_FILES['fichier']['name'], '.') ,1); 

// Divers tests afin de savoir si :

// Le format de fichier correspond à notre tableau array
if(!in_array($ftype, $allowed_types)){$error = 1;}

// La taille du fichier n'est pas dépassée
if($fsize > $MAX_FILE_SIZE){$error = 2;}

// Si le fichier existe déjà
if (file_exists('./upload/'.$fname))
{
//Si le fichier existe, on rajoute dans son nom, la date et l'heure pour le différencier de la première (comme ça, on est sûr de ne pas avoir 2 images avec le même nom)
$nom_final= preg_replace("'.$extension_upload'is",date("ldSFY-h.i.s-A").".$extension_upload",$fname);
}
else {
$nom_final=$fname; //l'image n'existe pas on garde le même nom
}
//on déplace l'image dans le répertoire final
move_uploaded_file($ftmp,'./upload/'.$nom_final); {$error = 0;}


// Messages avec apostrophe
$m1 = ' à l\'emplacement suivant : ';
$m2 = htmlspecialchars($m1);


// Switch servant simplement à la gestion des erreures
switch($error){
case'0':
echo("<h3>Fichier correctement envoyé !</h3>");
echo ('<br/>');
echo ('<br/>');
//L'image apparait après validation avec son nom, son emplacement, son type et son poids
echo '<img src="./upload/'.$nom_final.'" border="0" />';
echo "<br/><br/>Le nom dorigine du fichier est '" . $fname . "'.<br/>";
echo "Le fichier a été téléchargé avec succès"  . $m2  . '/upload/'.$nom_final . "'<br/>";
echo "Le type du fichier est '" . $ftype . "'.<br/>";
echo "La taille du fichier est de '" . $fsize . " octets'.<br/>";
echo '<a href="javascript:history.back();" align="center">Retour</a>';
break;
case'1':
echo("Format de fichier incorrecte.");
break;
case'2':
echo("Fichier trop volumineux.");
break;
}
?>




MERCI pour toutes vos futures réponses

Belokan



8 réponses

rodoplop Messages postés 77 Date d'inscription vendredi 16 septembre 2011 Statut Membre Dernière intervention 6 juillet 2012 12
15 juin 2012 à 00:35
Bonjour,

Tout d'abord, il faut savoir que l'upload de fichier en PHP est toujours contraignant à gérer.
En effet le PHP s'executant coté serveur, peut importe les contrôles effectués, le script essayera toujours d'uploader le fichier. C'est seulement quand le fichier ets uploadé que les contrôles sur la taille et l'extension peuvent être effectués.

Dans ton cas, lorsque tu dit que ca ne fonctionne pas, est ce que cela veut dire qu'il t'affiche toujours la page de succès ? (lorsque error = 0 ?)

ton contrôle sur le champ error n'est pas très bon mais le problème c'est surtout que tu fait tes contrôles uniquement à la fin de ton fichier.

de ce fait même si tu n'a pas la bonne extension ou si le fichier est trop volumineux, tu fait quand même le move_upload_file()
alors que cela ne devrait être fait que s'il n'y à pas eu d'erreur avant.

<?
// Taille maximum
$MAX_FILE_SIZE = 100;

// Dossier de destination du fichier
$folder = "upload/";

// Tableau array des différents types
$allowed_types = array(
"image/bmp", 
"image/gif", 
"image/pjpeg", 
"image/jpeg", 
"image/jpg", 
"image/png", 
"image/tiff",
"application/postscript",
"image/psd",
"application/x-shockwave-flash", 
"multipart/x-zip", 
"application/msword", 
"application/excel",
"application/vnd.ms-powerpoint", 
"application/pdf",
"text/html", 
"text/css",
"audio/aiff",
"audio/mpeg",
"audio/wav",
"audio/x-ms-wma",
"video/msvideo", 
"video/avi",
"video/mpeg",
"video/x-ms-wmv"
);

// Variables récupérées par méthode POST du formulaire
$fname = $_FILES['fichier']['name'];
$ftype = $_FILES ['fichier']['type'];
$fsize = $_FILES ['fichier']['size'];
$ftmp = $_FILES ['fichier']['tmp_name'];
$extension_upload = substr( strrchr($_FILES['fichier']['name'], '.') ,1); 

// Divers tests afin de savoir si :

// Le format de fichier correspond à notre tableau array
if(!in_array($ftype, $allowed_types))
{
echo("Format de fichier incorrecte.");
}
else if($fsize > $MAX_FILE_SIZE){
// La taille du fichier n'est pas dépassée
echo("Fichier trop volumineux.");
}
else
{
 // Si le fichier existe déjà
  if (file_exists('./upload/'.$fname))
  {
    //Si le fichier existe, on rajoute dans son nom, la date et l'heure pour le     différencier de la première (comme ça, on est sûr de ne pas avoir 2 images avec   le même nom)
    $nom_final= preg_replace("'.$extension_upload'is",date("ldSFY-h.i.s-  A").".$extension_upload",$fname);
  }
  else {
    $nom_final=$fname; //l'image n'existe pas on garde le même nom
  }
  //on déplace l'image dans le répertoire final
  if(move_uploaded_file($ftmp,'./upload/'.$nom_final)) 
  {
   // Messages avec apostrophe
  $m1 = ' à l\'emplacement suivant : ';
  $m2 = htmlspecialchars($m1);
  echo("<h3>Fichier correctement envoyé !</h3>");
  echo ('<br/>');
  echo ('<br/>');
  //L'image apparait après validation avec son nom, son emplacement, son type   et son poids
  echo '<img src="./upload/'.$nom_final.'" border="0" />';
  echo "<br/><br/>Le nom dorigine du fichier est '" . $fname . "'.<br/>";
  echo "Le fichier a été téléchargé avec succès"  . $m2  . '/upload/'.$nom_final .   "'<br/>";
  echo "Le type du fichier est '" . $ftype . "'.<br/>";
  echo "La taille du fichier est de '" . $fsize . " octets'.<br/>";
  echo '<a href="javascript:history.back();" align="center">Retour</a>';
  }
  else
  {
    echo ("erreur lors du déplacement du fichier.");
  }
}
?>


j'ia également ajouté un test sur le move_uploaded_file qui peut te renvoyer une erreur s'il n'arrive pas a modifier le fichier
1
Belokanfr Messages postés 19 Date d'inscription lundi 4 juillet 2011 Statut Membre Dernière intervention 28 juin 2012
15 juin 2012 à 00:39
Merci rodoplop pour ta réponse rapide !

J'essaye, et je fais un retour !
0
Belokanfr Messages postés 19 Date d'inscription lundi 4 juillet 2011 Statut Membre Dernière intervention 28 juin 2012
Modifié par Belokanfr le 15/06/2012 à 00:48
Alors rodoplop, ça fonctionne impeccablement.

Mais je souhaite avoir quelques petites précisions :
tu as supprimé tous les $error pour mettre direct un echo avec le texte adéquate, mais n'était-il pas possible de garder les $error ?

Bon sinon, je suis ravi que tu ais pu m'aider, car cela faisait deux jours que j'étais dessus et mes idées n'étaient plus toutes claires !

MERCI !
0
rodoplop Messages postés 77 Date d'inscription vendredi 16 septembre 2011 Statut Membre Dernière intervention 6 juillet 2012 12
15 juin 2012 à 14:54
Si bien sur tu peux garder ta variable error

en fait ton soucis vient plutôt de tes if.

tu fait bien tes test au début sur la taille de ton fichier et l'extension. Mais à la fin tu fait quand même le move_uploaded_file (même si tu as des erreurs sur la taille ou l'extension) et tu passe ta variable error à 0

du coup dans ton switch, error est toujours à 0 et la page de succès s'affiche.

de ce fait en gardant les if(){}else{} comme dans mon code tu n'a plus ce soucis, car tu ne fait le move que si tu n'a pas eu d'erreur avant.

le seul soucis avec une telle gestion d'erreur c'est que si je met un fichier trop gros et qui à une mauvaise extension, on affiche qu'une erreur à la fois.

Dans ce cas, il faudrait plutôt stocker tes erreurs dans un tableau $error[] et ensuite au lieu d'un switch, tu boucle sur ton tableau erreur pour afficher les messages correspondant.

Je ne suis pas très bon pour les explications, si tu souhaite encore de l'aide, n'hésite pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Belokanfr Messages postés 19 Date d'inscription lundi 4 juillet 2011 Statut Membre Dernière intervention 28 juin 2012
15 juin 2012 à 15:27
Bonjour rodoplop,

effectivement, j'ai procédé comme tu le dis et je me suis appuyé sur ce que tu as poster pour remettre mon code à ma sauce avec les $error 1, 2 et 3.

Tes explications sont très clairs, et j'ai pu effectivement, grâce à ton intervention, voir où le code ne fonctionnait pas.

Maintenant, je dois essayer de trouver comment faire pour supprimer les espaces dans un fichier qui serait uploader, c'est à dire :
"nom du fichier" en "nomdufichier".

Merci pour ton intervention qui me fût d'une grande aide précieuse !
0
rodoplop Messages postés 77 Date d'inscription vendredi 16 septembre 2011 Statut Membre Dernière intervention 6 juillet 2012 12
15 juin 2012 à 16:14
Le plus simple pour ça c'est d'utiliser la fonction srt_replace

str_replace(' ', '', $maVar);

elle remplace les espace présent dans $maVar par "rien". Cela te supprime donc tes espaces.

Par contre pour un soucis de facilité de lecture, je te recommande de ne pas remplacer les espaces par du vide mais plutôt de les remplacer par un underscore

str_replace(' ', '_', $maVar);

De ce fait tu n'as plus le problème des espace et tes fichiers reste plus simple à lire !
0
Belokanfr Messages postés 19 Date d'inscription lundi 4 juillet 2011 Statut Membre Dernière intervention 28 juin 2012
15 juin 2012 à 16:50
Merci rodoplop, je tente et je fais un retour
0
Belokanfr Messages postés 19 Date d'inscription lundi 4 juillet 2011 Statut Membre Dernière intervention 28 juin 2012
Modifié par Belokanfr le 15/06/2012 à 17:06
Re !

Donc effectivement, ça fonctionne parfaitement !
Et c'est bien vu, du coup, lorsqu'il existe un doublon sur le serveur, on rajoute la date, et j'ai rajouté un underscore avant celle-ci de façon à ce qu'on distingue bien la date du nom du fichier !

Un grand merci !!!

Je poste tout de même l'évolution, si ça peut servir :


if (file_exists('./upload/'.$fname)) 
  { 
    //Si le fichier existe, on rajoute dans son nom, la date et l'heure pour le     différencier de la première (comme ça, on est sûr de ne pas avoir 2 images avec   le même nom) 
    $nom_final= preg_replace("'.$extension_upload'is",date("_ldSFY-h.i.s-  A").".$extension_upload",$fname); 
    $nom_final = str_replace(' ', '_', $nom_final); 
  } 
  else { 
    $nom_final=$fname; //l'image n'existe pas on garde le même nom 
  } 



Encore un grand MERCI !!!
0