Se connecter / S'enregistrer
Votre question

[Résolu] Requete sql

Tags :
  • Sql
  • Programmation
Dernière réponse : dans Programmation
16 Avril 2009 17:37:40

Bonsoir,
Voici mon prototype de site (car en construction)à cette adresse.

Si on regarde dans le menu, mes films, et on peut choisir la lettre et on affiche la film commençant par la lettre choisit.
ça fonctionne.

Mais le truc c'est que dans ma base j'ai 28 tables qui répertorie ces différents film :
- table_0_9
- table_a...

Donc j'ai 28 actions qui permettent d'effectuer cela vu que je code en MVC.
J'aimerai savoir s'il n'existe pas une requête sql qui permettrait de faire ça en une action, c'est à dire que je stocke tous mes films dans une seule table table_films et que je fasse une requête qui affiche les films commençant par la lettre choisit...

Merci de votre aide !

Autres pages sur : resolu requete sql

16 Avril 2009 18:43:21

select * from table where nom_film like 'a%'

pour les films commencant par a

'b%' pour les films en b
....
16 Avril 2009 19:36:08

Oui, merci.
Mais le truc c'est que j'aimerais regrouper sur une action toutes ces requêtes.
C'est à dire que si je clique sur la lettre a ou b ou c ou... ça fait appel à la même action qui ferai un truc du genre :
  1. SELECT * FROM tab_films WHERE xxx


où xxx serait : les films commençant par la lettre qui correspond au lien que j'ai cliqué

Voila...
merci de ton aide !
Contenus similaires
16 Avril 2009 20:36:47

je sais pas exactement comment est ton code mais tu peux passer en parametre dans un form et kan tu clic tu traite ton info ou alors faire du javascript en mettant un onClick() sur tout tes liens
enfin la 2e idée je sais pas si c'est possible
met un bout de code pour voir deja
16 Avril 2009 20:57:48

c bien, essaie encore !
17 Avril 2009 13:58:17

pourquoi faire table_0_9, table_a, table_b, quel est ton intérêt à part faire un shéma de base de donnée beaucoup plus compliqué que nécessaire.

Comme le disait totof le plus simple est d'avoir une seul table et d'utiliser un Like. Seul hic Like est assez lourd et à éviter sur de gros site. En tout cas ca marche et c'est simple, beaucoup plus que de faire 28 tables !

La solution des 28 tables est en fait un solution de partitionnement vertical. Utilisé lorsque tu as de très grosse table, tellement que ton serveur n'est pas assez puissant pour exécuter en un temps correct ta requête.

Il y a une solution intermédiaire au niveau de l'optimisation, qui est en fait de créer un colonne premierCaractere (de type CHAR(1)). Lorsque tu ajoutes dans ta base, tu n'as qu'à y stocker le premier caractère. Au final tu as une requête qui ressemble à :
  1. SELECT monchamp1, monchamp2 FROM matable WHERE premierCaractere='a'


A mon avis vu ton site, la solution du Like est très très certainement la meilleur.
17 Avril 2009 17:33:00

Mon intérêt était que vu que je met en haut de mon site les lettres de l'alphabet, a chaque lettre était associé une action. Si je cliquais sur la lettre 'a' je faisais une requête dans la table 'tab_a'. et j'avais donc 28 actions aussi ce qui est lourd je le conçois c'est pour ça que je désire changer.
Mais maintenant ce que je veux c'est que lorsque je clique sur n'importe quelle lettre ça me fasse une seule action qui choisit dans 'tab_mes_films' les films qui correspondent aux films commençant par la lettre sur laquelle j'ai cliqué.

J'ai peut-être une solution, enfin je n'en sais rien...
Ce serait au niveau de mes lien, avoir un marqueur qui identifierai ma lettre. Car mon code est structuré comme ça :

  1. <a href="index.php?action=action_mes_films_0_9">0..9</a>
  2. <a href="index.php?action=action_mes_films_a">A </a>
  3. <a href="index.php?action=action_mes_films_b">B </a>
  4. <a href="index.php?action=action_mes_films_c">C </a>
  5. <a href="index.php?action=action_mes_films_d">D </a>
  6. <a href="index.php?action=action_mes_films_e">E </a>


