Requête - PHP - Programmation
Marsh Posté le 30-04-2011 à 14:57:40
Hello
Pas super propre, mais ça peut te donner un ordre d'idée...
Place le code ci-dessous entre mysql_query("SET NAMES 'utf8'" ); et $result=mysql_query($query);
Code :
|
Si la requete ne retourne rien (mysql_num_rows) alors il initialise la variable $nombre a 54, et la place dans ta requete:
...AND ItemDescription LIKE '%$nombre%' AND...
Marsh Posté le 30-04-2011 à 15:08:33
Bonjour et merci pour la proposition,
la requête fonctionne, mais il me retourne maintenant la ligne ou ce trouve la valeur 54.
alors que la valeure 53 existe.
j'essaye d'afficher d'abors la plus petite valeur exemple le chiffre 53 et autrement 54 Etc...
actualinet a écrit : Hello
|
Marsh Posté le 30-04-2011 à 15:11:48
Oups... Petite erreur de ma part, ça marchera mieux ainsi:
Code :
|
Marsh Posté le 30-04-2011 à 15:19:35
spoque a écrit : Bonjour et merci pour la proposition, |
$query="SELECT DISTINCT itemID,ItemAddedTime,ItemTitle,ItemDescription,ItemContentEncoded,ItemLink,ItemSource FROM feedItems WHERE ItemDescription=3.0 AND ItemDescription LIKE '%53%' AND ItemSource LIKE '%fl%' AND ItemAddedTime between '$hier' AND '$today' limit 1";
==>
$query="SELECT DISTINCT itemID,ItemAddedTime,ItemTitle,ItemDescription,ItemContentEncoded,ItemLink,ItemSource FROM feedItems WHERE ItemDescription=3.0 AND ((ItemDescription LIKE '%53%') OR
((ItemDescription NOT LIKE '%53%') ) AND (ItemDescription LIKE '%54%'))) AND ItemSource LIKE '%fl%' AND ItemAddedTime between '$hier' AND '$today' limit 1";
après pour travailler plus finement il faudrait que tu nous disent ce qu'il y a dans ItemDescription.
Marsh Posté le 30-04-2011 à 15:24:31
Je rencontre encore un petit problème,
la requête ci-dessous fonctionne mais si j'ai la valeur 53 qui n'existe pas mais que la valeur 153 existe il me l'affiche alors qu'il y a 54 avant!
Je dois jouer avec les NOT LIKE?
ont dirait que ceci fonctionne merci pour la piste!!
$query="SELECT DISTINCT itemID,ItemAddedTime,ItemTitle,ItemDescription,ItemContentEncoded,ItemLink,ItemSource FROM feedItems WHERE ItemDescription=3.0 AND ((ItemDescription LIKE '%53%') OR
(ItemDescription LIKE '%54%') ) AND ItemSource LIKE '%fl%' AND ItemAddedTime between '$hier' AND '$today' limit 1";
Bonjour,
dans ItemDescription c'est une phrase qui provient d'un flux:
3.0 star hotel from USD 53 for 1 night(s), Stay 1 nights and save 10% off your stay!
autre enregistrement:
3.0 star hotel from USD 54 for 1 night(s), Stay 1 nights and save 10% off your stay!
philippe06 a écrit : |
Marsh Posté le 30-04-2011 à 15:57:07
Donc du coup si tu as "3.0 star hotel from USD 51 for 1 night(s), Stay 1 nights and save 10% off your stay!", tu rates la moins chère. Et tu peux pas utiliser un "ORDER BY" parce que si tu as une chambre à 9$, tu auras "3.0 star hotel from USD 9 for 1 night(s), Stay 1 nights and save 10% off your stay!" qui est haut dans l'ordre alphanumérique. En fait idéalement, il faudrait trier par rapport à un nombre à l'intérieur d'une chaine. A ma connaissance ca n'est pas possible en SQL.
Marsh Posté le 30-04-2011 à 16:02:45
ok je test ont dirait que ceci fonctionne cette fois.
bon ma requete va être très longue car le prix est entre 30 et 150 environ
$query="SELECT DISTINCT itemID,ItemAddedTime,ItemTitle,ItemDescription,ItemContentEncoded,ItemLink,ItemSource FROM feedItems WHERE ItemDescription=3.0 AND ((ItemDescription LIKE '%53%') OR
(ItemDescription LIKE '%54%') AND (ItemDescription NOT LIKE '%54%') OR (ItemDescription LIKE '%55%') OR (ItemDescription LIKE '%56%')) AND ItemSource LIKE '%fl%' AND ItemAddedTime between '$hier' AND '$today' limit 1";
philippe06 a écrit : Donc du coup si tu as "3.0 star hotel from USD 51 for 1 night(s), Stay 1 nights and save 10% off your stay!", tu rates la moins chère. Et tu peux pas utiliser un "ORDER BY" parce que si tu as une chambre à 9$, tu auras "3.0 star hotel from USD 9 for 1 night(s), Stay 1 nights and save 10% off your stay!" qui est haut dans l'ordre alphanumérique. En fait idéalement, il faudrait trier par rapport à un nombre à l'intérieur d'une chaine. A ma connaissance ca n'est pas possible en SQL. |
Marsh Posté le 30-04-2011 à 17:12:35
Bon effectivement c'est pas possible!!
j'essaye avec une nouvelle requête cette fois c'est pas mal mais...
comment récupérer la valeur la plus petite, et d'en faire ma condition?
Code :
|
spoque a écrit : ok je test ont dirait que ceci fonctionne cette fois. |
Marsh Posté le 30-04-2011 à 18:30:26
en rajoutant entre ligne 4 et 5:
$minimum=1000; $ligne_minimum=array();
puis entre ligne 14 et 15:
if (intval($usd) < $minimum)
{
$minimum=intval($usd);
$ligne_minimum=$array;
}
puis ligne 21:
dans minimum tu as soit la valeur minimum, soit 1000. Dans ligne minimum tu as un tableau vide ou la ligne qui correpond à la ligne la moins cher.
Marsh Posté le 30-04-2011 à 18:41:34
Merci philippe je vais tester ce soir
Salutation
philippe06 a écrit : en rajoutant entre ligne 4 et 5: |
Marsh Posté le 30-04-2011 à 20:49:01
Bonsoir Philippe,
Je n ai pas compris a partir de la ligne 21
Je fait une condition avec la variable $minimum?
philippe06 a écrit : en rajoutant entre ligne 4 et 5: |
Marsh Posté le 30-04-2011 à 23:43:44
oui si minimum est différent de 1000 ligne_minimum contient la ligne avec une chambre de prix minimum.
Marsh Posté le 01-05-2011 à 12:43:38
Bonjour Philippe,
donc
}
if ($minimum!=1000){
echo $ligne_minimum;
}
mais $ligne_minimum ne me retourne rien
philippe06 a écrit : oui si minimum est différent de 1000 ligne_minimum contient la ligne avec une chambre de prix minimum. |
Marsh Posté le 01-05-2011 à 12:56:12
ligne_minimum est un tableau associatif, pas une chaine de caractère, il faut faire un var_dump / var_export. Le mieux est de faire un copier coller du nouveau code complet ici.
Marsh Posté le 01-05-2011 à 13:20:18
Mon code au complet,
malheureusement, je n'ai jamais fait de tableau associatif
Code :
|
philippe06 a écrit : ligne_minimum est un tableau associatif, pas une chaine de caractère, il faut faire un var_dump / var_export. Le mieux est de faire un copier coller du nouveau code complet ici. |
Marsh Posté le 01-05-2011 à 17:22:01
Code :
|
Marsh Posté le 01-05-2011 à 19:44:54
j'ai essayé mais ma ligne retournée prix le plus bas est juste, seulement le nom de l'hôtel est le premier enregistrement de ma base.
et cette hôtel à tous un autre prix.
Code :
|
Merci Philippe oui sa marche, mais la boucle fini à la ligne 29
donc je n'ai plus le retour des mes variables comme $link = $array['ItemLink'];
philippe06 a écrit :
|
Marsh Posté le 01-05-2011 à 19:55:19
dans ce cas remplace $array['ItemLink'] par $ligne_minimum['ItemLink']
Marsh Posté le 01-05-2011 à 20:16:13
j'ai essayé mais ma ligne retournée prix le plus bas est juste, seulement le nom de l'hôtel est le premier enregistrement de ma base.
et cette hôtel à tous un autre prix
je ne comprend plus rien.
philippe06 a écrit : dans ce cas remplace $array['ItemLink'] par $ligne_minimum['ItemLink'] |
Marsh Posté le 01-05-2011 à 20:47:52
erreur d'edit
Marsh Posté le 01-05-2011 à 21:17:21
Milles merci Philippe ça fonctionne!!!
je suis très content merci pour ton aide!
philippe06 a écrit :
|
Marsh Posté le 03-05-2011 à 18:49:01
Bonjour philippe,
j'ai encore une question,
tous focntionne donc maintenant le script affiche bien le valeur la plus basse,
mais est il possible de faire en sorte qu'il m'affiche aussi en fonction de la date la plus courante.
j'ai une colonne "ItemAddedTime" en format datetime.
car mon script qui insert les flux dans ma base n'efface pas les données il en rajoute uniquement.
donc je peut me retrouver avec un prix comme exemple une chambre à 50.- Euro alors que le dernier update est de 54.-Euro.
j'a essayé de faire une condition avec quelque chose comme ceci:
if ((intval($usd) < $minimum) and date<=$today)
philippe06 a écrit :
|
Marsh Posté le 03-05-2011 à 19:31:41
spoque a écrit : Bonjour philippe, j'ai encore une question, tous focntionne donc maintenant le script affiche bien le valeur la plus basse, mais est il possible de faire en sorte qu'il m'affiche aussi en fonction de la date la plus courante. j'ai une colonne "ItemAddedTime" en format datetime. donc je peut me retrouver avec un prix comme exemple une chambre à 50.- Euro alors que le dernier update est de 54.-Euro. j'a essayé de faire une condition avec quelque chose comme ceci: if ((intval($usd) < $minimum) and date<=$today) |
Bonjour spoque, pour résoudre ton problème il ne faut tenir compte que des dernières lignes. C'est un peu comme si tu avais une table avec le salaire de chaque employé chaque mois, et que tu souhaitais connaitre le montant du dernier salaire touché par chaque employé ayant travailler pour la société.
Code :
|
EDIT: il y a moyen de filtrer les lignes "inutiles" (=plus à jour) au niveau de la requête en faisant quelque chose du style:
select * from (SELECT itemID,ItemAddedTime,max(ItemAddedTime) as dernieremaj, ItemTitle,ItemDescription,ItemLink,ItemSource FROM feedItems WHERE ItemDescription=3.0 AND ItemSource LIKE '%fl%' AND ItemAddedTime between '$hier' AND '$today' GROUP by itemID) as t1 where t1.ItemAddedTime=t1.dernieremaj mais faut voir si c'est supporté par ton SGBD.
Marsh Posté le 03-05-2011 à 20:38:30
Bonsoir philippe,
merci pour la réponse, je viens de tester avec les deux solutions mais il m'affiche toujours le prix le plus bas s'en prendre en compte la dernière mise à jour.
j'ai enlevé mes variables $today et $hier parceque du coup elle ne sert à rien.
Code :
|
philippe06 a écrit :
|
Marsh Posté le 03-05-2011 à 21:12:08
j'ai ptet pas compris ce que tu voulais faire alors. Comment tu fais pour distinguer les produits différents? Avec itemID?
Si une chambre coutaient 50$ la semaine dernière (dernière MAJ) et qu'une autre coute a été maj aujourd'hui et coute 54$, il faut bien afficher celle à 50$?
Marsh Posté le 03-05-2011 à 21:27:38
non j'aimerais afficher la chambre à 54$ car du coup le premier enregistrement qui étais à 50$ est obsolète il s'agit de la meme chambre.
je dois jouer je pense sur la colonne ItemAddedTime qui fourni un datetime
philippe06 a écrit : j'ai ptet pas compris ce que tu voulais faire alors. Comment tu fais pour distinguer les produits différents? Avec itemID? |
Marsh Posté le 03-05-2011 à 21:34:21
dans ce cas il faut juste supprimer le 'GROUP by itemID' et normalement ca devrait afficher la chambre la moins cher parmis les dernières mis à jour.
Marsh Posté le 03-05-2011 à 21:58:00
Malheureusement non
voici ma table,
c'est pas une requete ou je dois lister les dates d'insertion ?
Code :
|
philippe06 a écrit : dans ce cas il faut juste supprimer le 'GROUP by itemID' et normalement ca devrait afficher la chambre la moins cher parmis les dernières mis à jour. |
Marsh Posté le 03-05-2011 à 22:30:43
spoque a écrit : Malheureusement non
|
Comme tu utilises des DateTime au lieu des dates, il faut utiliser un date format pour ne pas tenir compte des heures.
la requête devrait ressembler à ça:
select * from
(SELECT itemID,format(ItemAddedTime,'%Y-%m-%d') as datej,MAX(format(ItemAddedTime,'%Y-%m-%d')) as dernieremaj, ItemTitle,ItemDescription,ItemLink,ItemSource FROM feedItems WHERE ItemDescription=3.0 AND ItemSource LIKE '%fl%') as t1
where t1.datej=t1.dernieremaj
Marsh Posté le 03-05-2011 à 22:54:23
elle ne me retourne plus rien,
je cherche de mon côté en ce môment pour voir si j'arrive à effacer les doublons avec les dates les plus vieilles.
que j'insert apres mon update dans ma base.
philippe06 a écrit : |
Marsh Posté le 30-04-2011 à 14:32:29
Bonjour,
j'essaye de récupérer par ma requête la ligne ou le nombre 53 existe dans la phrase, par un LIKE ''%53%'
ce qui donne:
[cpp]
$today = date('Y-m-d');
$hier = date('Y/m/d', strtotime('-7 day'));
$query="SELECT DISTINCT itemID,ItemAddedTime,ItemTitle,ItemDescription,ItemContentEncoded,ItemLink,ItemSource FROM feedItems WHERE ItemDescription=3.0 AND ItemDescription LIKE '%53%' AND ItemSource LIKE '%fl%' AND ItemAddedTime between '$hier' AND '$today' limit 1";
mysql_query("SET NAMES 'utf8'" );
$result=mysql_query($query);
while ($array = mysql_fetch_array($result))
{
$title = $array['ItemTitle'];
$prix = $array['ItemDescription'];
$title = htmlspecialchars_decode($title);
$description = $array['ItemDescription'];
$description = htmlspecialchars_decode($description);
$link = $array['ItemLink'];
$usd=$array['ItemDescription'];
$city= $array['ItemSource'];
echo"...";
}
ceci marche très bien, ou je coince c'est que si le nomre 53 existe pas, j'aimerais qu'il me liste le nombre 54.
J'ai essayé par concatener une requête avec une condition sans succès,
quel chemin je dois prendre?
Merci pour votre aide