Pb enregistrement dans base mysql

Résolu/Fermé
t671 - 22 oct. 2009 à 10:43
zurg_ Messages postés 133 Date d'inscription jeudi 15 octobre 2009 Statut Membre Dernière intervention 15 avril 2010 - 27 oct. 2009 à 13:41
Bonjour,

J'ai un formulaire où je saisi divers éléments (date, heure, texte .....), et où je peut uploader un fichier (jpg, doc, ....). Si tout est saisi, c'est ok. Mais si je ne saisi pas de fichier à uploader, rien ne s'enregistre dans la base.
J'ai essayé de mette if (empty($monfichier)) avant l'enregistrement de "monfichier" dans la base ("monfichier" étant le nom de la variable représentant le fichier à uploader). Mais cela ne fonctionne pas, et à force de bidouiller, je me mélange les pinceaux !
Pourriez-vous m'aider à résoudre ce problème ?
Voici mon code :

// --------------------récupération des données du formulaires-------------------------
$date = $_POST['date'];
$heure = $_POST['heure'];
$titre = $_POST['titre'];
$texte = $_POST['texte'];
$monfichier = $_POST['monfichier'];

..........................

// ----------------test upload fichier------------------

$dossier = './dossier_upload/';
$fichier = basename($_FILES['monfichier']['name']);
$taille_maxi = 2000000;
$taille = filesize($_FILES['monfichier']['tmp_name']);
$extensions = array('.png', '.gif', '.PNG', '.GIF', '.jpg', '.JPG', '.jpeg', '.JPEG', '.doc', '.DOC', '.txt', '.TXT');
$extension = strrchr($_FILES['monfichier']['name'], '.');

if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
echo '<a href="./gestion/err_extension.html" target="wclose" onclick="window.open(\'./gestion/err_extension.html\',\'wclose\',\'width=850,height=205,toolbar=no,status=yes,left=80,top=80,scrollbars=no\')"></a>';
// $erreur = 'Vous ne pouvez uploader que des fichiers de type png, gif, jpg, jpeg, txt ou doc.';
}
if($taille>$taille_maxi)
{
echo '<a href="./gestion/err_taille.html" target="wclose" onclick="window.open(\'./gestion/err_etaille.html\',\'wclose\',\'width=850,height=205,toolbar=no,status=yes,left=80,top=80,scrollbars=no\')"></a>';
//$erreur = 'Le fichier est trop gros. Il doit être inférieur à 2Mo';
}
else //if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
//On formate le nom du fichier ici...
$fichier = strtr($fichier,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $fichier);

//--------------------upload fichier----------------------

if (move_uploaded_file($_FILES['monfichier']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
{
echo 'Chargement effectué avec succès !';

// ---------------- insertion texte, jour, date ... --------

$sql = "INSERT INTO manifestations(heure, jour, date, frdate, datefr, titre, texte) VALUES('$heure', '$jour_sem', '$dateMySQL', '$frdate', '$datefr', '$titre', '$chaine')";
mysql_query($sql) or die('Erreur SQL !'.$sql.mysql_error());
$id=mysql_insert_id(); // récupération dernier id enregistré

// ---------------- insertion fichier uploadé --------

$req_fich = "INSERT INTO upload(id_liaison, lien_fichier, fichier, extension) VALUES('$id', '$dossier$fichier', '$fichier', '$extension')";
mysql_query($req_fich) or die('Erreur SQL !'.$req2_fich.mysql_error());

}
}
}


Merci d'avance ...... :o)
A voir également:

11 réponses

zurg_ Messages postés 133 Date d'inscription jeudi 15 octobre 2009 Statut Membre Dernière intervention 15 avril 2010 27
22 oct. 2009 à 11:07
Salut,

que se passe-t-il exactement : le fichier s'upload dans tous les cas ou rien ne s'enregistre dans la base dans tous les cas ?
0
J'ai avancé un peu ............. !!!!!!
Donc maintenant, lorsque je saisi un texte pour l'enregistrer dans la table manifestation, celui-ci s'enregistre bien. Mais si j'ai validé le formulaire sans y associer un fichier à uploader (donc le texte n'aura pas d'élément relié avec la table upload), lors de l'affichage, le texte ne sort pas, car pas d'association avec la table upload.
Je pense que ceci doit venir de ma requête :

