stripos() qui ne fonctionne pas correctement

WRInaute impliqué
Bonjour,

j'ai un soucis avec un petit script php (autocomplète, auto saisi dans un input)

Le script fonctionne parfaitement avec des mots (nom de villes), mais du moment que je fais une recherche sur un code postal, cela ne fonctionne plus.

Exemple lorsque je tape la ville "Béziers". Cela fonctionne

1553720529453_11.png


Maintenant lorsque le tape seulement le code postal "34500". Cela ne fonctionne pas pourtant il est bien présent dans la chaîne de caractère !

15537205911669_22.png


Voici mon code php :

PHP:
$query = $_GET['query'];
 
$sql = "SELECT name, zipcode, server FROM cities WHERE server != 0";
 
foreach  ($bdd->query($sql) as $result) {
    
    $values[] = $result['name'].'-'.$result['zipcode']; // Chaine de caractère : Nom de la ville - Code postal
}
 
if ($query) {
    
    foreach ($values as $key => $value) {
        
        if (stripos($value, $query) === false) {
            unset($values[$key]);
        }
    }
}
 
echo json_encode(array_values($values));

Et le code Javascript :

Code:
function hinter(event) {
 
    var input = event.target;
    var huge_list = document.getElementById('huge_list');
    var min_characters = 3;
 
    if (input.value.length < min_characters ) {
        return;
    } else {
 
        window.hinterXHR.abort();
 
        window.hinterXHR.onreadystatechange = function() {
            
            if (this.readyState == 4 && this.status == 200) {
 
                var response = JSON.parse( this.responseText );
 
                huge_list.innerHTML = "";
 
                response.forEach(function(item) {
 
                    var option = document.createElement('option');

                    console.log(item); // Affiche bien Béziers-34500 alors que option value de s'affiche pas !
                   
                   option.value = item; 
                    
                    huge_list.appendChild(option);
                });
            }
        };
 
        window.hinterXHR.open("GET", "/?page=results_input&query=" + input.value, true);
        window.hinterXHR.send()
    }
}

Code HTML :

HTML:
<form>
        <input type="text" name="name" id="name_input" list="huge_list">
        <datalist id="huge_list">
        </datalist>
    </form>

Si je tape seulement 34500 dans l'input de recherche, un console.log(item) dans le JS affiche pourtant bien "Béziers-34500" mais le datalist reste vide. Je ne comprends pas d'ou vient le problème.

Je vous remercie d'avance
 
WRInaute accro
HS: pourquoi tu fais pas un SQL LIKE ou un array_filter() au lieu de faire unset() des éléments non trouvés ?
 
WRInaute impliqué
Oui c'est un possibilité, mais ca ne résout pas le problème. Lors d'une recherche de code postal le datalist ne fonctionne plus pour une raison que j'ignore.
 
WRInaute passionné
Commence par virer ces deux boucles foreach, et donc le stripos aussi, et modifier la requête avec un CONCAT et un LIKE.
Ta question sur le stripos disparaît par la même occasion, en plus d'être beaucoup plus performant pour le serveur, et d'avoir un code beaucoup plus concis.
Si le problème persiste, on étudiera la question :D
 
WRInaute passionné
stripos marche qu'avec les chaine de caractère pas avec les chiffres, il doit manquer les cotes de $result['zipcode'] pour le déclarer comme string
 
WRInaute impliqué
Je viens de modifier le code php avec un LIKE et CONCAT mais le datalist ne fonctionne toujours pas.

PHP:
$sql = "SELECT name, zipcode, server FROM cities WHERE MATCH (name, zipcode) AGAINST (CONCAT('+', :keyword) IN BOOLEAN MODE) ORDER BY name ASC LIMIT 6";

$requete = $bdd -> prepare($sql);
$requete->bindValue(':keyword', $_GET['query'], PDO::PARAM_STR);
$requete->execute();

$list = $requete->fetchAll();
$requete->closeCursor();

if ($requete->rowCount() >= 1) {

    foreach ($list as $result) {
      
        $zipcode = substr($result['zipcode'], 0, 5);
      
        $values[] =  $result['name'].' - '.$zipcode;

    }
  
}else{
  
    $values[] =  null;
  
}

echo json_encode(array_values($values));

Par exemple si query = "34000" l'echo me renvoi bien "["Montpellier - 34000"]"

Le JS semble également fonctionner correctement mais cette partie la :

Code:
 response.forEach(function(item) {
                       
                    var option = document.createElement('option');
                    option.value = item;
                   
                    huge_list.appendChild(option);
                });

ne crée par le balise <option></option>

Pourtant un console.log(option); affiche bien la balise complète.
 
Dernière édition:
WRInaute impliqué
Tout simplement un autocomplète qui fonctionne avec une recherche de nom d'une ville Ou de code postal. Or la ca ne fonctionne qu'avec la recherche d'un nom de ville.

Je recherche "Béziers" et cela fonctionne :

1553720529453_11.png


Je recherche son code postal "34500" cela ne fonctionne pas :

15537205911669_22.png



Pourtant la chaine de caractère est bien "Béziers - 34500" !

Ou est donc le problème, je ne comprends pas.
 
Discussions similaires
Haut