Dâtes et requetes

Mammouth du PHP | 531 Messages

26 oct. 2007, 17:31

Bonjour

J'ai des dâtes au format US dans ma base (2007-10-25)

Je voudrais savoir si via une requête il est possible de sélectionner des champs avec des conditions de ce type : WERE mois = x AND annnée = x.

Merci d'avance
Bon week end :wink:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 oct. 2007, 17:33

Et si tu essayais une requête du genre

Code : Tout sélectionner

SELECT champ FROM matable WHERE date = 'annee-mois-%'
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 531 Messages

26 oct. 2007, 17:45

Effectivement c'est une idée
Par contre ça ne me retourne aucun résultat
$year= '2007-%-%';
	$req_visites= mysql_query("SELECT ip,page,date FROM bloom_stats WHERE date='".$year."' ORDER BY date,ip DESC"); // SELECTION DES VISITES

Eléphant du PHP | 443 Messages

26 oct. 2007, 17:50

Essaie plutot:
$year= '2007-__-__';
	$req_visites= mysql_query("SELECT ip,page,date FROM bloom_stats WHERE date like '".$year."' ORDER BY date,ip DESC");

Tracker.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

26 oct. 2007, 18:36

ça ne me retourne aucun résultat
Le problème vient de l'opérateur, qui doit être LIKE plutôt que =

Inutile de vous embarasser avec des masques trop longs, si vous voulez une année particulière utilisez LIKE '2007-%', pareil pour un mois, LIKE '2007-11-%'.

ViPHP
ViPHP | 2144 Messages

26 oct. 2007, 22:30

Petite info en plus, ce ne sont pas des dates us (l'année est en première), mais le format "normal" pour stocker des dates. La raison de stocker sous la forme aaaa-mm-jj est de pouvoir réaliser des tris sur les dates aisément.

Mammouth du PHP | 531 Messages

27 oct. 2007, 00:53

Merci pour vos réponses.
Par contre je nage là. Dans le default on est censé récupérer les infos dont la dâte est celle du jour. Résultat tout est récupéré, même les entrées d'il y a 3 jours en arrière... Et puis dans la case mois le résultat ben c'est le même, tout est affiché, mais bon la je suis moins sur de moi sur le fait qu'il n'y ais pas d'erreur...

$date_jour= date("Y-m-d"); // DATE DU JOUR
default:
	$req_visites= mysql_query("SELECT ip,page,date FROM bloom_stats WHERE date ='".$date_jour."' ORDER BY date,ip DESC"); // SELECTION DES VISITES
	$req_visiteurs= mysql_query("SELECT DISTINCT ip,date FROM bloom_stats WHERE date ='".$date_jour."' ORDER BY date,ip DESC"); // SELECTION DES VISITEURS
	$nb_visites= mysql_num_rows($req_visites);
	$nb_visiteurs= mysql_num_rows($req_visiteurs);
case 'mois':
	$mois= '2007-10-__';
	$req_visites= mysql_query("SELECT ip,page,date FROM bloom_stats WHERE date LIKE '".$mois."' ORDER BY date,ip DESC"); // SELECTION DES VISITES
	$req_visiteurs= mysql_query("SELECT DISTINCT ip,date FROM bloom_stats WHERE date LIKE '".$mois."' ORDER BY date,ip DESC"); // SELECTION DES VISITEURS
	$nb_visites= mysql_num_rows($req_visites);
	$nb_visiteurs= mysql_num_rows($req_visiteurs);
}

ViPHP
ViPHP | 5924 Messages

27 oct. 2007, 01:44

Voir le comportement de switch, et cela a beau être illogique sur certains points, c'est le même dans tous les langages typés C.

Sinon, pour ton problème de date, n'as tu pas pensé à un champ date pour stocker ta date, histoire d'utiliser les fonctions de mysql sur les dates ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 oct. 2007, 09:39

Dans un switch case, il faut penser aux break après la fin du traitement d'un case ;)

De plus, tu remarqueras que dans tes 2 cas, tu peux mutualiser beaucoup de code et ne l'écrire qu'à un unique endroit :
// En fonction de quelque chose
switch(...)
{
  default: // Jour courant
    $where_date = date("Y-m-d"); // Utilisation de la date du jour
    break;
  case 'mois': // Mois courant
    $where_date= date('Y-m-%'); // Utilisation du mois courant
    break;
}

$str_requete_visites = "SELECT ip, page, date FROM bloom_stats WHERE date LIKE '". $where_date ."' ORDER BY date,ip DESC";
$str_requete_visiteurs = "SELECT DISTINCT ip, date FROM bloom_stats WHERE date LIKE '". $where_date ."' ORDER BY date, ip DESC"
$req_visites= mysql_query( $str_requete_visites ); // SELECTION DES VISITES
$req_visiteurs= mysql_query( $str_requete_visiteurs ); // SELECTION DES VISITEURS
$nb_visites= mysql_num_rows($req_visites);
$nb_visiteurs= mysql_num_rows($req_visiteurs);
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5924 Messages

27 oct. 2007, 10:06

zeus, le default, c'est à la fin, sinon il est exécuté quelquesoit la valeur passée…

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 oct. 2007, 10:12

pas sur :-k

edit : Il me semblait, essaye ça ;)
$value = 1;

switch ( $value )
{
        default:
                echo "Defaut";
                break;
        case 1:
                echo "Dans le case";
                break;
}
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5924 Messages

27 oct. 2007, 13:50

Ok, je viens de vérifier, ca se comporte pareil en C, ce qui me fait dire que je trouve cette structure de plus en plus illogique…

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

29 oct. 2007, 15:35

Il n'y a effectivement pas de position spécifique aux valeurs d'un switch.

L'intérêt est surtout du au fait que le "break" n'est pas obligatoire et qu'il peut s'avérer utile de l'omettre pour que plusieurs instructions du switch soient exécutées à la suite...

Par exemple ici, si la valeur est 1, seul le case 1 est exécutée, si la valeur est 2, seul le case 2 est exécutée, en revanche si la valeur est autre, le défault ET le case 1 seront exécutés dans cet ordre :
switch ($var) {
  default :
    // .... 
  case 1 : 
    // ...
    break;
  case 2 : 
    // ...
    break;
}
Ca évite d'avoir à recoller le code du case 1 dans le default. J'ai pas d'exemple concret à donner en tête mais je me suis déjà servi de cette propriété d'enchainement et avait donc joué sur l'ordre des cases :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 4039 Messages

29 oct. 2007, 23:41

moi j'ai un exemple: un script CLI que j'aime pouvoir prendre à un endroit précis (une lourde importation de DB). J'ai mis toute la suite des opérations dans un gros switch, sans insérer de break, avec des "case" divisant les opérations principales, ce qui me permet de sauter la ou je veux, sans m'embarasser de if's lourdingues.

C'est assez pratique. A noter que break peut prendre un paramètre, pour interrompre plusieurs boucles imbriquées.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.