Bonsoir,

Dans le cadre d'un projet j'ai eu besoin de faire une liste de professeur lié a une base de donnée
ma liste reste toujours vide et parfois elle fait buguer le reste de la page

voici mon fichier database.php

<?php

define('DBHOST','localhost');
define('DBNAME','plateforme');
define('DBUSER','root');
define('DBPASSWORD','');

try{
	$db = new PDO("mysql:host=".DBHOST.";dbname=".DBNAME, DBUSER, DBPASSWORD);
	
	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	
	$db->query('SELECT * FROM users');
	
	
} catch(PDOException $e) {
	die('Erreur :'.$e->getMessage());
}




voici mon submit.php

<?php
	session_start();
	include('filters/auth_filter.php');
	require('config/database.php');
	require('includes/functions.php');
	require('includes/constants.php');
	
	$msg="";
	//Si le formulaire a ete soumis
	if(isset($_POST['upload'])) {
		
		//Si tous les champs ont ete remplis
		if(not_empty(['prof_name','doc_title','doc_resume','doc_type','doc_thematique'])){
			
			extract($_POST);
			
			$target = "uploads/".basename($_FILES['doc']['name']);
		
		
			$doc = $_FILES['doc']['name'];
		
			
			
			
//			$resume = $_POST[''];
			
			$sql = "INSERT into uploads (document, titre, resume, type, thematique) VALUES ('$doc', '$doc_title', '$doc_resume', '$doc_type', '$doc_thematique')";
				
				
				$q = $db->prepare($sql);
				$q->execute();
				
			
			if(move_uploaded_file($_FILES['doc']['tmp_name'], $target)) {
				$msg = 'Le Document a bien été envoyé';
				
			}else {
				$msg = 'Error uploading doc';
			}
		}else {
			set_flash('Veuillez remplir tous les champs !', 'danger');
			}
		set_flash($msg,'info');
	}
	
?>
 <?php require('views/submit.view.php'); ?>





et mon submit.view.php:

<?php $title = "Soumission";?>
 <?php include('partials/_header.php');?>
 
<div class="container">
<h1>Nouveau dépôt</h1>
	
	<div id="main-content">

		<form ENCTYPE="multipart/form-data" class="well col-md-6 col-md-offset" autocomplete="off" name="mon_form" method="post" action="#">
			
				<label for="prof_name">Professeur:</label>
				<select name="prof_name" id="prof_name" class="form-control">
					
			
					<?php
					$q = $db->prepare("SELECT name FROM users WHERE (profession='Professeur' && active='1')") ; 
				 
	/*				while ($donnees = $q->fetch()) {?>
					 
						<option value="<?php echo $donnees['name']; ?>"> <?php echo $donnees['name']; ?></option>
									 
									<?php   
									}  
	*/					 
						?>          
							 
				</select>

			
			
			
			
			
			
				<div class="form-group">
					<label class="control-label" for "doc_title">Titre de l'article:</label>
					<input type="text" value="" class="form-control" id="doc_title" name="doc_title"
						   required="required"/>
				</div>
			
				<textarea class="form-control" required="required" rows="18"id="doc_resume" name="doc_resume" placeholder="Résumé du document (2000 caractères)"></textarea>
				</br>
				
				<font size="4">Définir le type:</font></br>

						
				<select class="form-control" name="doc_type" id="doc_type" required>
					<option value="communication">Communication</option>
					<option value="type2">Type 2</option>
					<option value="type3">Type 3</option>
					<option value="type4">Type 4</option>
				</select>
				
				</br>
				
				<font size="4">Définir la thématique:</font></br>

			   <select class="form-control" name="doc_thematique" id="doc_thematique" required>
				   <option value="thematique1">Thématique 1</option>
				   <option value="thematique2">Thématique 2</option>
				   <option value="thematique3">Thématique 3</option>
				   <option value="thematique4">Thématique 4</option>
						   
				</select>

				</br>

				<font size="4">Veuillez inserer le document:</font></br>

				<div style ="color:red"><p><?php if (isset($error)) echo $error;?></p>
				</div>
					<input type="hidden" name="size" value="1000000">
				
						<input type="file" name="doc" required> <br> 
					
						<input type="submit" class="btn btn-primary" name="upload" value="Envoyer">
					
			
		</form>
	</div>
</div>
	
<!--  --> 





 
 <?php include('partials/_footer.php');?>


une fois la partie commentaire enlevé, les problemes surgissent.
Ceci dit, j'ai bien verifier le code de la requete SQL et il marche avec phpmyadmin.