J'aimerai avoir ça :

  1. <a href="index.php?action=action_mes_films">0..9</a>
  2. <a href="index.php?action=action_mes_films">A </a>
  3. <a href="index.php?action=action_mes_films">B </a>
  4. <a href="index.php?action=action_mes_films">C </a>
  5. <a href="index.php?action=action_mes_films">D </a>
  6. <a href="index.php?action=action_mes_films">E </a>


Mais avec une sorte de marqueur qui dirai si c'est la lettre A ou B ou C que j'ai cliqué. Ensuite ma requête serait de ce genre :

  1. "SELECT champ1, champ2 FROM matab WHERE titre like ".$marqueur."%";


Ou un truc dans le genre. Voila...
Merci de votre aide !
17 Avril 2009 21:16:36

Peut être en essayant ça :
  1. <a href="index.php?action=action_mes_films&lettre=0">0..9</a>
  2. <a href="index.php?action=action_mes_films&lettre=A">A </a>
  3. <a href="index.php?action=action_mes_films&lettre=B">B </a>
  4. <a href="index.php?action=action_mes_films&lettre=C">C </a>
  5. <a href="index.php?action=action_mes_films&lettre=D">D </a>
  6. <a href="index.php?action=action_mes_films&lettre=E">E </a>


Ta lettre sera dans la variable $_GET['lettre'] ...

:bounce: 
18 Avril 2009 20:16:46

Alors ça commence à se décanter comm eil faut...
Voici un bout de mon code :
  1. <a href="index.php?action=action_mes_films&lettre=0">0..9</a>
  2. <a href="index.php?action=action_mes_films&lettre=a">A </a>
  3. <a href="index.php?action=action_mes_films&lettre=b">B </a>
  4. <a href="index.php?action=action_mes_films&lettre=c">C </a>
  5.  
  6. $lettre=$_GET['lettre'];
  7.  
  8.  
  9. /*script de connexion à la base...*/
  10.  
  11. $sql = "SELECT * FROM `films-present` ORDER BY `titre` WHERE `lettre`=".$lettre."";
  12. $requete = mysql_query($sql);
  13. $nbResultats = mysql_num_rows($requete);//compte le nombre de lignes
  14.  
  15. //test de l'execution de la requete
  16. if ($nbResultats == 0) echo "Il n'y a pas encore de films danc cette liste.<br/>";
  17. else
  18. while ($requetearray=mysql_fetch_array($requete)){
  19.  
  20. echo $requetearray['titre'];
  21.  
  22. }



Alors la première fois que je clique sur le menu 'Les films', ça m'affiche aucun film alors que j'ai un film dans ma base. Ensuite lorsque que je clique sur une lettre ça m'affiche :
  1. Warning: deleguertraitementrequete() [function.include]: Failed opening '' for inclusion (include_path='.:/usr/lib/php') in /homepages/6/d279767929/htdocs/classeControleur.php on line 84


Voila si quelqu'un peut m'aider.
Merci de votre aide !
20 Avril 2009 18:12:16

Alors j'ai trouvé la seconde erreur, c'était parce que dans mon fichier de config, je ne permettait pas de réaliser l'action. Donc ça c'est bon.

Mais la première erreur persiste.
Voici le code :
  1. $sql = "SELECT titre FROM `films-present` WHERE UPPER titre LIKE UPPER('$_GET[lettre]')";
  2. $requete = mysql_query($sql);
  3. $nbResultats = mysql_num_rows($requete)or die(mysql_error());


Et cela m'affiche l'erreur suivante :

  1. Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /homepages/6/d279767929/htdocs/vuesElementaires/vueElementaire_zone_mes_films.php on line 48
  2. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'titre LIKE UPPER('0')' at line 1


Voila tout, si quelqu'un peut m'aider à résoudre ce problème...
Merci de votre aide !
20 Avril 2009 18:23:54

  1. $sql = "SELECT titre FROM `films-present` WHERE UPPER titre LIKE '%$lettre')";


par contre attention, ne surtout JAMAIS faire $lettre = $_GET['lettre']; JAMAIS ! autant ne pas mettre son site en ligne ...

Pour plus d'information, sinon on invitera les jeunes hackers du forum :)  ... ou pas.
20 Avril 2009 18:30:20

