[Résolu] Requete sql
Dernière réponse : dans Programmation
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 !
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
Lassé par la pub ? Créez un compte
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 :
où xxx serait : les films commençant par la lettre qui correspond au lien que j'ai cliqué
Voila...
merci de ton aide !
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 :
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 !
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 à :
A mon avis vu ton site, la solution du Like est très très certainement la meilleur.
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 à :
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.
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 :
J'aimerai avoir ç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 :
Ou un truc dans le genre. Voila...
Merci de votre aide !
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 :
<a href="index.php?action=action_mes_films_0_9">0..9</a> <a href="index.php?action=action_mes_films_a">A </a> <a href="index.php?action=action_mes_films_b">B </a> <a href="index.php?action=action_mes_films_c">C </a> <a href="index.php?action=action_mes_films_d">D </a> <a href="index.php?action=action_mes_films_e">E </a>
J'aimerai avoir ça :
<a href="index.php?action=action_mes_films">0..9</a> <a href="index.php?action=action_mes_films">A </a> <a href="index.php?action=action_mes_films">B </a> <a href="index.php?action=action_mes_films">C </a> <a href="index.php?action=action_mes_films">D </a> <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 :
"SELECT champ1, champ2 FROM matab WHERE titre like ".$marqueur."%";
Ou un truc dans le genre. Voila...
Merci de votre aide !
Peut être en essayant ça :
Ta lettre sera dans la variable $_GET['lettre'] ...
<a href="index.php?action=action_mes_films&lettre=0">0..9</a> <a href="index.php?action=action_mes_films&lettre=A">A </a> <a href="index.php?action=action_mes_films&lettre=B">B </a> <a href="index.php?action=action_mes_films&lettre=C">C </a> <a href="index.php?action=action_mes_films&lettre=D">D </a> <a href="index.php?action=action_mes_films&lettre=E">E </a>
Ta lettre sera dans la variable $_GET['lettre'] ...
Alors ça commence à se décanter comm eil faut...
Voici un bout de mon 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 :
Voila si quelqu'un peut m'aider.
Merci de votre aide !
Voici un bout de mon code :
<a href="index.php?action=action_mes_films&lettre=0">0..9</a> <a href="index.php?action=action_mes_films&lettre=a">A </a> <a href="index.php?action=action_mes_films&lettre=b">B </a> <a href="index.php?action=action_mes_films&lettre=c">C </a> $lettre=$_GET['lettre']; /*script de connexion à la base...*/ $sql = "SELECT * FROM `films-present` ORDER BY `titre` WHERE `lettre`=".$lettre.""; $requete = mysql_query($sql); $nbResultats = mysql_num_rows($requete);//compte le nombre de lignes //test de l'execution de la requete if ($nbResultats == 0) echo "Il n'y a pas encore de films danc cette liste.<br/>"; else while ($requetearray=mysql_fetch_array($requete)){ echo $requetearray['titre']; }
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 :
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 !
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 :
Et cela m'affiche l'erreur suivante :
Voila tout, si quelqu'un peut m'aider à résoudre ce problème...
Merci de votre aide !
Mais la première erreur persiste.
Voici le code :
$sql = "SELECT titre FROM `films-present` WHERE UPPER titre LIKE UPPER('$_GET[lettre]')"; $requete = mysql_query($sql); $nbResultats = mysql_num_rows($requete)or die(mysql_error());
Et cela m'affiche l'erreur suivante :
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 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 !
$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.
Ah ça avance !
Par contre j'ai testé le mysql_real_escape_string(), mais ça me met deux erreurs :
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 !
Par contre j'ai testé le mysql_real_escape_string(), mais ça me met deux erreurs :
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 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 !
Je me connecte bien à ma base de données. Voici le 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 !
<div style="{font-size:1.5em;text-align:center;}"> <a href="index.php?action=action_mes_films&lettre=0">0..9</a> <a href="index.php?action=action_mes_films&lettre=a">A </a> <a href="index.php?action=action_mes_films&lettre=b">B </a> <a href="index.php?action=action_mes_films&lettre=c">C </a> ... </div> <?php $lettre = strlen($_GET['lettre']); if ($lettre != 1 ){ echo "Erreur"; } else { $connexionMYSQL = mysql_connect("*****","****","****"); if (! $connexionMYSQL)//Connexion au serveur manqué echo "Echec de la connexion au serveur MYSQL.<br/>"; else//Connexion au serveur réussie { //echo "Connexion au serveur MYSQL établie.<br/>"; $activationBD = mysql_select_db("*****", $connexionMYSQL); if (! $activationBD)//Activation de la base de données raté echo "Connexion au serveur MYSQL réussie mais impossible d'accéder à la base de données.<br/>"; else//activation réussie { //echo "Connexion au serveur MYSQL ok. Activation de la base de données de liste_gadget réussite.<br/>"; $sql = "SELECT titre FROM `films-present` WHERE UPPER titre LIKE '%$lettre'"; $requete = mysql_query($sql); $nbResultats = mysql_num_rows($requete)or die(mysql_error());//compte le nombre de lignes //test de l'execution de la requete if ($nbResultats == 0) echo "Il n'y a pas encore de films danc cette liste.<br/>"; else while ($requetearray=mysql_fetch_array($requete)){ ?> <form method="post" name="form<? echo $requetearray['id-films']; ?>" action="index.php?action=action_afficher_film_0_9&id=<?php echo $requetearray['id-films']; ?>"> <TABLE width='100%'> <?php echo "<tr width=\"50%\">"; echo "<td width=\"50%\">".$requetearray['titre']."</td>"; echo "<td><input type=\"submit\" value=\"Voir sa fiche\"/></td>"; echo "</tr>"; ?> </form> </table> <?php } } } } ?>
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.
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.
if(strlen($lettre) != 1) { trigger_error("Parametre incorrect",E_USER_ERROR); }
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.
Voici mon code maintenant :
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 !
<?php error_reporting(E_ALL); ?> <div style="{font-size:1.5em;text-align:center;}"> <a href="index.php?action=action_mes_films&lettre=0">0..9</a> <a href="index.php?action=action_mes_films&lettre=a">A </a> <a href="index.php?action=action_mes_films&lettre=b">B </a> <a href="index.php?action=action_mes_films&lettre=c">C </a> </div> <?php $lettre = strlen($_GET['lettre']); if(strlen($lettre) != 1) { trigger_error("Parametre incorrect",E_USER_ERROR); } $connexionMYSQL = mysql_connect("****","*****","*****"); if (! $connexionMYSQL)//Connexion au serveur manqué echo "Echec de la connexion au serveur MYSQL.<br/>"; else//Connexion au serveur réussie { //echo "Connexion au serveur MYSQL établie.<br/>"; $activationBD = mysql_select_db("*****", $connexionMYSQL); if (! $activationBD)//Activation de la base de données raté echo "Connexion au serveur MYSQL réussie mais impossible d'accéder à la base de données.<br/>"; else//activation réussie { //echo "Connexion au serveur MYSQL ok. Activation de la base de données de liste_gadget réussite.<br/>"; $sql = "SELECT titre FROM `films-present` WHERE lettre LIKE '$lettre%'"; $requete = mysql_query($sql); $nbResultats = mysql_num_rows($requete)or die(mysql_error());//compte le nombre de lignes //test de l'execution de la requete if ($nbResultats == 0) echo "Il n'y a pas encore de films danc cette liste.<br/>"; else while ($requetearray=mysql_fetch_array($requete)){ ?> <form method="post" name="form<? echo $requetearray['id-films']; ?>" action="index.php?action=action_afficher_film_0_9&id=<?php echo $requetearray['id-films']; ?>"> <TABLE width='100%'> <?php echo "<tr width=\"50%\">"; echo "<td width=\"50%\">".$requetearray['titre']."</td>"; echo "<td><input type=\"submit\" value=\"Voir sa fiche\"/></td>"; echo "</tr>"; ?> </form> </table> <?php } } } ?> <div id="copyright"> Copyright "CRI-MOVIES" 2009, tous droits réservés<br /> <SCRIPT LANGUAGE="JavaScript"> document.write(messageDate); </SCRIPT> <noscript><a href="<a href="http://www.editeurjavascript.com/" target="_blank">http://www.editeurjavascript.com/</a>">ajax</a></noscript> <div id="ejs_heure">Initialisation</div><noscript><a href="<a href="http://www.editeurjavascript.com/" target="_blank">http://www.editeurjavascript.com/</a>">ajax</a></noscript> </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 !
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é.
Voici mon code et je suis près à le modifier pour la sécurité.
<?php error_reporting(E_ALL); ?> <div style="{font-size:1.5em;text-align:center;}"> <a href="index.php?action=action_mes_films&lettre=0">0..9</a> <a href="index.php?action=action_mes_films&lettre=a">A </a> <a href="index.php?action=action_mes_films&lettre=b">B </a> <a href="index.php?action=action_mes_films&lettre=c">C </a> // .... </div> <?php $lettre = $_GET['lettre']; $lettre1 = strlen($_GET['lettre']); if(strlen($lettre) != 1) { trigger_error("Parametre incorrect",E_USER_ERROR); } echo $lettre; $connexionMYSQL = mysql_connect("***********","**********","*********"); if (! $connexionMYSQL)//Connexion au serveur manqué echo "Echec de la connexion au serveur MYSQL.<br/>"; else//Connexion au serveur réussie { //echo "Connexion au serveur MYSQL établie.<br/>"; $activationBD = mysql_select_db("db279968696", $connexionMYSQL); if (! $activationBD)//Activation de la base de données raté echo "Connexion au serveur MYSQL réussie mais impossible d'accéder à la base de données.<br/>"; else//activation réussie { //echo "Connexion au serveur MYSQL ok. Activation de la base de données de liste_gadget réussite.<br/>"; $sql = "SELECT titre FROM `films-present` WHERE lettre LIKE '$lettre%'"; $requete = mysql_query($sql); $nbResultats = mysql_num_rows($requete)or die(mysql_error());//compte le nombre de lignes //test de l'execution de la requete if ($nbResultats == 0) echo "Il n'y a pas encore de films danc cette liste.<br/>"; else while ($requetearray = mysql_fetch_array($requete)){ ?> <form method="post" name="form<? echo $requetearray['id-films']; ?>" action="index.php?action=action_afficher_film_0_9&id=<?php echo $requetearray['id-films']; ?>"> <TABLE width='100%'> <?php echo "<tr width=\"50%\">"; echo "<td width=\"50%\">".$requetearray['titre']."</td>"; echo "<td><input type=\"submit\" value=\"Voir sa fiche\"/></td>"; echo "</tr>"; ?> </form> </table> <?php } } } ?>
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.
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.
Lassé par la pub ? Créez un compte
- Contenus similaires :
- Forum[RESOLU]Probleme avec des requetes sql
- Solutions[VBA] Erreur requete SQL et cellules
- Solutions[VBA] Probleme requete SQL
- Solutions[VBA] probleme requete SQL
- Solutions[VBA] requete SQL
- ForumRequête SQL pour 2 tables
- SolutionsRequete PHP selon 2 tables SQL avec id commun
- SolutionsRequete SQL
- ForumRemplir Combobox avec requête SQL vb.net
- Voir plus