[RESOLU] INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

Re: INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par raphou » 04 juin 2016, 19:12

Résolu !! Comme ceci : aprés plusieurs var_dump, j'ai remarqué que $_files['name'] contenait le nom du fichier, j'ai donc vérifier si ce champ etait vide ou non :)
<?php
session_start();

require('includes/init.php');
require('includes/functions.php');
include('filters/auth_filter.php');




if(isset($_POST['publish']))
	
{
	extract($_FILES);
	extract($_POST);

	if(($_FILES['img_post']['name'] != '') && (!empty($_POST['content'])))
		{	

			
			$content_dir = 'upload_post/'.get_session('user_id').'/'; // dossier où sera déplacé le img_post
			if (!file_exists($content_dir)) {
	   			 mkdir($content_dir, 0777, true);
			}
	    	$tmp_file = $_FILES['img_post']['tmp_name'];

		    if( !is_uploaded_file($tmp_file) )
		    {
		        exit("Le fichier est introuvable");
		    }

	    	// on vérifie maintenant l'extension
	    	$type_file = $_FILES['img_post']['type'];

		    if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'png'))
		    {
		        exit("Le fichier n'est pas une image");
		    }

		    // on copie le img_post dans le dossier de destination
		    $name_file = $_FILES['img_post']['name'];

		    if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
		    {
		        exit("Impossible de copier le fichier dans $content_dir");
		    }


			
			$img_post = $content_dir.$_FILES['img_post']['name'];
			$q = $db->prepare('INSERT INTO microposts(content,img_post, user_id,created_at) VALUES (:content,:img_post,:user_id,NOW())');
			$q->execute([
				'content'=>$content,
				'img_post'=>$img_post,
				'user_id' => get_session('user_id')
				
				]);
			set_flash('Votre statut a été mis a jour');

		}

		else
		{
			extract($_POST);
			$q = $db->prepare('INSERT INTO microposts(content, user_id,created_at) VALUES (:content,:user_id,NOW())');
			$q->execute([
				'content'=>$content,
				'user_id' => get_session('user_id')
				
				]);
			set_flash('Votre statut a été mis a jour');
		
			/*$to = '[email protected]';
			$subject = 'Ma résidence étudiante';
			$message = 'Un nouveau message a était publié dans la résidence, il peut peut etre vous intéresser http://studeamayol.maresidencetudiante.fr';
			mail($to, $subject, $message);*/
			redirect('profile.php?id='.get_session('user_id'));
			
		}
		
}		


redirect('profile.php?id='.get_session('user_id'));

Re: INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par raphou » 04 juin 2016, 18:25

Oui oui je viens de le faire à l'instant :), le truc que je ne comprend pas c'est pourquoi lorsque le $_files est vide il rentre quand meme dans la condition

if(!empty($_FILES) && (isset($_POST['content'])))

Re: INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par Naroth » 04 juin 2016, 18:22

Tu veux vérifier que l'image à été Upload correctement ?

Re: INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par raphou » 04 juin 2016, 18:20

Non non car quand j'enlève la condition j'upload bien mes images la ou il faut :)

Re: INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par Naroth » 04 juin 2016, 18:18

SI ça ne marche pas chez toi il est fort probable que ton php.ini
limite la taille des fichiers uploadable
et ton fichier doit être trop gros

Re: INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par raphou » 04 juin 2016, 17:52

En fait, j'essais que si l'utilisateur tape uniquement du texte et pas d'image il sois dans le deuxieme if et si il a les deux (image+texte) alors la première condition.
La lorsque je ne tape que du texte il m'affiche, "le fichier est introuvable", je ne comprends donc pas pourquoi il rentre dans la première boucle ^^, merci de ton aide c'est super mais je n'y suis pas encore :p

Re: INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par Naroth » 04 juin 2016, 17:30

Je viens de tester chez moi je te joins mes deux pages de code de test et ça marche.
J'ai modifier le code pour qu'il marche chez moi

Formulaire :

Code : Tout sélectionner

<html> <head> </head> <body> <form method="post" action="debug.php" enctype="multipart/form-data"> <label for="mon_fichier">Fichier (tous formats | max. 1 Mo) :</label><br /> <input type="hidden" name="MAX_FILE_SIZE" value="1048576" /> <input type="file" name="img_post" id="img_post" /><br /> <label for="titre">Titre du fichier (max. 50 caractères) :</label><br /> <input type="text" name="content" value="Titre du fichier" id="content" /><br /> <input type="submit" name="submit" value="Envoyer" /> </form> </body> </html>
Traitement du formulaire :

