Upload de fichier relié à user connecté

Eléphanteau du PHP | 12 Messages

02 juin 2012, 15:46

Bonjour à tous !

Je réalise un site web qui permet à un étudiant connecté de verser son mémoire de recherche dans la base de données.
Seulement, deux problèmes :
- Mon simple code d'upload ne fonctionne visiblement pas,
- Je ne sais pas comment faire en sorte de récupérer les informations de l'étudiant connecté pour relier cet étudiant à son mémoire.

Dans ma base :
Table etudiant : NumEtu (auto), Nom_Utilisateur, Motdepasse et d'autres informations sur l'étudiant (dont son CV, qu'il faudrait également uploader soi-même),
Table memoire : NumMemoire (auto), Titre et d'autres informations,
Table ecrit : NumEtu, NumMemoire et la date de soutenance qui me permet de relier le mémoire et l'étudiant.

Mon code :
<form action="verser_memoire.php" method="post" enctype="multipart/form-data">
  <p>Titre du mémoire : <input type-text size=50 name="t"/></p>
 <p> Résumé du mémoire : <textarea name="r" cols="50" rows="5"></textarea>  </p>
  <p> Mot-clef : <select name="m"> </p>
  <option value="IDE">IDE</option>
  <option value="ARI">ARI</option>
  <option value="EIE">EIE</option>
  </select> <p>
  <p> Document à charger : <input type="file" name="d"/> </p>
  <input type="submit" value="Valider"/>
  <input type="reset" value="Annuler"/>
  </form>

<?php
   
if(!empty($_POST['t']) || !empty($_POST['r']) || !empty($_POST['m']) || !empty($_POST['d'])) {

	$titre = $_POST['t'];
	$resume = $_POST['r'];
	$motclef = $_POST['m'];
	$document = $_POST['d'];
	
$n_fic=basename($fic['Nom_Utilisateur']);
//$ref_fic=$numetu."_".$n_fic;  <= on accède à ce formulaire uniquement dans le cadre de la connexion d'un utilisateur donc il est connu.
$ref_fic=$n_fic;
 
$fic_destination = "/memoires/". $ref_fic ;
if (!move_uploaded_file($fic['tmp_name'],$fic_destination)) {
echo "Erreur de téléchargement !!";
exit();
}

$req="Insert into memoire values ('', \"$titre\", \"$resume\", \"$motclef\", \"$document\", \"$ref_fic\")";

$connexion=mysql_connect("localhost","root","");
if (!$connexion)
{echo "Il y a eu un problème de connexion. Merci de  vérifier vos paramètres de connexion puis de réessayer. <br>";
exit();} 


if (!mysql_select_db("baseasso2",$connexion))
{echo "Problème de sélection de base. Merci de vérifier le nom de votre base <br>"   ;
exit();}

$resultat=mysql_query($req,$connexion);
if (!$resultat)
{echo "Il y a un problème avec la requête '$req'. <br>";
exit();}
}
?>
Sachez que cette page n'est accessible que si l'étudiant est connecté, grâce au code suivant avant mon Doctype :
<?php
session_start();
if(!isset($_COOKIE['NumEtu'])) {header("Location: connexion.php");}
?>
Si vous pouviez me dépanner, ça m'aiderait beaucoup !!!! Par avance, merci.

ViPHP
xTG
ViPHP | 7331 Messages

02 juin 2012, 16:20

Quand attribues-tu une valeur à la variable $fic ?

Eléphanteau du PHP | 12 Messages

02 juin 2012, 16:28

Hum ici
$fic['Nom_Utilisateur']
Non ? Arffff je suis perdue :'(

ViPHP
AB
ViPHP | 5818 Messages

02 juin 2012, 17:44

Et elle est sensée représenter quoi cette variable $fic ?
Comment s'appelle l'input de type "file" définie dans ton formulaire et qu'en fais tu par la suite ?

Eléphanteau du PHP | 12 Messages

02 juin 2012, 19:05

En fait, j'arrive maintenant à télécharger mon fichier dans le répertoire de destination, il apparait parfaitement dans ma base de données, mais il n'est relié à personne, c'est un mémoire sans auteur.
Mon problème c'est de faire en sorte que la personne connectée soit immédiatement associée au document qu'elle dépose.

ViPHP
xTG
ViPHP | 7331 Messages

02 juin 2012, 19:28

Tu peux récupérer l'id du dernier mémoire inséré avec mysql_last_insert_id().
Utilisé avec la valeur du cookie identifiant le visiteur tu auras de quoi faire une requête pour remplir ta table "ecrit" servant de jointure. :)

Eléphanteau du PHP | 12 Messages

02 juin 2012, 19:45

Tu peux récupérer l'id du dernier mémoire inséré avec mysql_last_insert_id().
Utilisé avec la valeur du cookie identifiant le visiteur tu auras de quoi faire une requête pour remplir ta table "ecrit" servant de jointure. :)
Hum ok j'ai jamais utilisé mysql_last_insert_id() mais je vais essayer de trouver (sinon je reviens crier à l'aide).

