Page 1 sur 2
probleme pour comparer une date avec une date sql
Posté : 18 janv. 2007, 13:10
par abricot
Salut tout le monde,
Je sais que dans une table sql la date se présente sous cette forme : année-mois-jour. On peu modifier le format mais j'ai lu que c'etais déconseillé.
donc je fais comme ceci :
mysql_connect("localhost","root","") or die ("impossible nananaa..");
mysql_select_db("x_db") or die ("bblablabal");
$date = isset($_POST['date']) ? $_POST['date'] : '';
$query = mysql_query("SELECT date FROM x WHERE date = '$date'");
$array = mysql_fetch_array($query);
// admettons que dans ma bdd j'ai une date : 2006-20-10 et que je tape dans mon formulaire 20/10/2006
$date = $_POST['date'];
list($jour,$mois,$annee) = explode('/', $date);
$date = date($annee-$mois-$jour);
// maintenant la date se presente sous la forme annee-mois-jour
if ($date != $array['date']){
echo 'ok';
}
else{
echo 'pas bon';
die();
}
le probleme c'est que $array['date'] ne me renvois rien, je capte pas, j'ai besoin de vos lanternes j'y vois rien :/
Posté : 18 janv. 2007, 14:12
par Maitrepylos
Bonjour, et si tu fais
$date = $_POST['date'];
list($jour,$mois,$annee) = explode('/', $date);
$date = date($annee-$mois-$jour);
avant le mysql_fecth_array.
Parce-que dans l'ordre que tu donnes le where est vide ou a la forme JJ/MM/DDDD
Posté : 18 janv. 2007, 14:16
par Ajoloca
Bonjour,
Tu as plusieurs erreurs,
La première c'est d'utiliser un mot réservé MySQL (date) comme nom de champ.
Tu devrais changer ce nom. Cette date elle correspond à QQ chose (date_debut, date_inscription, .....)
Une autre c'est l'utilisation de la fonction date() de PHP.
Pour ce que cherches à faire, elle prend deux paramètres, le format et les valeurs, tu n'en mets que un.
Posté : 18 janv. 2007, 14:24
par abricot
maitrepylos : bonjour, j'ai essayé mais ca ne change rien :/
ajoloca : bonjour, j'ai bien compris ma première erreur j'ignorais vraiment que je ne devais pas nomer mon champ date dans mysql, je mettrais date1 ou date_avant un truc comme ca. Par contre, j'ai pas compris ta deuxieme remarque

Posté : 18 janv. 2007, 14:35
par Maitrepylos
Tu utilises une fonction php qui est date()
$date = date($annee-$mois-$jour);
//exemple
$date = date('Y-m-d');
echo $date;
//donneras '2007-01-18'
je pense que toi tu veux faire ceci
$date = $annee-$mois-$jour;
Posté : 18 janv. 2007, 14:36
par Ajoloca
Re,
Si tu regardes dans la documentation PHP pour la fonction date() (click dessus)
Tu vois que ça s'écrit sous la forme date('chaine_format', valeur_format_time)
Donc tu dois convertir tes $jour, $mois, $annee en timestamp avant de pouvoir l'utiliser.
Tu as une autres solution, directement en SQL en utilisant la fonction STR_TO_DATE(), et là plus besoin de transformation.
Lis attentivement
ce tuto de la FAQ ça devrait t'aider.
Posté : 18 janv. 2007, 14:39
par abricot
desolé si je parrais chiant mais je voudrais comprendre pourquoi ? sur beaucoup de site j'ai vu des $date = date("20-10-2006"); alors pourquoi pas $date = date("$jour-$mois-$annee");
Je capte pas trop :/
cela dis je vais essayer comme tu me l'a montré
Posté : 18 janv. 2007, 14:41
par Ajoloca
je pense que toi tu veux faire ceci
$date = $annee-$mois-$jour;
@Maitrepylos
Que penses tu que contiendrait $date après l'exécution ?
On va supposer que les valeurs sont les suivantes
$annee = 2007;
$mois = 01;
$jour = 18;
Si maintenant je remplace les variables par leur valeur, j'obtiens:
$date = 2007 - 01 - 18;
ce qui me donne :
$date = 1988;
Je ne suis pas sur que ce soit la valeur attendue.
Posté : 18 janv. 2007, 14:54
par Maitrepylos
Désolé, je voulais dire ceci
$date = $annee.'-'.$mois.'-'.$jour;
Il essaye de comparer une date dans une db, il doit donc mettre dans son WHERE une variable ayant une structure pouvant être comparé! non?
Posté : 18 janv. 2007, 15:27
par Ajoloca
Re,
Voici QQ chose qui devrait s'approcher de ce que tu cherches.
Ne te contente pas de copier/coller, essaie de comprendre ce qui se passe et n'hésite à poser des questions.
<?php
mysql_connect("localhost","root","") or die ("impossible nananaa..");
mysql_select_db("x_db") or die ("bblablabal");
$date = isset($_POST['date']) ? $_POST['date'] : '';
// Arrêt si la date n'est pas renseignée
if(empty($date)) {
die('La date ne peut être vide');
}
// Construction de la requête
$query = "SELECT DATE_FORMAT(`date`, '%d/%m/%Y') as sql_date FROM x WHERE `date` = STR_TO_DATE('" . $date . "', '%d/%m/%Y')";
// Exécution de la requête, si erreur, arrêt avec affichage de la requête et de l'erreur MySQL
if (false === ($ressource = mysql_query($query))) {
die('ERR_SQL :<br />' . $query . '<br />' . mysql_error());
}
// Récupération du résultat MySQL
$resultat_sql = mysql_fetch_array($ressource);
// Arrêt si pas de rangs correspondant à cette date trouvés
if (!mysql_num_rows($resultat_sql)) {
die('Pas de valeurs trouvées pour la date "' . $date .'"<br />');
}
// Affichage de la date (juste pour voir quelle est bien au format français)
echo 'Date issue de MySQL : ' . $resultat_sql['sql_date'] . '<br />';
?>
Posté : 18 janv. 2007, 16:00
par abricot
Désolé, je voulais dire ceci
$date = $annee.'-'.$mois.'-'.$jour;
Il essaye de comparer une date dans une db, il doit donc mettre dans son WHERE une variable ayant une structure pouvant être comparé! non?
Y'a plus simple $date = "$annee-$mois-$jour";

