| 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
switche 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: 13 let
|
|||
0