$requete="SELECT manifestations.id, manifestations.jour , manifestations.heure ,manifestations.datefr ,manifestations.titre ,manifestations.texte , upload.id_liaison, upload.lien_fichier, upload.fichier, upload.extension
FROM manifestations LEFT JOIN upload ON manifestations.id=upload.id_liaison
ORDER BY manifestations.date ASC";
$result = mysql_query($requete,$link) or exit ('Erreur : '.mysql_error() );


Je ne sais pas comment préciser que si le "LEFT JOIN" n'éxiste pas, il faut quand même afficher le contenu de la table "manifexstations".
0
zurg_ Messages postés 133 Date d'inscription jeudi 15 octobre 2009 Statut Membre Dernière intervention 15 avril 2010 27
22 oct. 2009 à 11:38
Et si tu testes avant dans ton script l'existence de ton left join, ça modifie ta requête, ou plutôt tu en fais 2, une pour chaque cas ?
0
Holààààààààà !!!!!! Je ne suis pas une bête en php ..........

Il faudrait qu'avant de faire la requête je teste si une égalité de $id de la table "manifestations" existe dans la table "upload" en tant que $id_liaison. Mais çà, je sais pas comment faire !!!!!

Voici mon code :


$requete="SELECT manifestations.id, manifestations.jour , manifestations.heure ,manifestations.datefr ,manifestations.titre ,manifestations.texte , upload.id_liaison, upload.lien_fichier, upload.fichier, upload.extension
FROM manifestations LEFT JOIN upload ON manifestations.id=upload.id_liaison
ORDER BY manifestations.date ASC";
$result = mysql_query($requete,$link) or exit ('Erreur : '.mysql_error() );

$idEnCours = 0;
while($row = mysql_fetch_array($result))
{
if( $idEnCours != $row['id_liaison'] )
{
if ($idEnCours = $row['id_liaison']);

// "trim" enlève les espaces pouvant être contenu dans le champs "datefr"
$tmp = trim($row['datefr']);
$tmp2 = trim($row['heure']);
if(empty($tmp))
{
//echo nl2br($row['titre']);
echo '<b><u>'.$row['titre'].'</u></b><p>';
}
elseif(empty($tmp2))
{
echo '<b><u>'.$row['jour'].' '.$row['datefr'].' : '.$row['titre'].'</u></b><p>';
}
else
{
echo '<b><u>'.$row['jour'].' '.$row['datefr'].' à '.$row['heure'].' : '.$row['titre'].'</u></b><p>';
}
echo nl2br($row['texte']);
echo '<p>';
//---------affichage de lélément upload---------
echo '<div class="centrer">';
}
if (in_array($row['extension'], array( '.jpg', '.JPG', '.png', '.PNG', '.jpeg', '.JPEG', '.gif', '.GIF')))
{
echo '<a href ="http://xxxxx ' . $row['lien_fichier'] . '"><img src="http://xxxxxx' . $row['lien_fichier'] . '" /></a>';
echo '  ';
}
elseif (in_array($row['extension'], array( '.doc', '.DOC', '.pdf', '.PDF', '.txt', '.TXT')))
{
echo '<a href ="http://xxxxx' . $row['lien_fichier'] . '"><img src="../../../images/commande.gif" /></a>';
}
}
0

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

Posez votre question
zurg_ Messages postés 133 Date d'inscription jeudi 15 octobre 2009 Statut Membre Dernière intervention 15 avril 2010 27
22 oct. 2009 à 14:04
Ben, c'est pas évident comme ça, je connais pas la structure de tes tables, mais, sur le principe, il te faut récupérer ton $id_liaison.

Ensuite tu parcours ta table id pour voir si tu as une correspondance, si oui, tu lances ta requête normale, si non, tu lances ta requête modifiée.

0
Ben pour la table manifestation, j'ai comme enregistrement : id, heure, jour, date, datefr, frdate, titre, texte.
Pour la table upload, j'ai : id, id_liaison (qui est = à id de manifestation), lien_fichier, fichier, extension.

Il n'est pas obligatoire d'avoir un id_liaison, donc un lien avec la table manifestation. Mais si il n'y a pas de lien, la manifestation ne s'affiche pas !

Au pire, t'aurais pas exemple à me donner ???
0
zurg_ Messages postés 133 Date d'inscription jeudi 15 octobre 2009 Statut Membre Dernière intervention 15 avril 2010 27
22 oct. 2009 à 15:05
Ben si j'ai bien compris, si tu as un id_liaison, il faut afficher ta manif avec les "liens" => donc requête normale.

Si pas de id_liaison alors tu fais ta requête sans ton left join.

Je peux pas trop détailler, car je suis au taf et aujourd'hui c'est un peu chaud, mais en gros tu fais ça :

$req1="SELECT id_liaison FROM upload ORDER BY ce que tu veux";
$rsReq1= mysql_query($req1, $tachainedeconnexion);

while($row = mysql_fetch_array($rsReq1)) {
      $req2="SELECT id FROM manifestation";
      $rsReq2= mysql_query($req2, $tachainedeconnexion);
      while($row2 = mysql_fetch_array($rsReq2)) {
             if ($row['id_liaison'] == $row2['id']) {
                 // la tu fais ce qu'il faut faire si tu as un id_liaison qui correspond
             }
             else {
                    // là tu fais ce qu'il faut faire si tu n'en as pas 
             }
         }
}


Voilà, c'est fait à la va vite, ya peut-être des erreurs mais je n'ai pas le temps de faire mieux et ça peut te donner des pistes...

Bon courage.

PS: utilise le bouton code, c'est plus lisible pour nous...
0
J'ai fait ce que tu m'as dit :

$req1="SELECT id_liaison FROM upload ORDER BY id_liaison ASC";
$rsReq1= mysql_query($req1, $link);
while($row = mysql_fetch_array($rsReq1)) 
{
      $req2="SELECT id FROM manifestation";
      $rsReq2= mysql_query($req2, $link);
      while($row2 = mysql_fetch_array($rsReq2)) {
      
      
             if ($row['id_liaison'] == $row2['id']) {
echo '<b><u>'.$row['titre'].'</u></b><p>';  .................


et j'ai l'erreur Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource sur le 2° while (while($row2 = mysql_fetch_array($rsReq2)) ).
Je pense que deux while imbriqué ça ne passe pas !?
0
J'ai plus de message d'erreur, mais aucune donnée ne s'affiche !!!!!
0
zurg_ Messages postés 133 Date d'inscription jeudi 15 octobre 2009 Statut Membre Dernière intervention 15 avril 2010 27
22 oct. 2009 à 17:08
Pour déboguer, fais afficher tes variables à chaque étape en plaçant un exit; après, ça va t'aider à situer le pb... je suis désolé, mais pour aujourd'hui je ne peux plus faire gd chose pour toi !
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
24 oct. 2009 à 11:16
Merci !!!! Merci pour tout, j'ai trouvé ............. ;o))
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
23 oct. 2009 à 17:55
Bonjour Zurg_,

Finalement, j'ai modifié pas mal de chose ....

Voici déjà mon script qui met la base à jour (en sachant que "monfichier" correspond au fichier uploadé. Le reste, ce sont des champs texte) :

$date = $_POST['date'];
$heure = $_POST['heure'];
$titre = $_POST['titre'];
$message = $_POST['texte'];
$monfichier = $_POST['monfichier'];

$frdate = $date; // conservation date saisie    
	//-----------Convertion "date" au format mysql-------------
$date = explode("/", $date);
$dateMySQL = $date[2]."-".$date[1]."-".$date[0];

	//----------Convertion "date" au format texte-fr---------------
list($year, $month, $day) = explode("-", $dateMySQL);	
$months = array("janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"); 
$datefr = " $day ".$months[$month-1]." $year ";

	//--------------recherche du jour_texte--------------------
// tableau des jours de la semaine
$joursem = array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi");
// extraction des jour, mois, an de la date
list($jour, $mois, $annee) = explode('/', $frdate);
// calcul du timestamp
$timestamp = mktime (0, 0, 0, $mois, $jour, $annee);
// le jour de la semaine
$jour_sem = $joursem[date("w",$timestamp)];

// ----------------test upload fichier------------------
if (isset($monfichier))
{

$dossier = './dossier_upload/';
$fichier = basename($_FILES['monfichier']['name']);
$taille_maxi = 2000000;
$taille = filesize($_FILES['monfichier']['tmp_name']);
$extensions = array('.gif', '.jpg', '.jpeg', '.doc', '.png', '.txt', '.TXT', '.PNG', '.GIF', '.JPG', '.JPEG', '.DOC');
$extension = strrchr($_FILES['monfichier']['name'], '.'); 
	
//--------------------upload fichier----------------------

      	if(move_uploaded_file($_FILES['monfichier']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
  	  		{
       	   	    $sql = "INSERT INTO manifestations(heure, jour, date, frdate, datefr, titre, texte) VALUES('$heure', '$jour_sem', '$dateMySQL', '$frdate',  '$datefr', '$titre', '$chaine')";
       	   	    mysql_query($sql) or die('Erreur SQL !'.$sql.mysql_error());
        		$id=mysql_insert_id();        
	       	 	$req_fich = "INSERT INTO upload(id_liaison, lien_fichier, fichier, extension) VALUES('$id', '$dossier$fichier', '$fichier', '$extension')";
                mysql_query($req_fich) or die('Erreur SQL !'.$req_fich.mysql_error());
          	}
	}
else
	{
     $sql = "INSERT INTO manifestations(heure, jour, date, frdate, datefr, titre, texte) VALUES('$heure', '$jour_sem', '$dateMySQL', '$frdate',  '$datefr', '$titre', '$chaine')";
     mysql_query($sql) or die('Erreur SQL !'.$sql.mysql_error());
     $id=mysql_insert_id(); 
         
	 $req_fich = "INSERT INTO upload(id_liaison) VALUES('$id')";
     mysql_query($req_fich) or die('Erreur SQL !'.$req_fich.mysql_error());
    }


Ainsi, si je saisi un texte + titre sans fichier à uploader : l'enregistrement texte est ok, et l'id dans id_liaison ok également (le reste en NUL).
Si je saisi un texte + titre avec fichier à uploader : l'enregistrement texte est ok, mais pour le fichier uploadé, c'est comme si il n'y en avait pas (l'id dans id_liaison ok, le reste en NUL).
En fait, j'éxécute toujours le dernier "else" !!!!! Alors, est-de que mon "if (isset($monfichier))" est bon ?

J'ai enlevé le "if (isset($monfichier))", et le dernier "else", et là, le fichier est bien uploadé. Ce qui prouve que la variable $monfichier existe bien !!!!

Peux-tu m'aider à débuguer car je ne sais plus quoi faire ..... :o((

Merci
0
zurg_ Messages postés 133 Date d'inscription jeudi 15 octobre 2009 Statut Membre Dernière intervention 15 avril 2010 27
27 oct. 2009 à 10:58
Salut,

Apparemment, tes variables $fichier $extension sont vides.

Pour le vérifier fais simplement un echo de ces valeurs dans ton if principal, puis dans le 2e.

Si tes variables s'affichent correctement, c'est que la condition 1 n'est jamais remplie.

Dans ton script, $monfichier fait référence à $_POST['monfichier'] ce qui provient d'un champ. Je ne connais pas ton formulaire qui appelle ce script, mais je pense que tu veux vérifier qu'il y a bien un fichier à uploader. Il faudrait donc que tu vérifie plutôt que $_FILES['monfichier'] existe.

Non ?
0
Je te remercie Zurg_ ! J'ai trouvé !!!!!! J'ai changé mon if en if (!empty($_FILES['monfichier']['tmp_name'])), et là, ça fonctionne ..... ;o))

A +++
0
zurg_ Messages postés 133 Date d'inscription jeudi 15 octobre 2009 Statut Membre Dernière intervention 15 avril 2010 27
27 oct. 2009 à 13:41
Bravo !

@ +
0