Autor | Zpráva | ||
---|---|---|---|
Fisak Profil |
#1 · Zasláno: 11. 4. 2013, 20:57:10
Dobrý den. Dělám chat a rád bych si udělal nějakou sadu příkazů v chatu.. Např. když napíšu do chatu "/kick Fisak" tak aby se vykonal nějaký skrypt. Mohl by mi poradit prosím někdo jak toto udělat ? Něco jako:
if($_POST["text"] == "/kick $nick") DB::query("DELETE FROM [:pref:chat] where nick = $nick"); |
||
Alphard Profil |
#2 · Zasláno: 11. 4. 2013, 21:10:31
|
||
Fisak Profil |
#3 · Zasláno: 11. 4. 2013, 21:28:38
ok zhruba jsem něco vytvořil ale nefunguje mi to ..
if($_POST['text'] == preg_match('@^(?:/kick)?([^/]+)@i', $_POST['text'], $matches)) DB::query("DELETE FROM [:pref:chat] where nick = $matches[1]"); |
||
DJ Miky Profil |
Nebo, pokud jsou ty příkazy syntakticky jednoduché, bude fungovat porovnání začátku řetězce na
'/kick ' a další zpracování pomocí funkcí pro práci s řetězci.
Případně zadaný text rozseknout na dvě části pomocí list($prikaz, $parametr) = explode(' ', $text, 2); a první část ($prikaz ) porovnat v nějakém switchi na '/kick' a další speciální příkazy.
„@^(?:/kick)?([^/]+)@i“ To mi moc nedává smysl, jednodušší RV by byl: @^/kick (.+)$@i $matches[1] ještě prohnat přes trim() , aby se eliminovaly případné mezery navíc zadané omylem.
|
||
Tori Profil |
Fisak:
- preg_match vrací logickou hodnotu, ne řetězec. - chybí vám uvozovky/apostrofy okolo nicku v SQL dotazu - před vložením nicku do SQL z něj ořežte mezery a escapujte ho, jinak je funkčnost nejistá Máte povolené mezery v přezdívkách uživatelů? Pokud ne, tak by regulár měl vypadat spíš takhle: '@^(?:/kick)?\s+?([^/\s]+)@i' Pokud ano, tak by to chtělo změnit syntax toho příkazu, např. /kick "prezdivka s mezerou" nějaký další text
|
||
Str4wberry Profil |
#6 · Zasláno: 11. 4. 2013, 21:43:08
Případně by místo
switch e ty příkazy mohly být jednotlivé funkce:
function prikaz_kick($nick) { DB::query("DELETE FROM [:pref:chat] where nick = $nick"); } |
||
ShiraNai7 Profil |
Trošku jsem se do toho zažral, snad se v tom vyznáš :)
Funkce pro získání příkazu. Vrací pole s názvem příkazu a parametry nebo false , když se nejedná o příkaz.
Podporuje více parametrů a můžou být nepovinně v uvozovkách. function parseCommand($command) { if (1 === preg_match('~^/([a-z]+)(?: (.*))?$~', strval($command), $matches)) { $command = $matches[1]; $params = array(); if (isset($matches[2])) { preg_match_all('~"([^"]+)?"|([^\\s]+)~', $matches[2], $matches, PREG_SET_ORDER); for ($i = 0; isset($matches[$i]); ++$i) { if (isset($matches[$i][2])) { $params[] = $matches[$i][2]; } else { $params[] = $matches[$i][1]; } } } return array($command, $params); } else { return false; } } Ukázkové použití s funkcemi: function prikaz_kick($nick = '') { // ESCAPOVAT PRO POUZITI V DOTAZU! (napr mysql_real_escape_string($nick)) DB::query('DELETE FROM [:pref:chat] where nick = "' . $nick . '"'); } function prikaz_test() { echo "test: "; var_dump(func_get_args()); } if (isset($_POST['text'])) { // vyparsovat prikaz $prikaz = parseCommand($_POST['text']); if (false !== $prikaz) { // zaslany text je prikaz list($prikaz, $parametry) = $prikaz; // test funkce $funkce = 'prikaz_' . $prikaz; if (function_exists($funkce)) { call_user_func_array($funkce, $parametry); } } else { // nejedna se o prikaz } Ukázkové použití s $_POST['text'] a switchem.
if (isset($_POST['text'])) { // vyparsovat prikaz $prikaz = parseCommand($_POST['text']); if (false !== $prikaz) { // zaslany text je prikaz list($prikaz, $parametry) = $prikaz; // definovat vyzadovany pocet parametru pro jednotlive prikazy // nazev prikazu => pocet parametru $minParametru = array( 'kick' => 1, 'test' => 0, ); // zpracovat prikaz if (isset($minParametru[$prikaz])) { if (sizeof($parametry) >= $minParametru[$prikaz]) { switch ($prikaz) { // kick case 'kick': $nick = $parametry[1]; // ESCAPOVAT PRO POUZITI V DOTAZU! (napr mysql_real_escape_string($nick)) DB::query('DELETE FROM [:pref:chat] where nick = "' . $nick . '"'); break; // test case 'test': echo "prikaz = {$prikaz}, parametry = "; var_dump($parametry); break; } } else { // nedostatek parametru echo "Pro /{$prikaz} je vyzadovano alespon {$minParametru[$prikaz]} parametru!"; } } else { // neznamy prikaz echo "Neznamy prikaz!"; } } else { // nejedna se o prikaz } } |
||
Fisak Profil |
#8 · Zasláno: 11. 4. 2013, 22:51:52 · Upravil/a: Fisak
Děkuji moc :-) moc mi toto pomohlo..
ještě dotaz ... když bych chtěl z toho dle zjistit preg_match('@^(?:/kick)?\s+?([^/\s]+)@i', "/kick nick text", $mch); tak jak zjistim ten "text"?? Dobře takže mám problém... //podmínky chatu (administrace) if(preg_match('~^/([a-z]+)?\s+?([^/\s]+)(?: (.*))?$~', $_POST["text"], $matches)) { //vyčištění chatu if($matches[1] == "trash") { DB::query("DELETE FROM [:pref:chat]"); } } |
||
ShiraNai7 Profil |
#9 · Zasláno: 12. 4. 2013, 02:13:57
Fisak:
Použij tu funkci, co jsem tu psal. |
||
Časová prodleva: 11 let
|
0