Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 30/01/2010, 20h51   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 45
Points : 12
Points : 12
Par défaut requête sur 2 tables avec filtre sur date

bonsoir,

j'ai créé un formulaire dans lequel j'ai 2 boutons (mois, annee) + 1 bouton "envoyer"
ma requête fait appel à 2 tables: 1 table "clients" et 1 table "documents"
dans ma table "documents", j'ai un champ 'clientID' qui joint l'ID de ma table "clients"... jusqu'ici tout va bien

je souhaiterai créer une requête demandant à ce qu'on m'affiche la liste des clients (clients.nom_client) en filtrant cette liste par le champ 'temps' (au format: 2010-01-13 par ex.) qui contient à la fois le mois et l'année (suis-je suffisamment clair ?).

voici le code de ma requête que je pensais juste:
Code :
1
2
3
4
SELECT clients.ID, clients.nom_client, documents.clientID, documents.temps
FROM clients, documents
WHERE documents.temps LIKE %colmois% AND documents.temps LIKE %colannee% AND clients.ID=documents.clientID
ORDER BY clients.nom_client ASC
merci
pp_le_moko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2010, 21h02   #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
on jointure se fait avec JOIN
Code :
1
2
SELECT clients.ID, clients.nom_client, documents.clientID, documents.temps
FROM clients JOIN documents ON clients.ID=documents.clientID
Pour ton filtre tu peux utiliser les fonctions de date MONTH et YEAR
Code :
WHERE MONTH(documents.temps) = valeur_mois AND YEAR(documents.temps) = valeur_annee
LIKE et % servent pour traiter des chaines de caractères.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2010, 00h15   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 45
Points : 12
Points : 12
bonsoir, et merci pour ta réactivité

bon, maintenant, je m'y perd encore plus... (débutant oblige)
je suis d'accord pour la jointure mais pour le filtre, j'ai modifié le champ 'temps' avec DATE... je n'ai plus que l'année, le mois et le jour... jusque là, je suis.

Code :
WHERE MONTH(documents.temps) = valeur_mois AND YEAR(documents.temps) = valeur_annee
mes 2 boutons (année et mois) avait comme valeur 2010, 2011... pour les années et '-01-', '-02-'... pour les mois...
Est-ce que je dois corriger les valeurs de mes boutons... parce que je me retrouve avec "valeur_mois" et "valeur_annee" (voir code)... quelle est la signification de ces 2 éléments ?

je me servais de "LIKE et % servent pour traiter des chaines de caractères", parce que je ne connaissais que cette manière de récupérer les infos...
aujourd'hui tu m'apprends à passer par un autre chemin beaucoup plus efficace à priori... mais incompréhensible aujourd'hui pour moi...
j'ai besoin de plus de pédagogie...


merci
pp_le_moko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2010, 00h46   #4
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 45
Points : 12
Points : 12
... j'oubliais...
j'ai testé le champ 'temps' avec DATE comme type... tous mes futurs enregistrements me retournent maintenant comme valeur 0000-00-00 (???). Ce n'est évidemment pas souhaitable.

le type TIMESTAMP m'offrait la possibilité d'avoir accès à "on update current timestamp" qui me permettait de créer une date de création et/ou de modification de l'enregistrement...
j'ai oublié quelque chose ?

merci
pp_le_moko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2010, 12h20   #5
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
Si tu preferes utiliser un type TIMESTAMP tu peux quand même obtenir les informations du mois et de l'années
Code :
MONTH(FROM_UNIXTIME(documents.temps)) = valeur_mois
Ici "valeur_mois" doit être le numéro du mois, d'ou qu'il vienne.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2010, 12h31   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 45
Points : 12
Points : 12
désolé pour ce réveil matinal...
effectivement, je suis plus à l'aise avec un TIMESTAMP...
je médite tes commentaires...

mais, pour ma culture personnelle... DATE reste pour moi un échec...
mes enregistrements doivent automatiquement être datés, qu'ils le soient en mode création ou en mode modification

je te laisse tranquille pour aujourd'hui... week-end oblige

merci encore
pp_le_moko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2010, 01h39   #7
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 45
Points : 12
Points : 12
Par défaut page suivante, page précédente, etc.

bonsoir,