J'ai essayé avec ça :
$liaison='INSERT INTO  ecrit.NumMemoire, ecrit.NumEtu
VALUES (\"$ref_fic\", "'.$_COOKIE['NumEtu'].'")';
J'ai aucune erreur, mon mémoire s'enregistre tjs mais y'a tjs pas la liaison 8-|

Eléphanteau du PHP | 12 Messages

02 juin 2012, 20:12

J'ai un message d'erreur : syntax error, unexpected T_STRING ...
$liaison='INSERT INTO  ecrit
VALUES ('mysql_insert_id()', "'.$_COOKIE['NumEtu'].'", '')';
}
Je ne sais pas où c'est, si c'est un problème de quotes ou de virgules et points virgules ... j'arrête pas de modifier ces "petits trucs" sans grand succès !

ViPHP
AB
ViPHP | 5818 Messages

02 juin 2012, 20:15

Ecris (concatène) mysql_insert_id() de la même manière que $_COOKIE['NumEtu']

Eléphanteau du PHP | 12 Messages

02 juin 2012, 20:22

$liaison='INSERT INTO  ecrit
VALUES ("'mysql_insert_id()'", "'.$_COOKIE['NumEtu'].'", "")';
}
Non, ça ne fonctionne toujours pas ...

ViPHP
xTG
ViPHP | 7331 Messages

02 juin 2012, 20:24

Les points ! Les points ! :P
Le point est l'opérateur de concaténation en PHP.

Eléphanteau du PHP | 12 Messages

02 juin 2012, 20:32

$liaison='INSERT INTO  ecrit
VALUES ("'.mysql_insert_id().'", "'.$_COOKIE['NumEtu'].'", "")';
}
Mais euh !!!
Alors maintenant ça re-fonctionne (plus de message d'erreur) mais j'ai tjs pas de lien entre mon mémoire et mon compte user :cry:
Donc soit j'ai merdouillé avant, soit je suis trop ... fatiguée :wink:

ViPHP
AB
ViPHP | 5818 Messages

02 juin 2012, 20:33

Ben oui mais il faudrait nous montrer ton nouveau code...

Eléphanteau du PHP | 12 Messages

02 juin 2012, 20:36

<?php
session_start();
if(!isset($_COOKIE['NumEtu'])) {header("Location: connexion.php");}
?> 
<form action="verser_memoire.php" method="post" enctype="multipart/form-data">
  <p>Titre du mémoire : <input type="text" size=50 name="t"/></p>
 <p> Résumé du mémoire : <textarea name="r" cols="50" rows="5"></textarea>  </p>
  <p> Mot-clef : <select name="m"> </p>
  <option value="IDE">IDE</option>
  <option value="ARI">ARI</option>
  <option value="EIE">EIE</option>
  </select> <p>
  <p> Document à charger : <input type="file" name="d"/> </p>
  <input type="submit" value="Valider"/>
  <input type="reset" value="Annuler"/>
  </form>
<?php
   
if(!empty($_POST['t']) || !empty($_POST['r']) || !empty($_POST['m']) || !empty($_POST['d'])) {

	$titre = $_POST['t'];
	$resume = $_POST['r'];
	$motclef = $_POST['m'];
	$document = $_FILES['d'];

$fic=$_FILES['d'];	
$n_fic=basename($fic['name']);
$ref_fic=$n_fic;
 
$fic_destination = "../memoires/". $ref_fic ;
if (!move_uploaded_file($fic['tmp_name'],$fic_destination)) {
echo "Erreur de téléchargement !!";
exit();
}

$req="Insert into memoire values ('', \"$titre\", \"$resume\", \"$motclef\", \"$ref_fic\")";

$connexion=mysql_connect("localhost","root","");
if (!$connexion)
{echo "Il y a eu un problème de connexion. Merci de  vérifier vos paramètres de connexion puis de réessayer. <br>";
exit();} 

if (!mysql_select_db("baseasso2",$connexion))
{echo "Problème de sélection de base. Merci de vérifier le nom de votre base <br>"   ;
exit();}

$resultat=mysql_query($req,$connexion);
if (!$resultat)
{echo "Il y a un problème avec la requête '$req'. <br>";
exit();}

$liaison='INSERT INTO  ecrit
VALUES ("'.mysql_insert_id().'", "'.$_COOKIE['NumEtu'].'", "")';
}
?> 
Merci !!!

ViPHP
xTG
ViPHP | 7331 Messages

02 juin 2012, 20:42

$liaison est une chaîne de caractère. Faudrait peut être l'envoyer au SGBD maintenant...
mysql_query() ! ;)
Je te recommande une bonne nuit de sommeil afin d'éviter de nouvelles erreurs bêtes comme celles là.