8792 sujets

Développement web côté serveur, CMS

Bonjour a tous,
j'ai un site en cours où je dois créer une partie utilisateur avec un système de récupération de rapport (fichier pdf)
donc pour ça j'ai créer deux tables 'clients' et 'dossiers'
Dans la table dossiers, j'ai un id, nom, file (je récupère le nom du fichier uploader lors d'un formulaire de chargement), date, client_id

Dans la partie utilisateur, je voudrais créer un espace pour qu'ils puissent télécharger les fichiers qui sont enregistrer dans la bdd donc j'ai édité un code mais je n'arrive pas à récupérer la liste de touts les fichier qui correspond à un ID. J'ai quand même testé ma requete sql et j'ai une erreur sur ma requete qui me dit que j'ai un doublon car j'ai 4 rapport pour le même client_id.
voici le code:

<?php
session_start();
?>
<!doctype html>
<html>
<head>

<meta charset="utf-8">
<title>Metrosite</title>
<link href="styles/style.css" rel="stylesheet" type="text/css">
</head>

<body>
		
        <!---insertion header----->	
        <?php include("composants/header.php"); ?>
     	<!------------------------>
	<div class="container">
      	<!---insertion sidebar---->
        <?php include("composants/sidebar.php"); ?>
        <!------------------------>
      	<div class="content"><?php
			//connexion bdd
			$db = mysql_connect('localhost', 'root', '');
			mysql_select_db('metrosite',$db);
			
			
			
        	$sql ="select nom, file, date from dossiers left outer join clients on clients.id = dossiers.client_id where clients.identifiant='".$_SESSION['login']."'";
			$req = mysql_query($sql) or die('Erreur SQL!<br>'.$sql.'<br>'.mysql_error());
			$data = mysql_fetch_assoc($req);
			echo $data['nom'];
			echo $data['date'];
			echo $data['file'];
		?></div>	
      <!---insertion footer------->
      <?php include("composants/footer.php"); ?>
      <!-------------------------->
	</div>    
</body>
</html>

En espérant que j'ai été clair sur le principe.
Merci d'avance
Modifié par cid5420 (17 Jan 2014 - 08:37)
Salut,
tu as testé ta requête en direct sur la base de données ou tu as testé seulement le code présent? Ma question derrière est: l'erreur provient du code SQL ou du code PHP? Ta requête est censé pouvoir retourner plusieurs documents pour une personne donnée je pense, et aussi tu devrais avoir un oeil à la doc pour mysql_fetch_assoc. Même remarque que dans ton autre post, n'utilise pas root pour te connecter à mysql ! Smiley decu Autre chose, utiliser les fonctions mysql_* n'est pas top top, c'est obsolète en PHP5.5.0 donc tu pourrais avoir à tout refaire dans un futur "proche", regarde du côté de pdo_mysql. Tu as aussi une potentielle faille par injection SQL sur ta requête, j'ignore comment a été traité $_SESSION['login'].
Bon courage Smiley smile
Alors ma requête dois m'afficher une liste de tous les dossiers qui sont enregistré dans la table dossiers, lorsque client_id est égal à $_session['login'] (je récupère le $_session avec mon module de connexion dont j'ai parlé dans mon autre post)

en faisant cette requete, que je test avec sql manager, j'ai un seul résultat et en dessous j'ai une ligne qui m'indique que j'ai un doublon sur le client_id (forcément que j'ai des doublon car j'ai plusieurs dossiers pour un client.

De plus, j'ai pris compte de ta remarque pour le root, et je fais toujours mes sites en local en root et je fais des modif lorsque je bascule en distant, je sais pas si c'est une bonne méthode mais je début et sur tous les tuto que j'ai suivi ils sont en root.

pour la fonction mysql, j'ai effectivement pris un bout de code, sans faire attention, lorsque le code sera fonctionnel, je ferais le tour pour que le code soit optimisé, et faire une pages pour la connexion a la base de donnée.

Merci pour votre aide
Bonjour,

Pour moi c'est soit un problème de conception en base données : fais un export de ta base de données et affiche nous les "CREATE".

Soit un problème de requête ; par exemple j'aurais plus tôt fais :

$sql ="select nom, file, date from dossiers inner join clients on clients.id = dossiers.client_id where clients.identifiant='".$_SESSION['login']."'";


Attention avec ton code actuel tu récupères uniquement la première ligne ; il faudra par la suite boucler sur : "$data = mysql_fetch_assoc($req)".
Voici la structure de ma table :

Base de données metrosite
Structure de la table dossiers
Colonne	Type	Null	Défaut
id	int(11)	Non	
nom	varchar(255)	Oui	NULL
file	varchar(255)	Oui	NULL
date	datetime	Oui	NULL
client_id	int(10)	Non	
Contenu de la table dossiers
id	nom	file	date	client_id
32	dqsdqsd	test - Copie (3).pdf	2013-10-01 00:00:00	54
30	sfsdfs	test - Copie (3).pdf	2013-07-01 00:00:00	54
23	jhiugi	Hardware.CredentialReaders.csv	2013-01-01 00:00:00	54


Il est vrais que je n'est pas testé avec INNER JOIN

pour récupérer toutes les lignes, je dois faire une fonction qui récupère toutes les lignes du style

while($data=mysql_fetch_assoc($req))
{}

je ne sais pas où je vais en disant cela, mais je me pencherais dessus ce soir.
Tu n'as pas mis "id" en clé primaire ? Y'a t'il un lien clé étrangère sur "client_id".

Commence par essayer "inner join" et en effet avec un while cela fonctionnera.

Bonne continuation.
cid5420 a écrit :
en fait je me suis pas penché sur ce que veut dire clé primaire et clé étrangère


Ce sont des règles en BDD qui permettent d'optimiser les tables et de les protéger.

Une clé primaire va permette d'identifié une ligne, c'est sa clé, c'est son ID ; il est automatiquement unique.

Lorsqu'un champ est de type primaire il peut être rattaché à une autre table. Comme dans ta table Dossiers. Cela constituera donc une clé étrangère. On appelle dans le table dossiers , la clé id_client pour identifier un client.

C'est très important comme notion ; et c'est le début de toute les pratiques en SQL.

Bon courage.
merci pour ces infos,

je suis plus solide dans le code html / css, mais pour mon boulo, on m'a demandé de me mettre au php et sql, donc pas le choix même si je dois dire que ça me passionne (surtout quand ça fonctionne)
ça commence à venir petit à petit, il est vrai que je n'est pas suivi de cours de débutant donc je prends les problème et la technique en fonction des projets qu'on me donne à développer.

c'est pour ça d’ailleurs que ce forum est super car j'apprend énormément, en plus vous êtes super réactif, du bonheur !!!


Bon comme dit précédemment, je vais tester tous cela ce soir, je vous tien au courant demain !!
Bonjour,
me voila de retour après quelques jours,
j'ai fait des tests su mon code, j'ai remplacé dans ma base de donnée, dans la table dossiers le clien_id est devenue id_client (je na sais pas si ça à changé quelque chose)

ensuite voilà le code :

<div class="content"><?php
			
			//connexion base de donnée
				$login = 'root';
				$mdp = '';
				$bdd = 'mysql:host=localhost; dbname=metrosite';
				try{
					$cnx = new PDO($bdd, $login, $mdp, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
				}catch(PDOException $error) {
					die("Erreur de connexion : ".$error->getMessage());
				}
			
			
        	$sql ="SELECT nom, file, date 
				FROM dossiers
				INNER JOIN clients
				ON clients.id = dossiers.id_client
				WHERE clients.id = (SELECT id FROM clients WHERE clients.identifiant = '".$_SESSION['login']."')";
			$res = $cnx->query($sql);
			?><table>
					<caption>Rapports</caption>
					<tr>
						<td>Date</td>
                        <td>Nom</td>
                        <td>Lien</td>
					</tr><?php
                    while ($row = $res->fetch(PDO::FETCH_ASSOC))
					{?>
                    <tr>
						<td><?php echo $row['date']; ?></td>
                        <td><?php echo $row['nom']; ?></td>
                        <td><a href="rapports/<?php $row['file']; ?>"><?php echo $row['file']; ?></a></td>
					</tr>
                    <?php }?>
				</table>
          		  
            
            	
          	
      </div>	


Vous pourrez remarquer que j'ai modifié 2 ou 3 truc est ce code fonctionne mais dans la cellule où se trouve le lien pour télécharger j'ai voulu faire un :
<a href="rapports/non.pdf>non.pdf</a>

le dossier rapports se trouve à la racine du site, et le problème quand je clique sur le lien, j'ai une page qui m'affiche la liste de tous les fichiers de dossiers "rapports"
Encore un dernier petit problème et mon site sera fonctionnel,
donc merci d'avance
Tu as oublié le echo du fichier dans la partie href:


<td><a href="rapports/<?php echo $row['file']; ?>"><?php echo $row['file']; ?></a></td>
merci pour cette remarque,

cependant j’obtiens une erreur

The requested URL /metrosite2/rapports/test - Copie (3).pdf was not found on this server.

j'ai un problème de chemin sachant que la page où le code se trouve est à la racine et que je voudrais aller dans le dossiers rapports qui se trouve aussi à la racine, et enfin trouver le fichier pdf qui s'y trouve.
Bon je viens de trouver mon problème mais pas la solution!

Lorsque j'enregistre le fichier pdf, je récupère le nom que je met dans ma base de donnée,

Cependant, si j'ai un fichier de type : aaaaa-aaaaa-aaaa.pdf
les "-" sont remplacé par des espaces, donc le fichier n'est pas trouvé

et si j'ai un fichier de type : aaaaa.aaaaa.aaaa.pdf
l'opération se déroule très bien
Rends toi maître des noms des fichiers, deux solutions sont possibles et d'autres Smiley cligne

1) Au moment de l'upload, tu supprimes des noms de fichiers tout caractères gênants ou bien tu les remplaces. (é => e, ' => -)

2) Si tu souhaites conserver l'exact nom du fichier, tu enregistres deux champs, le vrai nom, et le nom modifié. Le vrai nom correspond au nom du fichier tel qu'il a été uploadé. Le nom modifié correspond à un uniqid par exemple. Tu renommes ton fichier à l'upload (le renommage doit être unique et permettre de ne pas avoir de soucis de caractère), tu enregistres en bases les deux noms. A l'affichage tu montres le vrai nom, au téléchargement le nom modifié qui correspond au vrai fichier sur le disque. L'inconvénient est que le nom du fichier est trop changé, mais ça dépend de comment tu traites le téléchargement du fichier aussi.
Bon finalement en regardant les fichier types qui seront uploadé, il n'y a pas de caractères gênants.

Donc je vais laisser comme c'est, encore une dernière question, pour la base de donnée, si je met les variable de connexion sur une autre page, est ce que ça sera sécurisé et est ce que je peu l'appeler facilement pour mes requêtes?
Tu peux te faire un fichier connexion.php qui te génère une connexion à ta base, tu inclus ce fichier partout où tu en as besoin, dans ton cas je pense que c'est le plus simple. Sachant que ce fichier n'a pas vocation à être appelé directement (par une URL), tu peux le mettre dans un dossier (private par exemple) avec un .htaccess qui redirige ailleurs au cas où.
Bonjour,

je reviens après quelques jours d'absence, j'ai terminé mon projet grâce à vous.

Donc un grand merci.