J'ai employé JOIN et ON pour mes jointures (OK). Le reste, je pense l'avoir assimilé... j'obtiens aujourd'hui ce que je voulais... une liste d'après ma requête SQL.
Lorsque je liste sur ma page mes enregistrements, ils s'affichent correctement mais je voudrais qu'apparaisse sur 1 page un certain nombre d'enregistrement. Quand le nombre d'enregistrement est atteint sur une seule page, 4 boutons me permettent d'accéder à:
page précédente, page suivante, début de la liste et fin de la liste
Or, l'affichage de la première page se passe bien, par contre, pour page suivante, page précédente, début liste, fin liste, les pages générées sont vides. Pourquoi ?
Ma requête se fait sur 3 variables connues: mois, annee et marques
Suis-je sensé retrouver ces trois variables dans:
Code :
<a href="<?php printf("%s?pageNum_rsRecap=%d%s", $currentPage, max(0, $pageNum_rsRecap - 1), $queryString_rsRecap); ?>">page précédente</a>
Code :
<a href="<?php printf("%s?pageNum_rsRecap=%d%s", $currentPage, min($totalPages_rsRecap, $pageNum_rsRecap + 1), $queryString_rsRecap); ?>">page suivante</a>
Code :
<a href="<?php printf("%s?pageNum_rsRecap=%d%s", $currentPage, 0, $queryString_rsRecap); ?>">début de la liste</a>
Code :
<a href="<?php printf("%s?pageNum_rsRecap=%d%s", $currentPage, $totalPages_rsRecap, $queryString_rsRecap); ?>">fin de la liste</a>
?

Ma requête SQL
Code :
1
2
3
4
SELECT clients.ID, clients.nom_client, documents.ID, documents.nom_doc, documents.icoMasterExe, documents.icoCom, documents.icoFab, documents.icoCrea, documents.icoGravure, documents.icoInfo, documents.icoExe, documents.clientID, documents.marqueID, documents.tempsH_com, documents.tempsMN_com, documents.tempsH_fab, documents.tempsMN_fab, documents.tempsH_crea, documents.tempsMN_crea, documents.tempsH_exe, documents.tempsMN_exe, documents.tempsH_info, documents.tempsMN_info, documents.tempsH_gravure, documents.tempsMN_gravure, documents.temps
FROM documents JOIN clients ON documents.clientID = clients.ID
WHERE documents.temps LIKE %col_mois% AND documents.temps LIKE %col_annee% AND documents.marqueID LIKE %col_marques%
ORDER BY nom_doc ASC
Mon jeu d'enregistrement complet:
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
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
 
  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
 
  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}
 
$currentPage = $_SERVER["PHP_SELF"];
 
$maxRows_rsRecap = 32;
$pageNum_rsRecap = 0;
if (isset($_GET['pageNum_rsRecap'])) {
  $pageNum_rsRecap = $_GET['pageNum_rsRecap'];
}
$startRow_rsRecap = $pageNum_rsRecap * $maxRows_rsRecap;
 
$col_mois_rsRecap = "-1";
if (isset($_POST['mois'])) {
  $col_mois_rsRecap = $_POST['mois'];
}
$col_marques_rsRecap = "-1";
if (isset($_POST['marques'])) {
  $col_marques_rsRecap = $_POST['marques'];
}
$col_annee_rsRecap = "-1";
if (isset($_POST['annee'])) {
  $col_annee_rsRecap = $_POST['annee'];
}
mysql_select_db($database_interface_c14, $interface_c14);
$query_rsRecap = sprintf("SELECT clients.ID, clients.nom_client, documents.ID, documents.nom_doc, documents.icoMasterExe, documents.icoCom, documents.icoFab, documents.icoCrea, documents.icoGravure, documents.icoInfo, documents.icoExe, documents.clientID, documents.marqueID, documents.tempsH_com, documents.tempsMN_com, documents.tempsH_fab, documents.tempsMN_fab, documents.tempsH_crea, documents.tempsMN_crea, documents.tempsH_exe, documents.tempsMN_exe, documents.tempsH_info, documents.tempsMN_info, documents.tempsH_gravure, documents.tempsMN_gravure, documents.temps FROM documents JOIN clients ON documents.clientID = clients.ID WHERE documents.temps LIKE %s AND documents.temps LIKE %s AND documents.marqueID LIKE %s ORDER BY nom_doc ASC", GetSQLValueString("%" . $col_mois_rsRecap . "%", "text"),GetSQLValueString("%" . $col_annee_rsRecap . "%", "text"),GetSQLValueString("%" . $col_marques_rsRecap . "%", "text"));
$query_limit_rsRecap = sprintf("%s LIMIT %d, %d", $query_rsRecap, $startRow_rsRecap, $maxRows_rsRecap);
$rsRecap = mysql_query($query_limit_rsRecap, $interface_c14) or die(mysql_error());
$row_rsRecap = mysql_fetch_assoc($rsRecap);
 
