Précédent   Forum des professionnels en informatique > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2011, 21h05   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
Par défaut passage de requete sql par variables

Bonsoir tout le monde

Je rencontre un petit problème en ce moment avec une génération de code sql via un formulaire, je vous explique...

J'aimerais pouvoir faire un tri sur une liste d'offre d'emplois stocké dans une table de donnée, vu que soit il affiche tout (et dans ce cas je n'ai pas de condition dans ma requête) ou soit une partie définie par des listes déroulantes

Voici comment j'ai imaginé la chose:
Si tout doit être affiché, la variable vaut une chaine vide
Sinon j’écris la requête dans une variable et je la transmets

Voici le code que j'ai tapé:
Tout d'abord une partie de ma classe Job ou je communique avec la bdd

Job.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
class Jobs
{
//***************************
// CONSTRUCTEUR - DESTRUCTEUR
//***************************
	private $connection;
	function __construct()
	{
		try
		{
			$this->connection=new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'', DB_USER, DB_PASS);
 
		}
		catch (Exception $e)
		{
				return('Erreur : ' . $e->getMessage());
		}
	}
	function __destruct()
	{
		$this->connection=null;
	}
        ...
	public function afficheJobFournisseur($where_date)
	{
		$req = $this->connection->query('SELECT a.id as id_annonce, a.titre as titre_annonce, DAY(j.date_creation) as jour, 
		                                          MONTH(j.date_creation) as mois, YEAR(j.date_creation) as annee, s.nom as nom_secteur
			        				       FROM annonce AS a
										   LEFT JOIN job AS j ON j.id = a.fk_id_job
										   LEFT JOIN secteur As s ON s.id = j.fk_id_secteur
										   WHERE (a.langue =  a.default_language)
 
										   '.$where_date.'
										   ORDER BY j.date_creation DESC');
		$tab = array() ;								 
		$arrayRetour = array() ;
		while($donnees = $req->fetch()) 
		{
			$arrayRetour["reference"]            = $donnees["id_annonce"].$donnees["jour"].$donnees["mois"].$donnees["annee"];
			$arrayRetour["titre_annonce"]        = html_entity_decode($donnees["titre_annonce"]);
			$arrayRetour["nom_secteur"]          = html_entity_decode($donnees["nom_secteur"]);
			$arrayRetour["date_publication"]     = $donnees["jour"].'/'.$donnees["mois"].'/'.$donnees["annee"];
 
			array_push($tab,$arrayRetour);
		}
		return $tab;
		$req->closeCursor();	
	}
}
?>
Et voici le code de la page envoyant la requête:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
session_start(); 
?>
<?php
require '../../globals/globals.php';
function __autoLoad($nomClasse)
{
	require_once('../../classes/'.$nomClasse.'.php');
}
$jobs = new Jobs();
$secteur = $jobs->secteur();
if(!empty($_POST["val_secteur"]))
{
	$where_secteur = $_POST["val_secteur"];
}else{
	$where_secteur = '';
}
if(!empty($_POST["val_publication"]))
{
	$where_date = $_POST["val_publication"];
}else{
	$where_date = '';
}
$annonce = $jobs->afficheJobFournisseur($where_date);
 
//code sql des dates
$aujourdhui = 'AND (j.date_creation >= DATE_SUB(NOW),INTERVAL 1 DAY)';
$hier = 'AND(j.date_creation >= DATE_SUB(NOW-1),INTERVAL 1 DAY)';
$septDernierJours = 'AND (j.date_creation >= DATE_SUB(NOW),INTERVAL 7 DAY)';
?>
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Urbantech</title>
 
<link href="./css/style.css" rel="stylesheet" type="text/css" />
<script src="./script/script.js" type="text/javascript"></script>
</head>
 
<body id="body" onLoad="setFooter();">
<?php //require("./lang/decide-lang.php");?>  
<?php include("./inc/entete.php"); ?>
 
