Problème upload PHP

godisadj
Invité n'ayant pas de compte PHPfrance

07 mars 2019, 13:48

Bonjour,
Je suis coincé !!

J'ai un petit script d'upload PHP qui fonctionne sur une page test.php.
Voici le code.
<?php

if(isset($_FILES['proof']))
{
	$total = count($_FILES['proof']['name']);

	$piece_jointe = NULL;

	for ($i=0; $i < $total ; $i++) 
	{ 

		if(isset($_FILES['proof']['name'][$i]) AND !empty($_FILES['proof']['name'][$i])) {

			$currentDir = getcwd();
			$uploadDirectory = "/assets/images/pj/";

			$fileExtensions = ['jpeg','jpg','png', 'gif', 'pdf', 'txt', 'doc', 'JPEG', 'JPG', 'PNG', 'GIF', 'PDF', 'DOC', 'TXT']; // Get all the file extensions

			$fileName = $_FILES['proof']['name'][$i];
			$fileSize = $_FILES['proof']['size'][$i];
			$fileTmpName  = $_FILES['proof']['tmp_name'][$i];
			$fileType = $_FILES['proof']['type'][$i];

			$fileExtension = pathinfo($fileName);
			$fileExtension = $fileExtension['extension'];

			if (! in_array($fileExtension,$fileExtensions)) {
				$erreur = 'Le format du fichier '.$fileName.' n\'est pas autorisé. Veuillez réessayer avec un fichier de type PNG, JPG, GIF, PDF ou DOC.';
				afficherErreur($erreur);
				$stop = 1;
			}

			if ($fileSize > 5000000) {
				$erreur = 'La taille du fichier ne doit pas excéder 5Mo. Veuillez réessayer avec un fichier plus léger.';
				afficherErreur($erreur);
				$stop = 1;
			}

			if (!isset($stop)) {

				     //On renomme  le fichier avec un token unique
				$token = base_convert(hash('sha256', time() . mt_rand()), 8, 36);
				$fileName = $token.'.'.$fileExtension;

				//On créé le chemin d'upload
				$uploadPath = $currentDir . $uploadDirectory . basename($fileName);

				$didUpload = move_uploaded_file($fileTmpName, $uploadPath);

				$proof_OK = 1;
                //Enfin on le nomme pour la BDD
				$piece_jointe .= $fileName.',';

				if ($didUpload) {
					//Succès
				} else {
					$erreur = 'Une erreur est survenue lors du chargement du fichier. Merci de contacter un administrateur.';
					afficherErreur($erreur);
				}
			}
		}
	}
}




?>

<form action="" method="post" enctype="multipart/form-data">
	Upload a File:
	<input type="file" name="proof[]" id="fileToUpload" multiple>
	<button type="submit" name="create" value="Upload" >Yess</button>
</form>
Maintenant, je veux le faire marcher dans un formulaire plus large, avec d'autres paramètres.. Et ça ne fonctionne plus du tout ! Au moment de l'upload, l'erreur"Une erreur est survenue lors du chargement du fichier. Merci de contacter un administrateur." apparait. Pourtant, le script ne remonte aucune erreur, sauf move_uploaded_file qui retourne FALSE. $_FILES['proof']['error'], retourne 0.

J'en peux plus, je n'arrive pas à voir ce qui diffère entre ces deux scripts, positionnés dans le même répertoire.

Voici le code qui ne fonctionne pas (dans la totalité) :
<?php 
require_once('includes/config.php');

$title = 'Absence & Maladie'; 
include('includes/head.php');
include('includes/nav.php');
include('includes/ft.php');

?>


<!-- [ Main Content ] start -->
<div class="pcoded-main-container">
	<div class="pcoded-wrapper">
		<div class="pcoded-content">
			<div class="pcoded-inner-content">
				<!-- [ breadcrumb ] start -->
				<div class="page-header">
					<div class="page-block">
						<div class="row align-items-center">
							<div class="col-md-12">
								<div class="page-header-title">
									<h5 class="m-b-10"><?php echo $title; ?></h5>
								</div>
								<ul class="breadcrumb">
									<li class="breadcrumb-item"><a href="index.php"><i class="feather icon-home"></i></a></li>
									<li class="breadcrumb-item"><a href="javascript:"><?php echo $title; ?></a></li>
								</ul>
							</div>
						</div>
					</div>
				</div>
				<!-- [ breadcrumb ] end -->
				<div class="main-body">
					<?php 


					if(isset($_POST['create']))
					{
                    //Le formulaire a bel et bien été envoyé
                    //On vérifie que tous les champs obligatoires sont renseignés 

                    //On traite les données entrées par l'utilisateur
						if(
							isset($_POST['employee']) AND
							isset($_POST['absence_type']) AND
							isset($_POST['date_debut'])
						)
						{
                        //Les données obligatoires sont toutes OK, on les traite
							$employee = $_POST['employee'];
							$absence_type = $_POST['absence_type'];
							$date_debut = UserToBddDate($_POST['date_debut']);

                        //On définit les champs non obligatoires par NULL
							$date_fin = NULL;
							$reason = NULL;
							$proof_OK = 0;


                        //On traite les valeurs facultatives si elles existent
							if(isset($_POST['date_fin'])) { $date_fin = UserToBddDate($_POST['date_fin']); }
							if(isset($_POST['reason'])) { $reason = $_POST['reason']; }

                        // Enfin, on traite les données automatiques
							$timestamp = time();
							$planning_time = NULL;
							$employee_time = NULL;


                        // TODO : MODIFIER PAR SESSION
							$author_id = 1;


                        //Pièce jointe
							if(!empty($_FILES['proof']))
							{

								$total = count($_FILES['proof']['name']);

								$piece_jointe = NULL;

								for ($i=0; $i < $total ; $i++) 
								{ 

									if(isset($_FILES['proof']['name'][$i]) AND !empty($_FILES['proof']['name'][$i])) {

										$currentDir = getcwd();
										$uploadDirectory = "/assets/images/pj/";

										$fileExtensions = ['jpeg','jpg','png', 'gif', 'pdf', 'txt', 'doc', 'JPEG', 'JPG', 'PNG', 'GIF', 'PDF', 'DOC', 'TXT']; // Get all the file extensions

										$fileName = $_FILES['proof']['name'][$i];
										$fileSize = $_FILES['proof']['size'][$i];
										$fileTmpName  = $_FILES['proof']['tmp_name'][$i];
										$fileType = $_FILES['proof']['type'][$i];

										$fileExtension = pathinfo($fileName);
										$fileExtension = $fileExtension['extension'];

										if (! in_array($fileExtension,$fileExtensions)) {
											$erreur = 'Le format du fichier '.$fileName.' n\'est pas autorisé. Veuillez réessayer avec un fichier de type PNG, JPG, GIF, PDF ou DOC.';
											afficherErreur($erreur);
											$stop = 1;
										}

										if ($fileSize > 5000000) {
											$erreur = 'La taille du fichier ne doit pas excéder 5Mo. Veuillez réessayer avec un fichier plus léger.';
											afficherErreur($erreur);
											$stop = 1;
										}

										if (!isset($stop)) {

				     						//On renomme  le fichier avec un token unique
											$token = base_convert(hash('sha256', time() . mt_rand()), 8, 36);
											$fileName = $token.'.'.$fileExtension;

											//On créé le chemin d'upload
											$uploadPath = $currentDir . $uploadDirectory . basename($fileName);

											$didUpload = move_uploaded_file($fileTmpName, $uploadPath);

											$proof_OK = 1;
                							//Enfin on le nomme pour la BDD
											$piece_jointe .= $fileName.',';

											if ($didUpload) {
											//Succès
											} else {

												$erreur = 'Une erreur est survenue lors du chargement du fichier. Merci de contacter un administrateur.';
												afficherErreur($erreur);
												var_dump($_FILES['proof']['error']);
											}
										}
									}
								}
							}


							if($proof_OK == 1) 
							{
                            //OK
							}
							else
							{
								$piece_jointe = NULL;
							}
                        //Fin PJ

                        //Pas d'erreur, on enregistre
							if(!isset($erreur)) {

                            //Enregistrement des données
								$req = $bdd->prepare('INSERT INTO employee_reporting(
									id,
									author_id,
									employee_id,
									reporting_type, 
									begin_date,
									end_date,
									planning_time,
									employee_time,
									reason,
									proof,
									timestamp

									) VALUES(

									:id,
									:author_id,
									:employee_id,
									:reporting_type, 
									:begin_date,
									:end_date,
									:planning_time,
									:employee_time,
									:reason,
									:proof,
									:timestamp

								)');
								$req->execute(array(
									'id' => NULL,
									'author_id' => $author_id,
									'employee_id' => $employee,
									'reporting_type' => $absence_type,
									'begin_date' => $date_debut,
									'end_date' => $date_fin,
									'planning_time' => $planning_time,
									'employee_time' => $employee_time,
									'reason' => $reason,
									'proof' => $piece_jointe,
									'timestamp' => time()

								));

                            //OK, on redirige vers un succès
								$succes = 'Merci. Votre signalement a bien été enregistré.';
								afficherSucces($succes);



							}

						}
						else
						{
							$erreur = 'Les champs suivis du caractère * sont obligatoires.';
							afficherErreur($erreur);
						}  
					}

					?>

					<div class="page-wrapper">
						<!-- [ Main Content ] start -->
						<div class="row">
							<!-- [ sample-page ] start -->
							<div class="col-sm-12">


								<!-- [ Main Content ] start -->
								<div class="row">
									<!-- [ Smart-Wizard ] start -->
									<div class="col-sm-12">
										<div class="card">
											<div class="card-header">
												<h5>Signaler une absence ou un arrêt maladie</h5>
											</div>
											<div class="card-body">

												<form id="validation-form123" action="#!" method="POST" enctype="multipart/form-data">

													<div class="row">
														<div class="col-md-6">
															<div class="form-group">
																<label class="form-label">Employé(e) *</label>
																<select class="js-example-basic-single form-control" name="employee" required>

																	<?php if(isset($erreur) AND isset($_POST['employee'])) 
																	{ 

																		$reponse_2 = $bdd->prepare('SELECT id, lastname, firstname FROM employees WHERE id = ?');
																		$reponse_2->execute(array($_POST['employee']));
																		$donnees_2 = $reponse_2->fetch();

																		echo '<option value="'.$_POST['employee'].'">'.$donnees_2['firstname'].' '.$donnees_2['lastname'].' ('.$donnees_2['id'].')</option>'; 
																	} 
																	else 
																	{ 
																		echo '<option value>Employé...</option>'; 
																	} 


                                                                    //Récupération de la liste des employés
																	$reponse_1 = $bdd->query('SELECT id, lastname, firstname FROM employees WHERE active = 1 ORDER BY lastname');

																	while ($donnees_1 = $reponse_1->fetch())
																	{
																		?>

																		<option value="<?php echo $donnees_1['id']; ?>"><?php echo $donnees_1['firstname'].' '.$donnees_1['lastname'].' ('.$donnees_1['id'].')'; ?></option>
																		<?php
																	}

																	$reponse_1->closeCursor();


																	?>

																</select>
															</div>
														</div>

														<div class="col-md-6">


															<div class="form-group">
																<div class="radio d-inline">
																	<input type="radio" name="absence_type" value="2" id="radio-in-1" 
																	<?php if(!isset($_POST['absence_type']) OR (isset($_POST['absence_type']) AND $_POST['absence_type'] == 2)) { ?>checked <?php } ?>>
																	<label for="radio-in-1" class="cr">Absence injustifiée</label>
																</div>
															</div>
															<div class="form-group">
																<div class="radio d-inline">
																	<input type="radio" name="absence_type" value="3" id="radio-in-2"
																	<?php if(isset($_POST['absence_type']) AND $_POST['absence_type'] == 3) { ?>checked <?php } ?>
																	>
																	<label for="radio-in-2" class="cr">Arrêt maladie</label>
																</div>
															</div>
														</div>

														<div class="col-md-6">
															<div class="form-group">
																<label class="form-label">Date du début de l'absence *</label>
																<input type="text" class="form-control" name="date_debut" id="date" placeholder="JJ/MM/AAAA" value="<?php if(isset($erreur) AND isset($_POST['date_debut'])) { echo $_POST['date_debut']; } else { echo date("d/m/Y"); } ?>" required>
															</div>
														</div>

														<div class="col-md-6">
															<div class="form-group">
																<label class="form-label">Date de fin de l'absence / de l'arrêt (si connue) :</label>
																<input type="text" class="form-control" name="date_fin" id="date2" placeholder="JJ/MM/AAAA" value="<?php if(isset($erreur) AND isset($_POST['date_fin'])) { echo $_POST['date_fin']; } ?>">
															</div>
														</div>

														<div class="col-md-6">
															<div class="form-group">
																<label class="form-label">Raison de l'absence / de l'arrêt :</label>
																<textarea class="form-control" name="reason"><?php if(isset($erreur) AND isset($_POST['reason'])) { echo $_POST['reason']; } ?></textarea>
															</div>
														</div>

														<div class="col-md-6">
															<div class="form-group">
																<label class="form-label">Justificatif ou arrêt maladie (le cas échéant) :</label>
																<input type="file" class="form-control" name="proof[]" id="proof" multiple>
																<small id="passwordHelpBlock" class="form-text text-muted">Fichier image au format PNG, JPG, GIF ou document au format PDF, DOC. 5Mo maximum.</small>
															</div>
														</div>

													</div>



													<button type="submit" class="btn btn-primary" name="create">Valider</button>
												</form>
											</div>
										</div>
									</div>
									<!-- [ Smart-Wizard ] end -->

								</div>




							</div>
							<!-- [ sample-page ] end -->
						</div>


						<!-- [ Main Content ] end -->
					</div>
				</div>
			</div>
		</div>
	</div>
</div>
Quelqu'un peut il m'éclairer ?? Merci

Mammouth du PHP | 881 Messages

08 mars 2019, 00:28

La base de la prog.: repars d'où ça fonctionnait et n'ajoute qu'un élément nouveau à la fois. Lorsque ça bloquera, tu comprendras que c'est seulement ce dernier élément qui fait tout foirer.

Tu me donnes ici trop de code, je ne sais pas ce qui est pertinent, ce qui ne l'est pas ... bref, je balance tout et dit Bof, trop c'est trop!
Sois plus sélectif dans ce que tu nous donnes ici, tiens t'en aux seuls éléments pertinents.

Une piste: dans ta deuxième fenêtre de code, je ne trouve pas de formulaire <form> ... comme je te dis trop de code, je ne cherche pas.
Quoi qu'il en soit, assure-toi que le enctype est bien comme dans le formulaire de ta première fenêtre.
<form action="" method="post" enctype="multipart/form-data">
[...]
</form>
Soyez artisans de paix