if (isset($_GET['totalRows_rsRecap'])) {
  $totalRows_rsRecap = $_GET['totalRows_rsRecap'];
} else {
  $all_rsRecap = mysql_query($query_rsRecap);
  $totalRows_rsRecap = mysql_num_rows($all_rsRecap);
}
$totalPages_rsRecap = ceil($totalRows_rsRecap/$maxRows_rsRecap)-1;
 
$queryString_rsRecap = "";
if (!empty($_SERVER['QUERY_STRING'])) {
  $params = explode("&", $_SERVER['QUERY_STRING']);
  $newParams = array();
  foreach ($params as $param) {
    if (stristr($param, "pageNum_rsRecap") == false && 
        stristr($param, "totalRows_rsRecap") == false) {
      array_push($newParams, $param);
    }
  }
  if (count($newParams) != 0) {
    $queryString_rsRecap = "&" . htmlentities(implode("&", $newParams));
  }
}
$queryString_rsRecap = sprintf("&totalRows_rsRecap=%d%s", $totalRows_rsRecap, $queryString_rsRecap);
?>

merci pour votre patience
pp_le_moko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2010, 01h48   #8
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
Ta requete est toujours la requete pourrie du début.
Enfin réflechi un peu, tu écris
Code :
WHERE documents.temps LIKE %col_mois% AND documents.temps LIKE %col_annee%
ca n'a aucun sens.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2010, 03h04   #9
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 45
Points : 12
Points : 12
La forme peut effectivement te paraître primaire, voire 'pourrie' dans:
Code :
WHERE documents.temps LIKE %col_mois% AND documents.temps LIKE %col_annee%
j'essaie simplement de rechercher un mois + une année dans le champ "temps" de la table "documents" (ANNEE-MOIS-JOUR). J'en suis à mes premiers pas, et ça ne me parait pourtant pas idiot.

Le bon sens voudrait sans doute qu'il soit écrit comme cela
Code :
WHERE MONTH(FROM_UNIXTIME(documents.temps)) = valeur_mois
idem pour l'année

Si la syntaxe de cette requête est mal rédigée (je suis d'accord), pourquoi influence-t-elle le problème de l'affichage des points "page suivante", "page précédente"... cités avant ?

Je ne demande qu'à apprendre.

Dernière modification par pp_le_moko ; 06/02/2010 à 03h27.
pp_le_moko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2010, 10h51   #10
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
Citation:
de la table "documents" (ANNEE-MOIS-JOUR)
Justement ta colonne n'a pas ce format Annee-Mois-Jour puisque c'est un Timestamp.

Citation:
Je ne demande qu'à apprendre.
Justement je t'ai expliqué, je t'ai montré comment bien écrire et tu restes sur ta syntaxe qui est mauvaise.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2010, 14h13   #11
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 45
Points : 12
Points : 12
Tu me dis qu'il faut écrire comme tu me le montres... je n'ai rien contre puisque je suis là pour apprendre.

Est-ce que, écrit comme ça, cette forme est correcte ?
Code :
1
2
3
4
SELECT clients.ID, clients.nom_client, documents.ID, documents.nom_doc, documents.icoMasterExe, documents.icoCom, documents.icoFab, documents.icoCrea, documents.icoGravure, documents.icoInfo, documents.icoExe, documents.clientID, documents.marqueID, documents.tempsH_com, documents.tempsMN_com, documents.tempsH_fab, documents.tempsMN_fab, documents.tempsH_crea, documents.tempsMN_crea, documents.tempsH_exe, documents.tempsMN_exe, documents.tempsH_info, documents.tempsMN_info, documents.tempsH_gravure, documents.tempsMN_gravure, documents.temps
FROM documents JOIN clients ON documents.clientID = clients.ID
WHERE MONTH(FROM_UNIXTIME(documents.temps)) = valeur_mois AND YEAR(FROM_UNIXTIME(documents.temps)) = valeur_annee
ORDER BY documents.nom_doc ASC
ensuite, je voudrais bien comprendre ce qui se passe pour mes liens "page suivante"... pas de me donner du code mais qu'on explique.

merci
pp_le_moko 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 +1. Il est actuellement 21h08.


 
 
 
 
Partenaires

Hébergement Web