<div id="site"><br>
<form action="index.php" onsubmit="" method="post" enctype="multipart/form-data">
<input type="hidden" name="val_secteur" id="val_secteur" value="">
<input type="hidden" name="val_publication" id="val_publication" value="">
<table width="288" border="0" cellspacing="4" cellpadding="0">
  <tr>
    <td width="80">Secteur : </td>
    <td width="114"><select name="secteur" id="secteur" class="select" onchange="document.getElementById('val_secteur').value = this.value">
      <option value ="">Tout</option>
<?php
foreach($secteur as $sect)
{
	echo '<option value ='.$sect["id"].'>'.$sect["nom"].'</option>';
}
?>
    </select></td>
  </tr>
  <tr>
    <td>Parution :</td>
    <td><select name="publication" id="publication" class="select" onchange="document.getElementById('val_publication').value = this.value">
      <option value ="">Toutes</option>
      <option value ="2">Aujourd'hui</option>
      <option value ="<?php echo $hier ?>">hier</option>
      <option value ="<?php echo $septDernierJours ?>">des 7 derniers jours</option>
      <option value ="">De ce mois</option>
    </select></td>
  </tr>
</table>
<input type="submit"  name="confirm" id="confirm" value="ok" />
<br>
</form>
 
<table width="100%" border="1" cellspacing="0" cellpadding="0">
  <tr>
    <td>Référence</td>
    <td>Nom de la fonction</td>
    <td>Secteur</td>
    <td>Date</td>
  </tr>
 
</table>
 
</div>
<?php include("./inc/pied_de_page.php"); ?>
</body>
</html>
En validant une option sélectionnée dans la liste publication

J'obtiens cette erreur:

Code :
Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\urbantech_v1\classes\Jobs.php on line 432
Ce n'est pas un problème d’identification du serveur car si je change le code de ma classe comme tel (j'ai juste viré le paramètre):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public function afficheJobFournisseur()
	{
		$req = $this->connection->query('SELECT a.id as id_annonce, a.titre as titre_annonce, DAY(j.date_creation) as jour, 
		                                          MONTH(j.date_creation) as mois, YEAR(j.date_creation) as annee, s.nom as nom_secteur
			        				       FROM annonce AS a
										   LEFT JOIN job AS j ON j.id = a.fk_id_job
										   LEFT JOIN secteur As s ON s.id = j.fk_id_secteur
										   WHERE (a.langue =  a.default_language)
 
										   ORDER BY j.date_creation DESC');
		$tab = array() ;								 
		$arrayRetour = array() ;
		while($donnees = $req->fetch()) 
		{
			$arrayRetour["reference"]            = $donnees["id_annonce"].$donnees["jour"].$donnees["mois"].$donnees["annee"];
			$arrayRetour["titre_annonce"]        = html_entity_decode($donnees["titre_annonce"]);
			$arrayRetour["nom_secteur"]          = html_entity_decode($donnees["nom_secteur"]);
			$arrayRetour["date_publication"]     = $donnees["jour"].'/'.$donnees["mois"].'/'.$donnees["annee"];
 
			array_push($tab,$arrayRetour);
		}
		return $tab;
		$req->closeCursor();	
	}
}
et que j' insert ceci dans ma page

Code :
1
2
3
4
5
6
7
8
9
10
11
12
<?php
foreach($annonce as $anno)
{
	echo '
	<tr>
		<td>'.$anno["reference"].'</td>
		<td>'.$anno["titre_annonce"].'</td>
		<td>'.$anno["nom_secteur"].'</td>
		<td>'.$anno["date_publication"].'</td>
	</tr>';
}
?>
tout en modifiant l'appel de ma fonction en retirant les paramètres:

Code :
$annonce = $jobs->afficheJobFournisseur();
Il m'affiche bien toutes les offres.
Auriez vous une idée d’où pourrait venir le problème? ou bien une solution parallèle?

Merci d'avance
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 21h16   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Passer une requête entière ou des bouts de SQL à travers un formulaire est mauvais.
Ta requête doit être construite à l'arrivée ; seuls les paramètres sont transmis.