Merci de bien vouloir m'aider.
Modifié par Loug (25 May 2017 - 22:49)
@Zelana
not_empty est une fonction que j'avais créer dans le fichier functions.php
c'est la meme que !empty

@bzh
Je ne devrais pas mettre des $POST en variable c'est ce que tu veux dire ?

@kustolovic
Peux tu bien me préciser la ligne car j'avoue, je n'ai appris l'html/php que par des video youtube Smiley ohwell

Merci bien pour vos réponses constructives.
Pas avec extract car en faisant cela tu permets à n'importe qui d'injecter des variables dans ton code. Pour bien faire il faudrait tester toutes les clés de $_POST et même, à mon avis, il faut juste ne jamais utiliser cette fonction qui crée potentiellement des problèmes.

Lorsque tu utilises $_POST ou autre données provenant de l'utilisateur, tu es sensé tester ce qui est envoyé.
Modérateur
Yep c'est ici:


 $sql = "INSERT into uploads (document, titre, resume, type, thematique) VALUES ('$doc', '$doc_title', '$doc_resume', '$doc_type', '$doc_thematique')";

  $q = $db->prepare($sql);
  $q->execute();
@bzh
Ahh je comprends mieux, c'est bon reçu Smiley smile

@kustolovic
Merci bien (y)

je vais corriger tout ceci, cependant pour mon problème ?

Corrigé, j'ai enlever l'extract et mis ceci a la place de la requête:
$sql = "INSERT into uploads (document, titre, resume, type, thematique) VALUES ('$doc', '$_POST[doc_title]', '$_POST[doc_resume]', '$_POST[doc_type]', '$_POST[doc_thematique]')";
				
				
				$q = $db->prepare($sql);
				$q->execute();

Modifié par Loug (26 May 2017 - 14:27)
En fait concernant la remarque de kustolovic, tu dois faire tes requêtes comme ceci :

$calories = 150;
$couleur = 'rouge';
$sth = $dbh->prepare('SELECT nom, couleur, calories
    FROM fruit
    WHERE calories < :calories AND couleur = :couleur');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':couleur', $couleur, PDO::PARAM_STR, 12);

(Ou autre exemple de la page php.net)
Pour ne pas exposer ton code aux injection SQL (voir Injection SQL)

Aussi, il faudrait passer tes données dans la fonction htmlspecialchars pour éviter que quelqu'un puisse passer du JS dans tes formulaires.

Concernant ton problème initial, essaye d'afficher tes valeurs :

while ($donnees = $q->fetch()) {
print_r($donnees);
}

Modifié par bzh (26 May 2017 - 15:21)
@bzh
J'ai fait comme dans l'exemple que vous m'avez donné.
Concernant le probleme j'ai deja tester de faire que la partie </select> dans une nouvelle page et ca a marché, etrange ...

voici ce que j'ai fait

<?php
session_start();
require('config/database.php');
require('includes/functions.php');
require('includes/constants.php');
?>

<?php include('partials/_header.php');?>

<label for="prof_name">Professeur:</label>
				<select name="prof_name" id="prof_name" class="form-control">
					<option>Prof</option>
			
					<?php
					$q = $db->prepare("SELECT name FROM users WHERE (profession='Professeur' && active='1')") ; 
				 
					while ($donnees = $q->fetch()) {?>
					 
						<option value="<?php echo $donnees['name']; ?>"> <?php echo $donnees['name']; ?></option>
									 
									<?php   
									}  
						 
						?>          
							 
				</select>


 <?php include('partials/_footer.php');?>
Non, tu ne fais pas comme les exemples de php.net car tu passes directement les variables dans ta requête au lieu d'utiliser les marqueurs ce qui crée une faille de sécurité.

Tu as bien inclus ton fichier config/database.php quelque part dans submit.view.php ?
Si non, il faut vraiment que tu actives le debug de php, pas possible de travailler sans.
@bzh
Vous m'avez mal compris, je voulais dire que j'ai corriger après votre remarque. j'ai mis les $_POST en variable $x et mis les $x dans la requête.

Pour ce qui est de la database elle a deja été inclus dans mon fichier submit.php et le submit.php contient son view a la fin d'ou tout est lié.

Activer le debug ? désolé je suis encore un initié d'ou mon incompétence.
Modifié par Loug (26 May 2017 - 17:14)
PROBLEME RESOLU Smiley lol
J'ai oublier d'executer ma requete SQL. Smiley bawling
J'ai remplacer mon $q = $db->prepare par un query. Smiley langue

Sinon merci pour votre aide, j'ai compris bien des choses surtout en ce qui concerne les failles de mon projet.

bonne soirée Smiley smile
Modifié par Loug (26 May 2017 - 17:28)