[Résolu] Requete sql
Forum Programmation : [Résolu] Requete sql
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 !
Message édité par blasil64 le 21-04-2009 à 21:25:47
select * from table where nom_film like 'a%'
pour les films commencant par a
'b%' pour les films en b
....
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 :
Code :
|
où xxx serait : les films commençant par la lettre qui correspond au lien que j'ai cliqué
Voila...
merci de ton aide !
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
c bien, essaie encore !
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 à :
Code :
|
A mon avis vu ton site, la solution du Like est très très certainement la meilleur.
Répondre à SiM07
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 :
Code :
|
J'aimerai avoir ça :
Code :
|
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 :
Code :
|
Ou un truc dans le genre. Voila...
Merci de votre aide !
Message édité par blasil64 le 17-04-2009 à 17:42:59
Peut être en essayant ça :
Code :
|
Ta lettre sera dans la variable $_GET['lettre'] ...
Répondre à DrSnake
Alors ça commence à se décanter comm eil faut...
Voici un bout de mon code :
Code :
|
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 :
Code :
|
Voila si quelqu'un peut m'aider.
Merci de votre aide !
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 :
Code :
|
Et cela m'affiche l'erreur suivante :
Code :
|
Voila tout, si quelqu'un peut m'aider à résoudre ce problème...
Merci de votre aide !
Code :
|
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.
Répondre à SiM07
Ç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 !
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.
Message édité par SiM07 le 20-04-2009 à 18:36:20
Répondre à SiM07
Ah ça avance !
Par contre j'ai testé le mysql_real_escape_string(), mais ça me met deux erreurs :
Code :
|
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 !
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.
Répondre à SiM07
Je me connecte bien à ma base de données. Voici le code :
Code :
|
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 !
Ah bah non ... $lettre est là non plus la première lettre mais le nombre de lettre envoyé dans la variable.
Code :
|
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.
Message édité par SiM07 le 20-04-2009 à 20:24:46
Répondre à SiM07
Voici mon code maintenant :
Code :
|
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 !
bien
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é.
Code :
|
Message édité par SiM07 le 21-04-2009 à 20:51:59
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.
Répondre à SiM07
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 !
Il y a 1380 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
