Sortie de la base de données double

Résolu/Fermé
l3abyl3oy Messages postés 5 Date d'inscription jeudi 30 avril 2015 Statut Membre Dernière intervention 5 juin 2015 - Modifié par l3abyl3oy le 30/04/2015 à 02:58
l3abyl3oy Messages postés 5 Date d'inscription jeudi 30 avril 2015 Statut Membre Dernière intervention 5 juin 2015 - 30 avril 2015 à 15:09
Bonjour,
Depuis quelques jours, j'essaie de faire un système d'autocomplétion pour ma barre de recherche, mais en vain. Pour cette raison je me retourne vers vous expert du web.
Je ne sais pas ce que je fais mal dans le code PHP, mais le voici.

D'après moi ça devrait avoir l'air de ça:
<?php 

try {$bdd=new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root','');}
catch(Exception $e){die('Erreur : '.$e->getMessage());}

$req = $bdd->prepare('SELECT entreprise FROM entreprises WHERE entreprise LIKE "%:s%" ORDER BY entreprise LIMIT 0,10');
$req->execute(array('s' => $_GET['s']));

$datas = $req->fetchAll();

echo implode('|', $datas);

?>


Celui ci fonctionnent mais double les résultats:

<?php 

try {$bdd=new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root','');}
catch(Exception $e){die('Erreur : '.$e->getMessage());}

$req = $bdd->query('SELECT entreprise FROM entreprises ');

while($data = $req->fetch())
{


$dataLen = count($data);

sort($data);


$results = array();

for($i=0 ; $i<$dataLen && count($results)<10 ;$i++ )
{
if(stripos($data[$i], $_GET['s'])===0)
{
array_push($results,$data[$i]);
}
}

echo implode('|', $results);
}



?>

Merci pour votre aide et votre temps.

3 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
30 avril 2015 à 09:18
Bonjour.
avec les LIKE
tu dois mettre les % dans ton array et non dans le prepare il me semble
2
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
30 avril 2015 à 09:20
0
Bonjour

Par défaut, PDOSattement::fetch te retourne un tableau indexé par les noms des champs ET numériquement, autrement dit tu as deux réponses pour chaque champ.
Il suffit de lui préciser que tu ne veux que l'indice numérique :
while($data = $req->fetch(PDO::FETCH_NUM))


Tu n'aurais pas eu ce problème si tu t'étais passé de la boucle for($i=0 ..., parfaitement inutile puisque tu demandes un seul champ ('entreprise') dans ton SELECT
[edit]
En fait, ton second code dont tu dis pourtant qu'il marche en doublant les résultats, me semble complètement illogique.
Alors que ton premier me semble OK après prise en compte de la remarque de jordane.
1
l3abyl3oy Messages postés 5 Date d'inscription jeudi 30 avril 2015 Statut Membre Dernière intervention 5 juin 2015
30 avril 2015 à 15:09
Un gros merci pour votre aide, je n'en ai pas reçu beaucoup sur le web. Je sais que ma deuxième initiative n'est pas logique, comme une personne qui essaie d'entrer une forme carrée dans dans un trou triangulaire, mais après toutes mes tentatives pour la première solution rien n'a fonctionné, j'ai modifié la deuxième et ça fonctionne.

<?php 

try {$bdd=new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root','');}
catch(Exception $e){die('Erreur : '.$e->getMessage());}

$req = $bdd->query('SELECT entreprise FROM entreprises ');

$results = array();

while($data = $req->fetch(PDO::FETCH_NUM))
{

$dataLen = count($data);

sort($data);




for($i=0 ; $i<$dataLen && count($results)<10 ;$i++ )
{
if(stripos($data[$i], $_GET['s'])===0)
{
array_push($results,$data[$i]);

}

}



}

echo implode('|', $results);

?>


Encore une fois merci!
0