Sinon quand même, en dehors du problème de fond sur ce que tu fais, le debug de ton code passe par l'affichage des erreurs PDO.

Je ne me suis pas relu tes 150 lignes de code dans le détail mais je me suis quand même demandé pourquoi le select "secteur" copie sa valeur dans un champ caché "val_secteur".
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 21h57   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
Merci pour cette réponse rapide :p

car je dois faire un tri sur les 2, donc des que ca marchera je mettrai le second paramètre qui sera l'id du secteur.

Comment puis je m y prendre "proprement"?
aurais tu un exemple (en sachant bien sur qu'aucun paramètre ne devrait être passé dans le cas ou je désire avoir tous les secteurs ou/et tous les publications)
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 22h04   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
C'est juste une question du moment ou tu fais les choses : au lieu par exemple de passer le bout de requête, tu passes simplement ton paramètre "hier" et tu le traites à la reception :
Code :
1
2
3
4
5
6
7
8
9
10
11
if (isset($_POST['publication']) {
switch ($_POST['publication']) {
   case 'hier' :
       $where[] = 'j.date_creation >= DATE_SUB(NOW-1),INTERVAL 1 DAY';
   break;
 
   case 'aujourdhui' :
         $where[] = 'j.date_creation >= DATE_SUB(NOW),INTERVAL 1 DAY';
   break;
}
}
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 23h36   #5
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
$where[] vaut quoi? un array?

Je vais essayer^^
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 23h44   #6
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
J'ai fais pareil que toi avec $where_date = ... au lieu de $where[] = ...

L'erreur reste la même
Mais c'est sur c'est plus propre et plus lisible :p

Merci
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 00h59   #7
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Pour l'erreur, je t'ai dis, il faut controler ta requete et afficher les erreurs PDO.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 08h31   #8
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
Et comment puis je faire cela (dsl je suis un peu noob en php )
Aurais tu un tuto ou un exemple?
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 09h14   #9
Membre actif
 
Avatar de Lician
 
Homme Jordan
Etudiant Architecture Logiciel
Inscription : mars 2011
Messages : 72
Détails du profil
Informations personnelles :
Nom : Homme Jordan
Âge : 23
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Etudiant Architecture Logiciel
Secteur : Services de proximité

Informations forums :
Inscription : mars 2011
Messages : 72
Points : 175
Points : 175
Tu peux déjà simplement récupérer le résultat de ta requête dans une variable et l'afficher.
Au moins voir ce qu'il se passe... ^^
Lician est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 09h24   #10
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 449
Points : 3 449
Salut !
Pour contrôler ta requête il suffit, avant de l'exécuter, de l'affecter à une variable et de l'afficher.
Pour voir les erreurs PDO il existe la méthode errorInfo, tu trouveras des exemples d'utilisation dans la doc : http://fr.php.net/manual/fr/pdo.errorinfo.php
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 09h42   #11
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Tu peux chercher aussi un peu si tu n'as pas tout les éléments :
Par exemple :
http://www.developpez.net/forums/d70...n-erreurs-pdo/
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 11h21   #12
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
merci bcp je vais checker les liens et afficher les erreurs, je vous tiens au courant :p
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h01   #13
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
Bon il veut pas aficher les erreur (il me remet tjs la mm erreur à la place)

mais j ai trouver une solution alternatique

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Code :
1234567891011121314151617181920212223
$where_date  = ' SELECT a.id as id_annonce, a.titre as titre_annonce, DAY(j.date_creation) as jour,';
$where_date = $where_date.' MONTH(j.date_creation) as mois, YEAR(j.date_creation) as annee, s.nom as nom_secteur';
$where_date = $where_date.' FROM annonce AS a';
$where_date = $where_date.' LEFT JOIN job AS j ON j.id = a.fk_id_job';
$where_date = $where_date.' LEFT JOIN secteur As s ON s.id = j.fk_id_secteur';
$where_date = $where_date.' WHERE (a.langue =  a.default_language)';
if (isset($_POST['val_secteur'])) {
	if(!empty($_POST['val_secteur'])) $where_date = $where_date.' AND (j.fk_id_secteur = '.$_POST['val_secteur'].')';
}
if (isset($_POST['val_publication'])) {
switch ($_POST['val_publication']) {
   case 'hier' :
	   $where_date = $where_date.' AND (j.date_creation = DATE_SUB(CURRENT_DATE(),INTERVAL -1 DAY))';
   break;
 
   case 'aujourdhui' :
		 $where_date = $where_date.' AND (j.date_creation >= DATE_SUB(CURRENT_DATE(),INTERVAL 0 DAY))';
   break;
}
}
$where_date = $where_date.' ORDER BY j.date_creation DESC';
echo 'date : '.$where_date;
$annonce = $jobs->afficheJobFournisseur($where_date);
ca fonctionne tres bien, mais je bug sur autre chose mntnt

ceci me permet d'avoir la date d'hier et aujourd'hui

Code :
AND (j.date_creation >= DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY))
Mais j aimerais avoir rien qu'hier
J'ai essayer differente méthode

Code :
1
2
3
AND (j.date_creation = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY))
AND (j.date_creation = DATE_SUB(CURRENT_DATE(),INTERVAL -1 DAY))
AND (j.date_creation = DATE_DIFF(CURRENT_DATE(),INTERVAL 1 DAY))
et d'autre solution rien ne me retourne uniquement la date precedente
Auriez-vous une idee? (pour mysql)
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h09   #14
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
Bonjour,

J'ai testé la solution SELECT DATE_SUB( CURRENT_DATE( ) , INTERVAL 1 DAY ) et elle fonctionne très bien (elle retourne la date d'hier).
Es tu sur que le problème ne vient pas d’ailleurs ?
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h28   #15
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
bah si je fais ceci

Code :
$where_date = $where_date.' AND (j.date_creation = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY))';
Je n'ai aucune reponse

et avec ceci

Code :
$where_date = $where_date.' AND (j.date_creation >= DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY))';
j'obtiens ceci

Référence Nom de la fonction Secteur Date
1522552011 testttt 2 ICT 25/5/2011
1532452011 test3 ICT 24/5/2011
1472452011 test Engineering 24/5/2011

Bizarre quand même :/
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h32   #16
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
Fais juste un :

Code :
SELECT DATE_SUB( CURRENT_DATE( ) , INTERVAL 1 DAY )
Et regarde le résultat.
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h46   #17
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
effectivement ca renvois bien a hier :s

le problème ne serait pas car la date dans ma db est au format datetime (2011-05-24 14:50:28) ?
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h50   #18
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
Citation:
Envoyé par healou Voir le message
effectivement ca renvois bien a hier :s

le problème ne serait pas car la date dans ma db est au format datetime (2011-05-24 14:50:28) ?
Ça doit surement venir de la, mais pourquoi la requête ">=" marche-t-elle alors ? . Bizarre :/.

J'vais essayer de voir si je trouve une solution.
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h55   #19
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
J'ai trouvé ceci : (attention c'est crade)

Code :
SELECT SUBTIME( SUBTIME( NOW( ) , CURRENT_TIME ) , "1 00:00:00" )
Ça affiche bien "2011-05-24 00:00:00". Ça devrait donc être bon.
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h56   #20
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 56
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 56
Points : 13
Points : 13
Je viens de trouver le pq mais pas le comment ^^

vu qu'il y a que le jour moi annee de passé en parametre, 'il considere que l'heure est 00:00:00 d'ou ca marcherait avec le >= et non pas avec le = (vu que je n'avais aucun poste avec 00:00:00)

solution faire un bettwen entre 00:00:00 et 23:59:59, mais comment faire pour lui faire passé l'heure avec cette fonction xD
healou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h18.


 
 
 
 
Partenaires

Hébergement Web