Forum Clubic

Problème de recherche REGEX sur une BDD SQL

j’essaye de faire recherche par critère sur ma base de donnée mais il m’affiche un message d’erreur.
J’ai enlevé les critère là il m’affiche ma liste complète pas de problème mais dès que je mais “WHERE nom REGEXP ‘populous’” sa marche plus.

Voila la partie recherche de mon script :

Classer les roms par : ordre des numéros de rom ordre alphabétique

<?php if (isset($_POST['ordre'])) { $ordre = $_POST['ordre']; } else { $ordre = "numero"; } mysql_connect("localhost", "root", ""); // Connexion à MySQL mysql_select_db("roms-49"); // Sélection de la base coursphp $reponse = mysql_query("SELECT * FROM liste_roms ORDER BY $ordre "); // Requête SQL // On fait une boucle pour lister tout ce que contient la table : while ($donnees = mysql_fetch_array($reponse) ) { ?> <?php if ($donnees['numero']<1000) { echo "0"; if ($donnees['numero']<100) { echo "0"; if ($donnees['numero']<10) { echo "0"; } } } echo $donnees['numero']; ?> - <?php echo $donnees['nom']; ?> (langue : <?php echo $donnees['langue']; ?> ; uploader par : <?php echo $donnees['uploader']; ?>)
<?php } mysql_close(); // Déconnexion de MySQL ?>

je précise que j’utilise PHPmyAdmin et Wamp

Hum dans ton cas tu n’as pas besoin d’utiliser de REGEX (d’autant plus que ça ne s’utilise pas tout à fait comme ça), c’est relativement lourd, privilégie plutôt un LIKE, dans ton cas ça marchera parfaitement.
Ensuite un petit conseil, quand on comprends la syntaxe on peut plus s’en passer, mais il y a en PHP quelque chose de très utile qui permet de réduire le nombre de lignes et donc souvent la lisibilité : la syntaxe suivante

$Var=test_logique?valeur_si_vrai:valeur_si_faux;

Tu peux ainsi remplacer tes 8 lignes :

if (isset($_POST['ordre']))
{
$ordre = $_POST['ordre'];
}
else
{
$ordre = "numero";
}

Par une seule ligne :

$ordre=isset($_POST['ordre'])?$_POST['ordre']:"numero";

Juste quelques conseils au passage, ça tue pas de mouches :)!
Edité le 09/04/2009 à 16:44

ok j’ai compris pour l’histoire de la syntaxe je regarde ça dès que que tous fonctionne
mais c’est quoi LIKE et comment on s’en sert c’est la première fois que j’en entend parler ??

Je sais pas si tu maitrises bien les REGEX, mais ça permet plus de contrôler et surtout de “matcher” des termes. Schématiquement, tu tries une chaine de caractères et tu extraits ce qui t’intéresse. Ainsi, pour un exemple basique, tu peux vérifier que “bcd” appartient bien à “abcdefgh” mais ce n’est pas intéressant d’utiliser les Regex juste pour ça, car c’est plutôt lourd en ressource derrière. L’intérêt réside plutôt dans le fait de demander par exemple de récupérer la sous chaine qui se trouve après, à savoir ici “efgh”.
Voilà à quoi servent les Regex en gros.

Toi, dans ton cas, tu veux simplement vérifier l’existence d’une chaine dans une autre, et même si j’ai bien compris vérifier que ta chaine commence par ta sous chaine. L’opérateur LIKE permet simplement d’utiliser le jocker “%” pour comparer deux chaines, l’une étant incomplète. Ainsi tu peux vérifier que “abcdefg” commence bien par “ab” en faisant un “abcdefg” LIKE “ab%”, ou bien vérifier que ça se termine par “fg” en faisant un “abcdefd” LIKE “%fg”.
Tu peux placer le joker “%” ou tu veux, et il se traduit par "n’importe quel caractère autant de fois que l’on veut.

Regex permet bien évidemment de faire ça, mais je ne vois pas l’intérêt ici. En Regex tu peux aussi détailler, du genre “n’importe quel caractère n fois au maximum” ou bien “un caractère entre a et d (donc a,b,c ou d) autant de fois que l’on veut” etc…

La syntaxe est donc :
champ LIKE “chaine%” (dans le cas d’un test où le champ doit commencer par chaine)

J’espère avoir été claire :s !

J’ai 2 question :

  1. Est-ce que je peux écrire

champ LIKE “%chaine%”

???

2)Est-ce que je peux mettre "WHERE champ LIKE “chaine%” " à la place de REGEX ???

1 et 2 : Oui :slight_smile: C’est le but de cette fonction, elle est censé être plus pratique que les Regex!

Non.

Tu devrais écrire champ LIKE ‘%chaine%’.

Ce sont les single quote (ou apostrophe) qui délimitent les chaînes de caractères en SQL. N’oublie pas également d’utiliser mysql_real_escape_string et consort si c’est une chaine utilisateur, genre :

$sql .= 'where champ like \'%'  . mysql_real_escape_string($_POST['foobar']) . '%\'';

Et n’oublie pas également de protéger les % et _ pour éviter des catastrophes (genre LIKE ‘%f%b%’ qui cherchera indifférement tout f suivi d’un b.

Il a raison.
Concernant les apostrophes tout comme la fonction d’échappement. En effet, si le contenu que tu filtres est entré plus ou moins directement par l’utilisateur, ce dernier peut ce que l’on appelle injecter ton code. C’est à dire utiliser des caractères d’échappements pour sortir de ta requête et ainsi en exécuter une totalement différente et causer des dommages à ta base de donnée. C’est une technique de Hack bien connue. Utilises un moteur de recherche pour obtenir plus d’infos pour empêcher ce genre d’attaques.
Bon courage :slight_smile:

Ce qu’on appelle plus communément le SQL injection.

M’enfin dans le cas échéant :

SELECT * FROM liste_roms ORDER BY $ordre

Le risque n’est pas très élevé (que pour une authentification par exemple). Sauf s’il est possible d’enchainer plusieurs requêtes SQL sur une meme ligne (comme dans SQL Server), qqn peut il confirmer ? Dans ce cas, s’assurer que l’utilisateur de la base n’est pas accès aux ordres de modifications de schéma…

(Voilà c’était juste pour faire l’interessant, vu que la réponse de sans nom devrait parfaitement suffire)