Posté : 18 janv. 2007, 16:09
par abricot
Re Ajoloca,
Je ne comprend pas cette fonction : STR_TO_DATE
Je ne comprend pas la boucle if (false ===....
en fait je comprend pas bien la suite non plus
Posté : 18 janv. 2007, 16:28
par Ajoloca
Re,
La fonction MySQL "STR_TO_DATE(string_date, 'format_string') " (String to date), transforme une chaine de caractères au format date de MySQL.
Exemple :
Tu as une date au format français jj/mm/aaaa = 18/01/2007 et tu voudrais la convertir au format MySQL aaaa-mm-jj.
Le premier paramètre c'est ta valeur (18/01/2007) le second c'est le format du premier paramètre.
Ça te donnerait donc STR_TO_DATE('18/01/2007', '%d/%m/%Y').
En gros, tu lui dis : convertis-moi en date au format MySQL la chaine (premier paramètre) qui est formatée de la façon suivante (second paramètre).
Pour le ===
Quand tu compares en PHP, tu as (on peut dire) plusieurs niveaux de comparaison
== compare la valeur. Exp (zéro, valeur entière)0 == '0' (zéro, chaine de caractères) cette comparaison va te retourner "vrai"
Si tu fais la comparaison avec === ça te retournera "faux" car là tu testes,
en plus de la valeur, le type et un entier est différent d'une chaine même s'ils contiennent la même valeur.
Donc dans if(false === ....) je demande si la valeur de retour de mysql_query() est du type booléen et vaut 0 (false)
Posté : 19 janv. 2007, 11:04
par abricot
re, desolé pour le retard et merci pour ta reponse!
J'ai bien compris la fonction mysql str_to_date, c'est moins compliqué que de decortiquer une date!
par contre je capte pas trop cette histoire avec ===. Dans php il y a = et == et ===, donc = et == compare des valeur par exemple if($chien = "labrador") ou if($chien == "labrador") mais le === si il sert a tester une valeur je capte pas trop son utilitée vue que la comparaison c'est comme un test non?
Posté : 19 janv. 2007, 11:08
par Ultim4T0m
Bonjour,
Déjà, "=" ne compare pas de valeur, ce n'est pas un opérateur de comparaison, mais pour faire une affectation.
Le "===" n'est rien d'autre qu'un "==" testant en plus le type des données.
Comme l'a montré Ajoloca :
echo (0=='0') ? "0=='0'" : "0!='0'";
echo (0==='0') ? "0==='0'" : "0!=='0'";
Ce test affichera :