Ça ne marche toujours pas cette requête, ça m'affiche toujours la même erreur...
OK merci pour l'alerte !
Merci de ton aide !
20 Avril 2009 18:35:00

merde, le con j'ai laissé UPPER, il faut virer :) 

Pas besoin de gérer la casse (majuscule, minuscule), je pense, à priori que ton champs est encodé en latin1 swedish.
20 Avril 2009 18:43:52

Ah ça avance !
Par contre j'ai testé le mysql_real_escape_string(), mais ça me met deux erreurs :
  1. Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /homepages/6/d279767929/htdocs/vuesElementaires/vueElementaire_zone_mes_films.php on line 32
  2.  
  3. Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /homepages/6/d279767929/htdocs/vuesElementaires/vueElementaire_zone_mes_films.php on line 32



Ensuite, ça m'affiche tout les films de toutes les lettres alors que ça devrait m'afficher que les films commençant par la lettre sur laquelle je clique...
Merci de ton aide !
20 Avril 2009 19:52:32

Il faut que tu te connectes avant à ta base de donnée.

Dans ton cas, comme tu ne veux qu'une lettre tu peux faire un simple strlen($_GET['lettre']) et si le résultat n'est pas 1 alors il y a un problème :)  et donc tu stops l'exécution et tu affiches un message d'erreur. Enfin au moins tu stops.
20 Avril 2009 20:13:36

Je me connecte bien à ma base de données. Voici le code :
  1. <div style="{font-size:1.5em;text-align:center;}">
  2. <a href="index.php?action=action_mes_films&lettre=0">0..9</a>
  3. <a href="index.php?action=action_mes_films&lettre=a">A </a>
  4. <a href="index.php?action=action_mes_films&lettre=b">B </a>
  5. <a href="index.php?action=action_mes_films&lettre=c">C </a>
  6. ...
  7. </div>
  8.  
  9. <?php
  10. $lettre = strlen($_GET['lettre']);
  11. if ($lettre != 1 ){
  12. echo "Erreur";
  13. }
  14. else {
  15. $connexionMYSQL = mysql_connect("*****","****","****");
  16. if (! $connexionMYSQL)//Connexion au serveur manqué
  17. echo "Echec de la connexion au serveur MYSQL.<br/>";
  18. else//Connexion au serveur réussie
  19. {
  20. //echo "Connexion au serveur MYSQL établie.<br/>";
  21. $activationBD = mysql_select_db("*****", $connexionMYSQL);
  22. if (! $activationBD)//Activation de la base de données raté
  23. echo "Connexion au serveur MYSQL réussie mais impossible d'accéder à la base de données.<br/>";
  24. else//activation réussie
  25. {
  26. //echo "Connexion au serveur MYSQL ok. Activation de la base de données de liste_gadget réussite.<br/>";
  27. $sql = "SELECT titre FROM `films-present` WHERE UPPER titre LIKE '%$lettre'";
  28. $requete = mysql_query($sql);
  29. $nbResultats = mysql_num_rows($requete)or die(mysql_error());//compte le nombre de lignes
  30.  
  31. //test de l'execution de la requete
  32. if ($nbResultats == 0) echo "Il n'y a pas encore de films danc cette liste.<br/>";
  33. else
  34. while ($requetearray=mysql_fetch_array($requete)){
  35. ?>
  36. <form method="post" name="form<? echo $requetearray['id-films']; ?>" action="index.php?action=action_afficher_film_0_9&id=<?php echo $requetearray['id-films']; ?>">
  37. <TABLE width='100%'>
  38. <?php
  39. echo "<tr width=\"50%\">";
  40. echo "<td width=\"50%\">".$requetearray['titre']."</td>";
  41. echo "<td><input type=\"submit\" value=\"Voir sa fiche\"/></td>";
  42. echo "</tr>";
  43. ?>
  44. </form>
  45. </table>
  46. <?php
  47. }
  48. }
  49. }
  50. }
  51. ?>


Cela m'affiche que le film Las vegas 21 dans le a, b ou c ou 0 au lieu d'avoir 28 semaines plus tard ou captivity par exemple...

Merci de ton aide, on y est presque là je crois !
20 Avril 2009 20:23:23

