PDO clauses WHERE et LIKE

Rechercher

PDO clauses WHERE et LIKE

Par joceT  -  7 reponses  -  Le 20/10/2009 16:13  -  Editer  - 

Bonjour,

Je ne suis pas une pro du php, mais petit à petit à l'aide de tutos et forum comme le votre, je commence à y prendre goût.

J'ai choisi de me connecter à ma base de données en utilisant PDO. Cela a pris un peu de temps, mais j'ai maintenant en ligne une base de données musicales que l'on peut consulter suivant plusieurs critères : noms, lieux de concerts, styles de musique etc ...

http://doomzik.com/index.php?page=collection/intro

Je voudrais maintenant offrir la possibilité de cliquer sur une lettre de l'alphabet (un menu) pour afficher une page contenant tous les groupes dont le nom commence par "a", puis "b" etc ...

Mais voilà, je bloque sur l'écriture de la requête préparée :

$stmt =$dbh->prepare ('SELECT * FROM ma_tableORDER BY Nom WHERE ma_table.Nom LIKE :?'); /* on execute la requete */ ** $stmt->execute(array(':Nom'=>'));**

Autrement dit, comment réécrire la requete ci-dessous pour qu'elle fonctionne avec PDO ?

//ANCIENNE REQUETE SQL $sql = "SELECT * FROM ma_table WHERE Nom LIKE 'A%' ORDER BY Nom"; //exécution de la requête $requete = mysql_query($sql);

Merci de m'aider où de me diriger vers un tuto qui expliquerait le topo.

Codialement,

JoceT

 

 

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 20/10/2009 17:28  -  Haut de page  - 

Salut joceT,

pour ça, tu peux utiliser une concaténation en SQL. Pour MySQL et Oracle, la fonction CONCAT() est faite pour ça, sinon pour SQL Server l'opérateur de concaténation « + » fera pareil :

SELECT *
FROM ma_table
WHERE Nom LIKE CONCAT(:A, '%' )
ORDER BY Nom

Pour MS SQL Server tu peux utiliser ceci :

SELECT *
FROM ma_table
WHERE Nom LIKE :A +'%'
ORDER BY Nom

Teste la version qui va bien, ensuite reporte la requête SQL dans ton code PHP et ça devrait bien rouler.

Enjoy ! :)

 

 
Par Cyrano  -  Le 20/10/2009 17:32  -  Haut de page  - 

Un détail oublié dans ma précédente intervention : la fonction SQL CONCAT() va assembler les paramètres dans l'ordre où elle les reçoit. Donc si là j'ai mis le « % » en second paramètre, ça va l'ajouter à la fin du premier. Si je l'avais mis en premier, ça l'aurat mit au début. Rien n'interdit de le mettre deux fois :

SELECT *
FROM ma_table
WHERE Nom LIKE CONCAT('%', :A, '%')
ORDER BY Nom
-- Équivaut à
SELECT *
FROM ma_table
WHERE Nom LIKE '%valeur-de-mon-parametre-A%'
ORDER BY Nom

 

 

 
Par joceT  -  Le 21/10/2009 11:22  -  Haut de page  - 

Bonjour Cyrano

Et merci de a réponse si rapide !

J'ai suivi tes conseils et j'ai testé sur le phyMyadmin de hébergeur. Malheureusement, ça n'a pas fonctionné, la requete sql me renvoyant à chaque fois un message d'erreur de syntaxe.

Par contre, je me suis inspirée des codes que tu as proposés et j'ai construit ma requete de la manière suivante et ça le fait.

$stmt =$dbh->prepare ("SELECT * FROM ma_table WHERE Nom LIKE 'A%' ORDER BY Nom"); /* on execute la requete */ $stmt->execute(array(':Nom'=>$nom.'A%'));

Si j'ai bien suivi l'utilité des requetes préparées, je me dis qu'il y a une solution pour que je ne répète pas cette requete autant de fois qu'il y a de lettres dans l'alphabet. Une variable $_get ou post devrait m'y aider. Je fais des essais et je reviens vers ce forum si je bloque.

Cordialement,

JoceT

 

 

 

 
Par Cyrano  -  Le 21/10/2009 20:01  -  Haut de page  - 

Salut,

ok, on va commencer par remettre ton code un peu en ordre. Au passage, au dessus de la zone de saisie dans la barre d'outils, tu as un bouton [] pour insérer du code : tu choisis le langage, tu indiques un titre et tu colles ton code.

<?php
$sql1 = "SELECT * ".
        "FROM ma_table ".
        "WHERE Nom LIKE 'A%' ".
        "ORDER BY Nom";
$stmt = $dbh->prepare ($sql1);
/* on execute la requete */
$stmt->execute(array(':Nom' => $nom .'A%'));

Si on regarde bien, quel paramètre est attendu de l'autre coté ? tu n'en as mis aucun dans ta requête. Par ailleurs, le «:» ne doit pas être mis devant le nom du paramètre dans le tableau que tu envoies.

VOici comment procéder (lis bien les commentaires)

<?php
/**
 * -1- On définit la requête SQL ;
 */
$sql = "SELECT * ".
        "FROM ma_table ".
        "WHERE Nom LIKE CONCAT(:A, '%') ".
        "ORDER BY Nom";
/**
 * -2- On prépare la requête ;
 */
$stmt = $dbh->prepare ($sql1);
/**
 * -3- On prépare les paramètres
 * Pas de «:» devant les noms des variables, donc
 * pas ':A' mais 'A' tout court
 */
$params = array(
    'A' => $nom
);
/**
 * -4- On execute la requete ;
 */
$stmt->execute($params);

Regarde d'abord la requête SQL : tu peux y voir cette fois l'utilisation de la fonction CONCAT() avec en premier le paramètre variable assorti des deux points : :A

Ensuite on prépare;

Ensuite, on alimente les paramètres variables : ici on en attend un seul, donc on alimente A

Enfin, on exécute le tout.

Refais un essai et reviens nous dire si ce n'est pas déjà plus efficace ;-)

 

 
Par joceT  -  Le 22/10/2009 16:55  -  Haut de page  - 

Hello,

Pour sûr , c'est plus efficace, sans hésitation !

Je ne savais pas qu'on pouvait concaténer comme tu l'as fait dans le code sql. Et comme je procède par étape et que j'essaie de n'utiliser que ce que j'ai bien compris, je me suis abstenue.

Voici ce à quoi je suis arrivée grâce à tes explications et mes petits" bidouillages personnels"

<p><a href="#">a</a> - b - c - d -....</p>
<?php require ('maconnexion');
$lettre = 'a';
try {
 /*** set the PDO error mode to exception ***/
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/** on définit la requete sql */
$sql = "SELECT * FROM ma_table
INNER JOIN  ma_table_2 ON ma_table.Style=ma_table_2.id_style
INNER JOIN ma_table_3 ON ma_table.Lieu= ma_table_3.id_lieu
WHERE ma_table.Nom LIKE CONCAT(:A, '%')
ORDER BY ma_table.Nom";
/* On prépare la requête */
$stmt = $dbh->prepare ($sql);
/** On prépare les paramètres */
$params = array('A' => $lettre);
/** On execute la requete */
$stmt->execute($params);
$count = $stmt->rowCount();
echo ("<p>Il y a $count enregistrements.</p>");
echo "<table border='1'>
<tr>
<th>N°</th>
<th>Nom</th>
<th>Style</th>
<th>Lieu</th>
</tr>";
while($lettre=$params = $stmt->fetch(PDO::FETCH_OBJ))
{
echo "<tr>";
echo "<td>".$lettre->id_coll."</td>";
echo "<td><strong>".$lettre->Nom. "</strong></td>";
echo "<td>".$lettre->Style. "</td>";
echo "<td>".$lettre->Salle. " - ".$lettre->Ville."</td>";
echo "</tr>";
}
echo "</table>";
    $dbh = null;
    }
catch (PDOException $e)
    {
    print "Error!: " . $e->getMessage() . '<br />';
    }
?>

Je ne sais pas si tout est correctement écrit mais j'obtiens l'affichage en fonction de la variable $lettre. Prochaine étape, un formulaire pour le choix alphabétique de la page à afficher.

Je suis ravie de l'accueil sur ce forum (il m'est arrivé de me faire sévèrement rabrouer avec mes questions un peu simplistes sur un forum bien moins convivial que celui-ci).

J'essaierai de ne pas abuser, mais je vais sans doute revenir bientôt pour d'autres questions. :)

JoceT

 

 

 
Par  -  Le 07/01/2012 06:16  -  Haut de page  - 

Very thanks for your wonderful post and hoping to post more of this! ugg boots cheap

 

 
Par  -  Le 07/01/2012 06:16  -  Haut de page  - 

Hi, the article is so wonderful, uggs boots for cheap

 

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |