2009-08-08 8 views
0

J'essaie d'avoir un résultat de recherche pour le nom de quelqu'un explose puis le prénom et le nom de chaque recherche par rapport à chaque champ «premier» et «dernier».mysql plusieurs requêtes avec php

Mais besoin de laisser de la place si quelqu'un cherche le premier nom midle comme = $ who = James David Smith il va l'exploser et chercher chacun des noms par rapport à la première colonne et la dernière colonne. Incase l'utilisateur entre le nom de famille en premier ou ajoute un deuxième prénom.

Voici ce que j'ai pour l'instant mais je suis bloqué. Aidez-moi. S'il vous plaît.

<? 

$search = explode(' ', $who); 

$limit=verify($get['page'])?" limit ".($get['page']*10).",10":" limit 10"; 

$q="select * from users where (first IN('%$search[]%') or last IN('%$search[]%') or full_name LIKE '%".$get['who']."%') AND (city LIKE '%".$get['where']."%' or province LIKE '%".$get['where']."%') order by province";   

$rows=get_recordset($q); 

if(count($rows)){ 
    foreach($rows as $row){ 

echo $q; 

?> 

Répondre

2

Je ne suis pas sûr que je vous ai, mais si ce que vous voulez dire:

Lorsque vous avez 3 noms puis - vérifier tous les noms contre les trois champs (premier, dernier, FullName).

Lorsque vous avez seulement deux noms puis - vérifier le prénom contre premier champ et nom contre dernier champ

cela devrait l'obtenir fait:

 
$search = explode(' ', $who); 
if (count($search) >2) { // in case we do got a middle name - 
    $whereNameStringsArr = array(); 
    foreach ($search as $val) { 
     $whereNameStringsArr[] = " first LIKE '%$val%' 
         OR last LIKE '%$val%' 
         OR full_name LIKE '%$val%' "; 
    } 
    $whereNameClause = implode(" OR ",$whereNameStringsArr); 
} else { // in case we don't got a middle name 
    $whereNameClause = " first LIKE '%{$search[0]}%' 
       OR last LIKE '%{$search[1]}%' "; 
} 
$limit=verify($get['page'])?" limit ".($get['page']*10).",10":" limit 10"; 
$q="select * from users where ($whereNameClause) 
       AND (city LIKE '%".$get['where']."%' or province LIKE '%".$get['where']."%') 
       order by province 
       $limit";   

$rows=get_recordset($q); 
.... 

Bien sûr - assurez-vous valider tous les données que vous obtenez de l'entrée de l'utilisateur

+0

Fermer. J'aime où vous allez, mais ne marche pas. Si vous inversez l'ordre du nom des personnes et recherchez le nom de famille en premier. Ne retourne rien. –

0

Alors pourquoi ne pas faire une recherche floue? Lorsque vous éclatez les données, faire quelque chose comme ceci:

$name = $_POST['name'] // John Michael Smith 

$first_name = substr($name, 0, strrpos($name, ' ')); //Returns everything before last space, ie John Michael 

$last_name = strstr($name, ' '); //Returns everything after first space, ie John Michael 

Maintenant, vous exécutez simplement la requête MySQL, mais mettez à chercher quelque chose qui contient les valeurs ci-dessus (recherche sous-chaîne) en utilisant LOCATE:

$results = mysql_query("SELECT * FROM names 
       WHERE LOCATE(firstname, '$first_name') > 0 OR 
         LOCATE(lastname, '$last_name') > 0 
       ORDER BY lastname 

Je suppose que vous savez quoi faire avec les résultats.


Mise à jour rapide, si vous êtes inquiet au sujet des utilisateurs qui entrent dans le champ Nom Prénom Moyen-Orient, ou ce que vous avez, vous pouvez toujours utiliser ce qui précède, mais faire localiser sur la chaîne entière:

$results = mysql_query("SELECT * FROM names 
       WHERE LOCATE(firstname, '$name') > 0 OR 
         LOCATE(lastname, '$name') > 0 
       ORDER BY lastname 

Cela vérifiera les deux colonnes pour toutes les instances de l'une des chaînes. Vous devriez probablement (après avoir désinfecté la chaîne, comme cela a déjà été suggéré à juste titre) enlever également les virgules (mais pas les traits d'union) au cas où quelqu'un entrerait en dernier, en premier ou autre. remplacez-les par des espaces, puis réduisez tous les espaces multiples en un espace pour être sûr de deux.


Désolé, rien à redire. Voici le moyen de diviser les noms (par des blancs). Il y a un problème avec ma syntaxe substr:

$name = $_POST['name'] // John Michael Smith 

$first_name = substr($name, 0, strrpos($name, ' ')); //Returns everything before last space, ie John Michael 

$last_name = strstr($name, ' '); //Returns everything after first space, ie John Michael 
+0

Erreur de syntaxe sur la ligne $ first_name = substr (0, strrchr ($ name, "")); // Renvoie tout avant le dernier espace, c.-à-d. John Michael –

+0

Erreur d'analyse: erreur de syntaxe, inattendue T_VARIABLE –

+0

Désolé. C'est ce que j'ai pour copier et coller à partir d'exemples de documentation.Voici comment obtenir le prénom: '$ first_name = substr ($ name, 0, strrpos ($ name," "));' – Anthony