2010-11-05 5 views
0

J'ai donc ce système PM.PHP: Si pas de prénom

Dans le champ Destinataire, vous pouvez saisir le nom complet de l'utilisateur auquel vous voulez écrire.

Donc je veux aider l'utilisateur alittle, s'il ne se souvient pas du nom.

Donc, si vous voulez écrire le nom complet « Megan Fox » et ne savent:

Megan 
Megan F 
Megan Fo 
Meg Fo 
M Fox 
etc.. 

Il retournera « Vouliez-vous dire Megan Fox? » Cela fonctionne déjà très bien.

Maintenant ce que je dois en est que si vous écrivez seulement Fox, sans prenom, je veux qu'il echo « Vouliez-vous dire Megan Fox? »

Voici où je suis coincé, car il crée $ nom de famille après l'espace. Et je ne veux vraiment pas utiliser deux champs pour le premier et le dernier.

Comment puis-je faire cela?

Voici mon code:

list($firstname, $lastname) = array_map('ucfirst', explode(' ', $mot, 2)); 
$qur = mysql_query(" 
SELECT id, firstname, lastname, 
(firstname = '$firstname' AND lastname = '$lastname') AS full FROM users 
WHERE (firstname = '$firstname' AND lastname='$lastname') 
OR (firstname LIKE '$firstname%' AND lastname LIKE '$lastname%') 
ORDER BY (firstname = '$firstname' AND lastname='$lastname') DESC"); 
$get = mysql_fetch_array($qur); 

if($get["full"] == 1){ 
echo $get["id"]; 
}else{ 
echo "Did you mean: ".$get["firstname"]." ".$get["lastname"]." ?"; 
} 
+1

J'espère que vous EFM faire une hygiène de chaîne étanche à l'air avant de les déposer directement dans la requête comme ça. Sinon, l'injection SQL serait très facile pour un utilisateur malveillant ici. –

+0

oui, $ mot est real_escaped – Johnson

Répondre

2

Cela devrait fonctionner.

$qur = mysql_query(" 
SELECT id, firstname, lastname, 
(firstname = '$firstname' AND lastname = '$lastname') AS full FROM users 
WHERE (firstname = '$firstname' AND lastname='$lastname') 
OR (firstname LIKE '$firstname%' AND lastname LIKE '$lastname%') 
OR ('$lastname' = '' AND lastname LIKE '$firstname%') 
ORDER BY (firstname = '$firstname' AND lastname='$lastname') DESC"); 
2
OR ('$lastname'='' AND lastname LIKE '$firstname%') 
1

je suppose qu'il vaut mieux faire correspondre la valeur unique au lieu de deux. Par exemple, il est difficile de deviner où est le prénom et où est le dernier, car l'utilisateur peut taper Magan Fox ou Fox Megan.

si la requête ressemblerait à ceci:

SELECT id, firstname, lastname, CONCAT (firstname, ' ', lastname) AS fullname 
FROM `users` 
WHERE firstname LIKE '{$string}%' OR lastname LIKE '{$string}%' 
GROUP BY firstname, lastname 
ORDER BY firstname ASC, lastname ASC