Code : Tout sélectionner

<?php session_start(); $_POST['publish'] = "ok"; var_dump($_POST); var_dump($_FILES); var_dump(!empty($_FILES)); var_dump(isset($_POST['content'])); if(isset($_POST['publish'])){ if(!empty($_FILES) && (isset($_POST['content']))) { echo "DEBUT 1"; extract($_POST); $content_dir = 'upload_post/'.uniqid().'/'; // dossier où sera déplacé le img_post if (!file_exists($content_dir)) { mkdir($content_dir, 0777, true); } $tmp_file = $_FILES['img_post']['tmp_name']; if( !is_uploaded_file($tmp_file) ) { exit("Le fichier est introuvable"); } // on vérifie maintenant l'extension $type_file = $_FILES['img_post']['type']; if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'png')) { exit("Le fichier n'est pas une image"); } // on copie le img_post dans le dossier de destination $name_file = $_FILES['img_post']['name']; if( !move_uploaded_file($tmp_file, $content_dir . $name_file) ) { exit("Impossible de copier le fichier dans $content_dir"); } $img_post = $content_dir.$_FILES['img_post']['name']; // $q = $db->prepare('INSERT INTO microposts(content,img_post, user_id,created_at) VALUES (:content,:img_post,:user_id,NOW())'); // $q->execute([ // 'content'=>$content, // 'img_post'=>$img_post, // 'user_id' => get_session('user_id') // ]); echo 'Votre statut a été mis a jour'; /*$to = '[email protected]'; $subject = 'Ma résidence étudiante'; $message = 'Un nouveau message a était publié dans la résidence, il peut peut etre vous intéresser http://studeamayol.maresidencetudiante.fr'; mail($to, $subject, $message);*/ } else if(!empty($_POST['content'])) { echo "DEBUT 2"; extract($_POST); // $q = $db->prepare('INSERT INTO microposts(content,img_post, user_id,created_at) VALUES (:content,:img_post,:user_id,NOW())'); // $q->execute([ // 'content'=>$content, // 'img_post'=>$img_post, // 'user_id' => get_session('user_id') // ]); echo 'Votre statut a été mis a jour'; } } echo "END"; // redirect('profile.php?id='.get_session('user_id')); ?>
SI ça ne marche pas chez toi il est fort probable que ton php.ini
limite la taille des fichiers uploadable
et ton fichier doit être trop gros

Re: INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par raphou » 04 juin 2016, 14:48

Bonjour, merci de ta réponse rapide, j'ai essayé comme cela et c'est bizarre ça m'affiche le fichier est introuvable ( une erreur qui se situe dans la condition SI $_FILES n'est pas vide et que $_content n'est pas vide) alors que j'ai rempli que le texte du formulaire, et laissé le champ photo vide .
if(isset($_POST['publish']))
	
{
	extract($_POST);

		if(!empty($_FILES) && !empty($_POST['content']))
		{
			extract($_POST);
			$content_dir = 'upload_post/'.get_session('user_id').'/'; // dossier où sera déplacé le img_post
			if (!file_exists($content_dir)) {
	   			 mkdir($content_dir, 0777, true);
			}
	    	$tmp_file = $_FILES['img_post']['tmp_name'];

		    if( !is_uploaded_file($tmp_file) )
		    {
		        exit("Le fichier est introuvable");
		    }

	    	// on vérifie maintenant l'extension
	    	$type_file = $_FILES['img_post']['type'];

		    if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'png'))
		    {
		        exit("Le fichier n'est pas une image");
		    }

		    // on copie le img_post dans le dossier de destination
		    $name_file = $_FILES['img_post']['name'];

		    if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
		    {
		        exit("Impossible de copier le fichier dans $content_dir");
		    }


			
			$img_post = $content_dir.$_FILES['img_post']['name'];
			$q = $db->prepare('INSERT INTO microposts(content,img_post, user_id,created_at) VALUES (:content,:img_post,:user_id,NOW())');
			$q->execute([
				'content'=>$content,
				'img_post'=>$img_post,
				'user_id' => get_session('user_id')
				
				]);
			set_flash('Votre statut a été mis a jour');
		}
		
		else if(empty($_FILES))
		{	
			$q = $db->prepare('INSERT INTO microposts(content, user_id,created_at) VALUES (:content,:user_id,NOW())');
			$q->execute([
				'content'=>$content,
				'user_id' => get_session('user_id')
				
				]);
			set_flash('Votre statut a été mis a jour');
		
			/*$to = '[email protected]';
			$subject = 'Ma résidence étudiante';
			$message = 'Un nouveau message a était publié dans la résidence, il peut peut etre vous intéresser http://studeamayol.maresidencetudiante.fr';
			mail($to, $subject, $message);*/
		}
}		

redirect('profile.php?id='.get_session('user_id'));
Merci beaucoup de me venir en aide :)

Re: INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par Naroth » 04 juin 2016, 14:03

Bonjour raphou,

as-tu vérifié le contenu du $_POST (avec un var_dump) au debut de ton fichier ? Histoire de vérifier que l'image est posté.

Et le test de l'image ne doit pas être sur la variables $_FILE plutôt que $_POST ?

INSERT INTO SI UN DES DEUX CHAMPS EST REMPLI

par raphou » 04 juin 2016, 11:22

Salut à tous, je suis en train de monter un projet de réseau social et je suis à la partie d'enregistrement des status (messages) postés.

Alors voila je permet en plus du message de joindre une image, j'ai réussi à faire fonctionner l'enregistrement des messages seul lorsque le champ de fichier photo n'est pas rempli, or ce que je veux c'est pouvoir soit envoyer un message sans photo soit avec mais dans tous les cas le champs message doit être remplis. Voila ou j'en suis :
<?php
session_start();

require('includes/init.php');
require('includes/functions.php');
include('filters/auth_filter.php');



if(isset($_POST['publish'])){
	if(!empty($_POST['content']) && (isset($_POST['img_post'])))

	{
		extract($_POST);
		$content_dir = 'upload_post/'.get_session('user_id').'/'; // dossier où sera déplacé le img_post
		if (!file_exists($content_dir)) {
   			 mkdir($content_dir, 0777, true);
		}
    	$tmp_file = $_FILES['img_post']['tmp_name'];
	    if( !is_uploaded_file($tmp_file) )
	    {
	        exit("Le fichier est introuvable");
	    }

    	// on vérifie maintenant l'extension
    	$type_file = $_FILES['img_post']['type'];

	    if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'png'))
	    {
	        exit("Le fichier n'est pas une image");
	    }

	    // on copie le img_post dans le dossier de destination
	    $name_file = $_FILES['img_post']['name'];

	    if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
	    {
	        exit("Impossible de copier le fichier dans $content_dir");
	    }


		
		$img_post = $content_dir.$_FILES['img_post']['name'];
		$q = $db->prepare('INSERT INTO microposts(content,img_post, user_id,created_at) VALUES (:content,:img_post,:user_id,NOW())');
		$q->execute([
			'content'=>$content,
			'img_post'=>$img_post,
			'user_id' => get_session('user_id')
			
			]);
		set_flash('Votre statut a été mis a jour');
		
		/*$to = '[email protected]';
		$subject = 'Ma résidence étudiante';
		$message = 'Un nouveau message a était publié dans la résidence, il peut peut etre vous intéresser http://studeamayol.maresidencetudiante.fr';
		mail($to, $subject, $message);*/
	}
	if(!empty($_POST['content']))
	{
		extract($_POST);
		$q = $db->prepare('INSERT INTO microposts(content,img_post, user_id,created_at) VALUES (:content,:img_post,:user_id,NOW())');
		$q->execute([
			'content'=>$content,
			'img_post'=>$img_post,
			'user_id' => get_session('user_id')
			
			]);
		set_flash('Votre statut a été mis a jour');
	}
}
redirect('profile.php?id='.get_session('user_id'));
En gros, si le champ du message n'est pas vide et que le champ photo est soumis alors je fais tout le traitement (photo+message) mais si il n'y a que le message qui est rempli je ne fais que le traitement du message.
Et pourtant que je mette ou non une image, dans ma base de données je n'ai que le texte qui est enregistré.

Voila j'espère que quelqu'un pourra m'éclairer :p, merci d'avance !!