2010-05-10 6 views
1

Je voudrais coder un bbcode avec la sélection SQL. Fondamentalement, je veux que l'utilisateur soit en mesure d'entrer [user]Anotheruser[/user] dans un champ de texte, qui est ensuite converti en front-end à une URL qui ressemble à ceci: http://mydomain.com/user/[userid]/anotheruser. Donc, pour obtenir l'ID utilisateur, je dois inclure une sélection SQL, et en plus, s'il existe une autre possibilité de trouver l'autre utilisateur. Est-ce que je peux faire ceci avec un preg_replace comme habituellement utilisé pour créer le bbcode, ou dois-je faire quelque chose de plus complexe?PHP: BBCode avec sélection SQL?

Répondre

0

Pré-endroit devrait fonctionner, faire attention. Assurez-vous de réparer tous les trous ... attention à l'injection de sql en particulier.

0

Vous devriez éviter les injections POST-side, comme vous devriez le faire partout ailleurs.

Cette situation n'est pas différente du tout.

0

preg_match la balise d'abord, obtenir le nom d'utilisateur, exécutez la requête (attention et faire ce pas en toute sécurité!) Et remplacer toute la chaîne en correspondance avec la nouvelle URL:

preg_match_all ('#\[user\](.*?)\[/user\]#i', $text, $matches, PREG_SET_ORDER); 

for ($i = 0, $j = count($matches); $i < $j; $i++) 
{ 
    $userName = $matches[$i][1]; 
    $userId = 0; 

    // query example with mysqli 
    $stmt = $sql->prepare('SELECT uid FROM users WHERE username = ? LIMIT 1'); 
    $stmt->bind_param('s', $userName); 
    $stmt->execute(); 
    $stmt->bind_result($userId); 

    if ($stmt->fetch()) 
    { 
     $text = str_replace($matches[$i][0], "<a href=\"/user/$userId/$userName\" title=\"$userName\">$userName</a>", $text); 
    } 
} 
+0

bonne solution. Pour économiser des ressources, vous pouvez désinfecter chaque correspondance, puis 'implode()' the $ matches' et interroger 'WHERE nom d'utilisateur IN (..imploded matches ..)'. De cette façon, vous avez seulement besoin d'exécuter une requête * one *. – Alec

+0

Ouais, je voulais juste montrer un code possible pour la requête SQL. Lors de l'utilisation d'instructions préparées, il serait encore mieux de préparer l'instruction une fois (avant la boucle) et de simplement mettre à jour le paramètre et l'exécuter. Les instructions préparées sont en fait assez rapides alors, et je crois que ce serait encore plus rapide que d'utiliser 'IN' (et probablement un peu plus sûr, car vous n'auriez pas besoin de vous échapper). – poke