Ah bah non ... $lettre est là non plus la première lettre mais le nombre de lettre envoyé dans la variable.

  1. if(strlen($lettre) != 1) {
  2. trigger_error("Parametre incorrect",E_USER_ERROR);
  3. }


Donc là tu as une fatal error et pas besoin de bloc else et donc de décaler à droite tout ton code, pratique non ?

trigger_error() est une fonction assez sympa pour gérer les erreurs au lieu de faire de simple echo.

Pourquoi ?
car tu peux les afficher ou pas. si en haut de ton code tu mets error_reporting(0) alors tu n'auras aucun message d'erreur qui s'affiche, très bien lorsque tu es sur le site public, les visiteurs n'ont pas à voir les messages. Si tu mets error_reporting(E_ALL) alors là tu as tous les messages.

(par défaut error_reporting est à E_ALL ^ E_NOTICE et donc n'affiche pas tous les messages d'erreur)


PS : Toutes les infos que je donnes sont parfois du bonus hein ;)  Mais la sécurité, c'est pas simplement du bonus, c'est important.
20 Avril 2009 21:31:00

Voici mon code maintenant :

  1. <?php error_reporting(E_ALL); ?>
  2. <div style="{font-size:1.5em;text-align:center;}">
  3. <a href="index.php?action=action_mes_films&lettre=0">0..9</a>
  4. <a href="index.php?action=action_mes_films&lettre=a">A </a>
  5. <a href="index.php?action=action_mes_films&lettre=b">B </a>
  6. <a href="index.php?action=action_mes_films&lettre=c">C </a>
  7.  
  8. </div>
  9.  
  10. <?php
  11. $lettre = strlen($_GET['lettre']);
  12. if(strlen($lettre) != 1) {
  13. trigger_error("Parametre incorrect",E_USER_ERROR);
  14. }
  15. $connexionMYSQL = mysql_connect("****","*****","*****");
  16. if (! $connexionMYSQL)//Connexion au serveur manqué
  17. echo "Echec de la connexion au serveur MYSQL.<br/>";
  18. else//Connexion au serveur réussie
  19. {
  20. //echo "Connexion au serveur MYSQL établie.<br/>";
  21. $activationBD = mysql_select_db("*****", $connexionMYSQL);
  22. if (! $activationBD)//Activation de la base de données raté
  23. echo "Connexion au serveur MYSQL réussie mais impossible d'accéder à la base de données.<br/>";
  24. else//activation réussie
  25. {
  26. //echo "Connexion au serveur MYSQL ok. Activation de la base de données de liste_gadget réussite.<br/>";
  27. $sql = "SELECT titre FROM `films-present` WHERE lettre LIKE '$lettre%'";
  28. $requete = mysql_query($sql);
  29. $nbResultats = mysql_num_rows($requete)or die(mysql_error());//compte le nombre de lignes
  30.  
  31. //test de l'execution de la requete
  32. if ($nbResultats == 0) echo "Il n'y a pas encore de films danc cette liste.<br/>";
  33. else
  34. while ($requetearray=mysql_fetch_array($requete)){
  35. ?>
  36. <form method="post" name="form<? echo $requetearray['id-films']; ?>" action="index.php?action=action_afficher_film_0_9&id=<?php echo $requetearray['id-films']; ?>">
  37. <TABLE width='100%'>
  38. <?php
  39. echo "<tr width=\"50%\">";
  40. echo "<td width=\"50%\">".$requetearray['titre']."</td>";
  41. echo "<td><input type=\"submit\" value=\"Voir sa fiche\"/></td>";
  42. echo "</tr>";
  43. ?>
  44. </form>
  45. </table>
  46. <?php
  47. }
  48. }
  49. }
  50. ?>
  51.  
  52. <div id="copyright">
  53. Copyright "CRI-MOVIES" 2009, tous droits réservés<br /> <SCRIPT LANGUAGE="JavaScript">
  54. document.write(messageDate);
  55. </SCRIPT>
  56. <noscript><a href="<a href="http://www.editeurjavascript.com/" rel="nofollow" target="_blank">http://www.editeurjavascript.com/</a>">ajax</a></noscript>
  57.  
  58. <div id="ejs_heure">Initialisation</div><noscript><a href="<a href="http://www.editeurjavascript.com/" rel="nofollow" target="_blank">http://www.editeurjavascript.com/</a>">ajax</a></noscript>
  59. </div>


Cela ne m'affiche rien et aucune erreur...
Pas de souci pour la sécurité j'essaie d'en prendre compte !
Merci de ton aide !
21 Avril 2009 19:18:06

Alors, voici où j'en suis. Mon code marche mais il n'est pas sécurisé, enfin ma requête fonctionne. Par contre le mysql_nums_rows ne fonctionne pas, c'est à dire que ça ne m'affiche rien s'il n'y a pas de films alors que ça devrait. J'ai enlevé le test strlen qui me retournait un chiffre alors que je voulais la variable.
Voici mon code et je suis près à le modifier pour la sécurité.

  1. <?php error_reporting(E_ALL); ?>
  2. <div style="{font-size:1.5em;text-align:center;}">
  3. <a href="index.php?action=action_mes_films&lettre=0">0..9</a>
  4. <a href="index.php?action=action_mes_films&lettre=a">A </a>
  5. <a href="index.php?action=action_mes_films&lettre=b">B </a>
  6. <a href="index.php?action=action_mes_films&lettre=c">C </a>
  7. // ....
  8. </div>
  9.  
  10. <?php
  11. $lettre = $_GET['lettre'];
  12. $lettre1 = strlen($_GET['lettre']);
  13. if(strlen($lettre) != 1) {
  14. trigger_error("Parametre incorrect",E_USER_ERROR);
  15. }
  16. echo $lettre;
  17. $connexionMYSQL = mysql_connect("***********","**********","*********");
  18. if (! $connexionMYSQL)//Connexion au serveur manqué
  19. echo "Echec de la connexion au serveur MYSQL.<br/>";
  20. else//Connexion au serveur réussie
  21. {
  22. //echo "Connexion au serveur MYSQL établie.<br/>";
  23. $activationBD = mysql_select_db("db279968696", $connexionMYSQL);
  24. if (! $activationBD)//Activation de la base de données raté
  25. echo "Connexion au serveur MYSQL réussie mais impossible d'accéder à la base de données.<br/>";
  26. else//activation réussie
  27. {
  28. //echo "Connexion au serveur MYSQL ok. Activation de la base de données de liste_gadget réussite.<br/>";
  29. $sql = "SELECT titre FROM `films-present` WHERE lettre LIKE '$lettre%'";
  30. $requete = mysql_query($sql);
  31. $nbResultats = mysql_num_rows($requete)or die(mysql_error());//compte le nombre de lignes
  32.  
  33. //test de l'execution de la requete
  34. if ($nbResultats == 0) echo "Il n'y a pas encore de films danc cette liste.<br/>";
  35. else
  36. while ($requetearray = mysql_fetch_array($requete)){
  37. ?>
  38. <form method="post" name="form<? echo $requetearray['id-films']; ?>" action="index.php?action=action_afficher_film_0_9&id=<?php echo $requetearray['id-films']; ?>">
  39. <TABLE width='100%'>
  40. <?php
  41. echo "<tr width=\"50%\">";
  42. echo "<td width=\"50%\">".$requetearray['titre']."</td>";
  43. echo "<td><input type=\"submit\" value=\"Voir sa fiche\"/></td>";
  44. echo "</tr>";
  45. ?>
  46. </form>
  47. </table>
  48. <?php
  49. }
  50. }
  51. }
  52. ?>
21 Avril 2009 20:56:16

Attention à ne pas copier/coller tes login/password ici ;) 

Niveau sécurité tu es bon. Normal que strlen renvoyais un chiffre, il renvoi la longueur de la chaine de caractère ;) 

le or die(mysql_error()) est à mettre à la ligne au dessus. Tu n'auras jamais de problème là.

Ton code fonctionne et ne fait pas une PARSE ERROR ? à priori il manque une accolade ouvrante au après le else ligne 35.

Sinon à priori ça semble bon.
21 Avril 2009 21:24:11

Ah oui pardon !
C'est bon ça fonctionne bien !
Je reviendrai si jamais j'ai des problèmes !
Je vais faire un truc dans le même style pour afficher les caractéristiques du film choisit et je remettrai mon code pour la sécurité pour voir si ça va bien !
Merci de votre aide !
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS