Bug dans la gestion des exceptions d'un formulaire

Barbotin -  
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   -
Invité n'ayant pas de compte PHPfrance il y a 16 minutes
bonjour

voici mon problème

j'ai un formulaire html classique qui fonctionne MAIS !!

je voudrais créer des exceptions au cas où il n'y aurait pas beaucoup d'images à insérer

pour cela j'ai mis un if(isset($_FILES) autour du code

avec cela, le code est correctement inséré mais j'ai une erreur si le fichier reste vide : Erreur fatale : Erreur de valeur non détectée : Le chemin ne peut pas être vide dans /....

donc je remplace $_FILES par $_POST mais dans ce cas aucun fichier n'est mis à jour (présent ou non)

donc j'ai mis un var_dump($_POST) pour voir ce qui se passe et surprendre !! aucun $_POST['photo'] et aucun $_POST['alt'] n'apparaissent !!

question :

comment puis-je faire pour traiter une exception au cas où il n'y aurait qu'une seule photo à enregistrer sans obtenir d'erreur de copie ou d'erreur bdr ?

voici les codes :

<?php
require_once("init.inc.php");
//--- ENREGISTREMENT PRODUIT ---//
if(!empty($_POST))
var_dump($_POST);
{
if ( isset($_FILES['photo1']))
{
$photo_bdd = "";
$photo_dossier = "";
$v=1;
$prepa_name1 = substr($_POST['titre'], 0, 45);
$name1= $prepa_name1 . $v . ".jpg" ;
$photo_bdd1 = RACINE_SITE . "photos/$_POST[categorie]/$name1";
$photo_dossier = $_SERVER['DOCUMENT_ROOT'] . RACINE_SITE . "/photos/$_POST[categorie]/$name1";
copy($_FILES['photo1']['tmp_name'],$photo_dossier);
$_FILES['photo1'] ="";
$v++ ;
}
$character= "'";
$replace = "\'" ;
$description1 = $_POST['description1'];
$description1 = str_replace ( $character , $replace , $description1, ) ;
//$character= "jusqu'a";
//$replace = "jusqu\'a" ;
//$description1 = $_POST['description1'];
//$description1 = str_replace ( $character , $replace , $description1, ) ;
echo $description1 ;

if ( isset($_FILES['photo2']))
{
$photo_bdd = "";
$photo_dossier = "";
$prepa_name2 = substr($_POST['titre'], 0, 45);
$name2= $prepa_name2 . $v . ".jpg" ;
$photo_bdd2 = RACINE_SITE . "photos/$_POST[categorie]/$name2";
$photo_dossier = $_SERVER['DOCUMENT_ROOT'] . RACINE_SITE . "/photos/$_POST[categorie]/$name2";
copy($_FILES['photo2']['tmp_name'],$photo_dossier);
$v++ ;
}
$character= "'";
$replace = "\'" ;
$description2 = $_POST['description2'];
$description2 = str_ireplace ( $character , $replace , $description2 ) ;
//echo $description2 ;

if ( isset($_FILES['photo3']))
{
$photo_bdd = "";
$photo_dossier = "";
$prepa_name3 = substr($_POST['titre'], 0, 45);
$name3= $prepa_name3 . $v . ".jpg" ;
$photo_bdd3 = RACINE_SITE . "photos/$_POST[categorie]/$name3";
$photo_dossier = $_SERVER['DOCUMENT_ROOT'] . RACINE_SITE . "/photos/$_POST[categorie]/$name3";
copy($_FILES['photo3']['tmp_name'],$photo_dossier);
$v++ ;
}
$character= "'";
$replace = "\'" ;
$description3 = $_POST['description3'];
$description3 = str_ireplace ( $character , $replace , $description3, ) ;
//echo $description3 ;

if ( isset($_FILES['photo4']))
{
$photo_bdd = "";
$photo_dossier = "";
$prepa_name4 = substr($_POST['titre'], 0, 45);
$name4= $prepa_name4 . $v . ".jpg" ;
$photo_bdd4 = RACINE_SITE . "photos/$_POST[categorie]/$name4";
$photo_dossier = $_SERVER['DOCUMENT_ROOT'] . RACINE_SITE . "/photos/$_POST[categorie]/$name4";
copy($_FILES['photo4']['tmp_name'],$photo_dossier);
$v++ ;
}
$character= "'";
$replace = "\'" ;
$description4 = $_POST['description4'];
$description4 = str_ireplace ( $character , $replace , $description4, ) ;
//echo $description4 ;

if ( isset($_FILES['photo5']))
{
$photo_bdd = "";
$photo_dossier = "";
$prepa_name5 = substr($_POST['titre'], 0, 45);
$name5= $prepa_name5 . $v. ".jpg" ;
$photo_bdd5 = RACINE_SITE . "photos/$_POST[categorie]/$name5";
$photo_dossier = $_SERVER['DOCUMENT_ROOT'] . RACINE_SITE . "/photos/$_POST[categorie]/$name5";
copy($_FILES['photo5']['tmp_name'],$photo_dossier);
$v++ ;
}

$character= "'" ;
$replace = "\'" ;
$description5 = $_POST['description5'];
$description5 = str_ireplace ( $character , $replace , $description5, ) ;
//echo $description5 ;

$character= "'" ;
$replace = "\'" ;
$description6 = $_POST['description6'];
$description6 = str_replace ( $character , $replace , $description6, ) ;
//echo $description6 ;


$character= "'";
$replace = "\'" ;
$detail1 = $_POST['detail1'];
$detail1 = str_ireplace ( $character , $replace , $detail1, ) ;

$character= "'";
$replace = "\'" ;
$detail2 = $_POST['detail2'];
$detail2 = str_ireplace ( $character , $replace , $detail2, ) ;

$character= "'";
$replace = "\'" ;
$detail3 = $_POST['detail3'];
$detail3 = str_ireplace ( $character , $replace , $detail3, ) ;

$character= "'";
$replace = "\'" ;
$detail4 = $_POST['detail4'];
$detail4 = str_ireplace ( $character , $replace , $detail4, ) ;

$character= "'";
$replace = "\'" ;
$detail5 = $_POST['detail5'];
$detail5 = str_ireplace ( $character , $replace , $detail5, ) ;

$character= "'";
$replace = "\'" ;
$detail6 = $_POST['detail6'];
$detail6 = str_ireplace ( $character , $replace , $detail6, ) ;

$character= "'";
$replace = "\'" ;
$detail7 = $_POST['detail7'];
$detail7 = str_ireplace ( $character , $replace , $detail7, ) ;


$character= "'";
$replace = "\'" ;
$detail_livraison = $_POST['detail_livraison'];
$detail_livraison = str_ireplace ( $character , $replace , $detail_livraison, ) ;

$character= "'";
$replace = "\'" ;
$detail_prix = $_POST['detail_prix'];
$detail_prix = str_ireplace ( $character , $replace , $detail_prix, ) ;

echo ' <br/>';
$exec =executeRequete("INSERT INTO produit
(
groupe,
categorie,
titre,
description1,
evaluation1,
evaluation2,
detail_livraison,
detail1,
detail2,
detail3,
detail4,
detail5,
detail6,
detail7,
stock,
prix,
detail_prix,
photo1,
alt1,
photo2,
alt2,
photo3,
alt3,
photo4,
alt4,
photo5,
alt5,
description2,
description3,
description4,
description5,
description6,
lien,
magasin,
divers
)
values
(
'$_POST[groupe]',
'$_POST[categorie]',
'$_POST[titre]',
'$description1',
'$_POST[evaluation1]',
'$_POST[evaluation2]',
'$detail_livraison',
'$detail1',
'$detail2',
'$detail3',
'$detail4',
'$detail5',
'$detail6',
'$detail7',
'$_POST[stock]',
'$_POST[prix]',
'$detail_prix',
'$photo_bdd1',
'$prepa_name1',
'$photo_bdd2',
'$prepa_name2',
'$photo_bdd3',
'$prepa_name3',
'$photo_bdd4',
'$prepa_name4',
'$photo_bdd5',
'$prepa_name5',
'$description2',
'$description3',
'$description4',
'$description5',
'$description6',
'$_POST[lien]',
'$_POST[magasin]',
'$_POST[divers]'
)");

$contenu .= '<div class="validation">Le produit a été ajouté</div>';
}
?>


<?php
if(isset($_GET['action']) && ($_GET['action'] == 'ajout'))
{
echo '
<h1> Formulaire Produits </h1>
<form method="post" enctype="multipart/form-data" action="">

<label for="groupe">groupe</label><br>
<input type="text" id="groupe" name="groupe" placeholder="Groupe"><br><br>

<label for="categorie">categorie</label><br>
<input type="text" id="categorie" name="categorie" placeholder="Categorie"><br><br>

<label for="titre">titre</label><br>
<input type="text" id="titre" name="titre" placeholder="Titre"><br><br>

<label for="description1">description1</label><br>
<input type="text" id="description1" name="description1" placeholder="Description1"><br><br>

<label for="evaluation1">evaluation1</label><br>
<input type="text" id="evaluation1" name="evaluation1" placeholder="Evaluation1"><br><br>

<label for="evaluation2">evaluation2</label><br>
<input type="text" id="evaluation2" name="evaluation2" placeholder="Evaluation2"><br><br>

<label for="detail_livraison">Detail_livraison</label><br>
<input type="text" id="detail_livraison" name="detail_livraison" placeholder="Detail_livraison"><br><br>

<label for="detail1">detail1</label><br>
<input type="text" id="detail1" name="detail1" placeholder="detail1"><br><br>

<label for="detail2">detail2</label><br>
<input type="text" id="detail2" name="detail2" placeholder="detail2"><br><br>

<label for="detail3">detail3</label><br>
<input type="text" id="detail3" name="detail3" placeholder="detail3"><br><br>


<label for="detail4">detail4</label><br>
<input type="text" id="detail4" name="detail4" placeholder="detail4"><br><br>


<label for="detail5">detail5</label><br>
<input type="text" id="detail5" name="detail5" placeholder="detail5"><br><br>


<label for="detail6">detail6</label><br>
<input type="text" id="detail6" name="detail6" placeholder="detail6"><br><br>


<label for="detail7">detail7</label><br>
<input type="text" id="detail7" name="detail7" placeholder="detail7"><br><br>

<label for="stock">stock</label><br>
<input type="text" id="stock" name="stock" placeholder="stock"><br><br>

<label for="prix">prix</label><br>
<input type="text" id="prix" name="prix" placeholder="prix"><br><br>

<label for="detail_prix">detail_prix</label><br>
<input type="text" id="detail_prix" name="detail_prix" placeholder="Detail_prix "><br><br>

<label for="photo1">photo1</label><br>
<input type="file" id="photo1" name="photo1"><br><br>

<label for="photo2">photo2</label><br>
<input type="file" id="photo2" name="photo2"><br><br>

<label for="photo3">photo3</label><br>
<input type="file" id="photo3" name="photo3"><br><br>

<label for="photo4">photo4</label><br>
<input type="file" id="photo4" name="photo4"><br><br>

<label for="photo5">photo5</label><br>
<input type="file" id="photo5" name="photo5"><br><br>

<label for="description2">description2</label><br>
<input type="text" id="description2" name="description2" placeholder="Description2"><br><br>

<label for="description3">description3</label><br>
<input type="text" id="description3" name="description3" placeholder="Description3"><br><br>

<label for="description4">description4</label><br>
<input type="text" id="description4" name="description4" placeholder="Description4"><br><br>

<label for="description5">description5</label><br>
<input type="text" id="description5" name="description5" placeholder="Description5"><br><br>

<label for="description6">description6</label><br>
<input type="text" id="description6" name="description6" placeholder="Description6"><br><br>

<label for="lien">lien</label><br>
<input type="text" id="lien" name="lien" placeholder="Lien du produit"><br><br>

<label for="magasin">magasin</label><br>
<input type="text" id="magasin" name="magasin" placeholder="Amazone"><br><br>

<label for="divers">divers</label><br>
<input type="text" id="divers" name="divers" placeholder="divers"><br><br>

<input type="submit" value="enregistrement du produit">
</form>';
}
?>

voici le retour du var_dump($_POST)

array(25) { ["groupe"]=> string(6) "mlkmlk" ["categorie"]=> string(4) "test" ["titre"]=> string(4) "test" ["description1 "]=> string(0) "" ["evaluation1"]=> string(0) "" ["evaluation2"]=> string(0) "" ["detail_livraison"]=> string(0) "" [ "detail1"]=> chaîne(0) "" ["detail2"]=> chaîne(0) "" ["detail3"]=> chaîne(0) "" ["detail4"]=> chaîne(0) " " ["detail5"]=> chaîne(0) "" ["detail6"]=> chaîne(0) "" ["detail7"]=> chaîne(0) "" ["stock"]=> chaîne(0) ) "" ["prix"]=> string(0) "" ["detail_prix"]=> string(0) "" ["description2"]=> string(0) "" ["description3"]=> string(0) "" ["description4"]=> string(0) "" ["description5"]=> string(0) "" ["description6"]=> string(0) "" ["lien"]=> string(0) "" ["magasin"]=> string(0) "" ["divers"]=> chaîne(0) "" }chaîne(0) "" ["divers"]=> chaîne(0) "" }chaîne(0) "" ["divers"]=> chaîne(0) "" }

vous ne pouvez voir aucune photo et alt apparaît

merci pour votre aide
A voir également:

5 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

Avant tout, merci à l'avenir d'utiliser correctement les balises de code ( en précisant le LANGAGE dans les balises ( j'ai édité ton premier code pour que tu vois la différence )
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

A la place de la fonction COPY, Commence par utiliser les fonctions is_uploaded_file() et move_uploaded_file()
https://www.php.net/manual/fr/function.is-uploaded-file.php
https://www.php.net/manual/fr/function.move-uploaded-file.php

Tu devrais également, au lieu de répéter 5 fois le même code... créer une FONCTION .. ça rendrait ton code plus lisible et plus propre....

Il serait pas mal aussi de faire de l'indentation dans ton code ( là aussi, dans le but de le rendre lisible )

Et enfin .. ISSET() vérifie si la variable existe ....
Pour vérifier que la variable existe ET n'est pas vide, il faut utiliser !empty()
0
Barbotin
 
bonjour

j'ai essaye !empty mais j'ai toujours l'erreur Fatal error: Uncaught ValueError: Path cannot be empty in /... line 16
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Si tu ne nous montres pas tes modifications ... impossible de te dire ce qui coince ...
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
et j'espère que tu n'as pas seulement essayé le !empty... mais aussi appliqué les autres fonctions que je t'ai indiqué !
0
Barbotin
 
les fonctions sont secondaires le principal pour moi est de regler ce probleme

voici le code

if ( !empty($_FILES['photo2']))
{
$photo_bdd = "";
$photo_dossier = "";
$prepa_name2 = substr($_POST['titre'], 0, 45);
$name2= $prepa_name2 . $v . ".jpg" ;
$photo_bdd2 = RACINE_SITE . "photos/$_POST[categorie]/$name2";
$photo_dossier = $_SERVER['DOCUMENT_ROOT'] . RACINE_SITE . "/photos/$_POST[categorie]/$name2";
copy($_FILES['photo2']['tmp_name'],$photo_dossier);
$v++ ;
}
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Pour moi certaines choses sont primordiales ... comme le fait que je t'ai demandé de poster correctement ton code ...
(je t'ai même donné un lien qui explique comment faire (en indiquant le langage )

Ensuite ... les fonctions is_uploaded_file() et move_uploaded_file() sont LES FONCTIONS à utiliser pour uploader des fichiers sur un serveur... et certainement pas la fonction copy !!

mais comme je sens que tu n'as pas envie de progresser et que tu préfères copier/coller des codes trouvés bêtement sur internet.. je te propose ceci :
<?php
function uploadFile($file, $newFileName, $directory2Upload=""){
  
  if(empty($file)){
    //aucun fichier à uploader
    return false;
  }
  
  // get details of the uploaded file
  $fileTmpPath = $file['tmp_name'];
  //$fileName = $file['name'];
  //$fileSize = $file['size'];
  //$fileType = $file['type'];
  //$fileNameCmps = explode(".", $fileName);
  //$fileExtension = strtolower(end($fileNameCmps));
 
 $fileError = $file['error'];
  if($fileError){
    echo "Erreur lors du chargement du fichier " . $fileError;
    return false;
  }  
    
  if (!is_uploaded_file($fileTmpPath)) {
    echo " Erreur lors de l'upload du fichier " . $fileTmpPath;
    return false;
  }
  
  $finalPath = $directory2Upload . $newFileName;
  
  if(!move_uploaded_file($fileTmpPath, $finalPath)){
    echo " Erreur lors de l'upload du fichier " . $fileTmpPath . " vers : " . $finalPath;
    return false;
  }
    
  return $finalPath;
}


Et pour l'utiliser



$v=1;
$prepa_name1 = substr($_POST['titre'], 0, 45);
$name1= $prepa_name1 . $v . ".jpg" ;
$photo_dossier = RACINE_SITE .  "/photos/".$_POST['categorie']."/"; 
$file1 = !empty($_FILES['photo1']) ? $_FILES['photo1'] : null;
uploadFile($file1, $name1, $photo_dossier);

0
Barbotin
 
bonjor

- svp pouvez vous m'expliquer la ligne

$file1 = !empty($_FILES['photo1']) ? $_FILES['photo1'] : null; et la difference avec la variable

$name1 car dans le dossier photo apres copie j'obtiens ce resultat :

nomdelaphoto.jpg.nomdelaphoto.jpg (ce qui correspond a la ligne

" uploadFile($file1,$name1, $photo_dossier); " )

- ca rentre quatres photos dans la bdd alors que le formulaire est cense etre vide (j'ai tente l'operation en ne rentrant qu'une seule photo )

- j'ai l'erreur "Erreur lors du chargement du fichier 4Erreur lors du chargement du fichier 4Erreur lors du chargement du fichier 4Erreur lors du chargement du fichier 4 " qui s'affiche il doit donc y avoir une erreur sur la variable $fileError

( j'ai fait un copier coller de votre code )


if ( !empty($_FILES['photo1']))
{
 $v=1;
 $prepa_name1 = substr($_POST['titre'], 0, 45);
 $name1= $prepa_name1 . $v . ".jpg" ;
 $file1 = !empty($_FILES['photo1']) ? $_FILES['photo1'] : null;
 $photo_dossier = $_SERVER['DOCUMENT_ROOT'] . RACINE_SITE . 
 "/photos/$_POST[categorie]/$name1"; 
 $photo_bdd1 = RACINE_SITE . "photos/$_POST[categorie]/$name1";
 uploadFile($file1,$name1, $photo_dossier);
}
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Tu me parles de Bdd.... Alors que le code montrer ne touche aucunement à la base de données...
Le code que tu nous montres depuis le début et que je t'ai modifier, sert à donner le fichier sur le serveur...(dans un dossier de celui-ci)
À aucun moment cela ne fait un update ou un insert dans la base...
Ensuite, tu dis avoir fait un copier-coller de mon code sauf que en regardant, non, ce n'est pas du tout le même...
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
Désolé .. visiblement lors de mon copier/coller j'ai omis une variable
$photo_dossier = RACINE_SITE .  "/photos/".$_POST['categorie']."/"; 
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
et pour la ligne
 $file1 = !empty($_FILES['photo1']) ? $_FILES['photo1'] : null;

regarde ce qu'est l'écriture ternaire http://www.finalclap.com/faq/102-php-operateur-ternaire
0

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

Posez votre question
Barbotin
 
bonjour

j'ai simplement supprimé $name1 dans la ligne
uploadFile($file1,$name1, $photo_dossier);

et ca marche

j'ai toujours une erreur sur la variable $ fileError et ce message qui s'affiche :
"Erreur lors du chargement du fichier 4Erreur lors du chargement du fichier 4Erreur lors du chargement du fichier 4Erreur lors du chargement du fichier 4 " 

qui correspond aux 4 non uploads des photos 2 à 5 ( logiquement ca devrait donc marquer:
 "Erreur lors du chargement du fichier 2Erreur lors du chargement du fichier 3Erreur lors du chargement du fichier 4Erreur lors du chargement du fichier 5 " )

)
de plus la ligne
if ( !empty($_FILES['photo1']))
n'est pas respectee le code s'applique meme si il n'ya pas de POST
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Le code erreur 4 corresspond à

UPLOAD_ERR_NO_FILE
Valeur : 4. Aucun fichier n'a été téléchargé.


C'est le code
 $fileError = $file['error'];
  if($fileError){
    echo "Erreur lors du chargement du fichier " . $fileError;
    return false;
  }

qui te l'affiche..
Si tu ne veux pas voir le message .. il suffit de retirer le echo
0