Kérdések és válaszok

Indította DoomKiller, 2010 augusztus 10, 06:46:54 DÉLUTÁN

Előző téma - Következő téma

NevemSenki

A ciklusos dolog megoldottá vált. Kimaradt az elejéről a DB választás.
Így van helyesen:

(Ezen kódban a 4. sor hiányzott [ mysql_select_db($charsdb); ] )

Kód (php) Kijelölés
while($ruha = mysql_fetch_array($ruhak_keres)){
echo $ruha['item'] . ' item<br/>' . $ruha['slot'] . ' slot<br />';

mysql_select_db($charsdb);
$itemid_keres = mysql_query("SELECT * FROM item_instance WHERE guid = '". $ruha['item'] ."'");
if(!$itemid_keres) { die("Hibás lekérdezés: (MYSQL): " . mysql_error()); }
$itemid_keres_array = mysql_fetch_array($itemid_keres);

echo $itemid_keres_array['itemEntry'] . ' item_entry<br/>';

mysql_select_db($worlddb);

$item_template_keres = mysql_query("SELECT * FROM item_template WHERE entry = '". $itemid_keres_array['itemEntry'] ."'");
$item_template_keres_tomb = mysql_fetch_array($item_template_keres);

mysql_select_db($weboldaldb);

echo $item_template_keres_tomb['displayid'] . ' display_id<br/>';

$ikon_keres = mysql_query("SELECT * FROM ikon WHERE displayid = '". $item_template_keres_tomb['displayid'] ."'");
$ikon_keres_tomb = mysql_fetch_array($ikon_keres);

echo $ikon_keres_tomb['icon'] . ' ikon_nev<br/><hr>';

}


Köszönöm a tooltip-et IrOn, hasznát fogom venni a későbbiekben. De sikerült működésre bírnom az eredeti scriptet. De nagyon köszönöm a segítséget!

Üdv.: Senki
Csak a Puffin ad neked erőt, és mindent lebíró akaratot!

NevemSenki

#316
Küzdöttem, de nem tudtam legyőzni ezt a lekérdezést.
Adott egy SQl SELECT amiben van like, limit, de viszont kéne még egy feltétel. Mondjuk entry != 50000.


Kód (php) Kijelölés
$npc_kereses_sql = "select * from creature_template where (name like '%" . str_replace( ' ', '%\' AND name LIKE \'%', $keresendo ) . '%\') LIMIT 200';

Na most ide kéne betenni az entry != 50000, de sehogy sem jó.
Így próbáltam:


Kód (php) Kijelölés
$npc_kereses_sql = "select * from creature_template where (name like '%" . str_replace( ' ', '%\' AND name LIKE \'%', $keresendo ) . '%\') and entry != 50000 LIMIT 20';

A limit működik, de a != az nem.
Ha nincs [ and ] akkor sem jó, ha a 50000-et [ ' ] vagy [ " ] közé teszem, úgy sem működik.
Várom az ötleteket, és előre is köszönöm a válaszokat.


Üdv.: Senki

FRISSÍTVE:

Semmi, működik, én voltam a hülye! Bocsánat.
A második megoldás tökéletes!

Üdv.: Senki
Csak a Puffin ad neked erőt, és mindent lebíró akaratot!

NevemSenki

#317
Újra én. Úgy néz ki hogy én tartom életben ezt a Topic-ot. :)

A kérdésem témája: PHP + HTMl + POSt + Jquery.
A felhasználoablak.php-t csinálom éppen ( karakterváltás ).
A lényege az, hogy többszörösen visszaellenőrzöm a felhasználót, hogy a karakter ténylegesen az övé-e.

Mutatnám magát a kódot, és a részleteket, és írnék egy kicsit:

Eddig a dolgot $_GET változókkal oldottam meg. De már mikor elkezdtem tudtam hogy ez nem egy jó megoldás.
Tudtam azt is hogy Jquery-vel kéne megoldani, csak az nekem nagyon bonyolult.

A teljes kódot Pastebinre tettem fel!

Teljes Kód

Ez Include-olva van, de csak akkor ha a felhasználó bejelentkezett!


Adott egy link + OnClick event:
Kód (php) Kijelölés
onclick="Core.karvaltas('<?php echo $karakter['name'];?>')"

Ez a rész kezeli le:

Kód (javascript) Kijelölés
/************************************
* Karakterváltás felhasználóablak *
************************************/
karvaltas: function(index1){

    $.post("",
    {
      nev: index1,
  Token: SenkiToken
    }

);
window.location.reload(true);

},


Na most, megadtam ugye az OnClick Event-ben a karakternevet, majd elPost-oltam a Token-el együtt.

Token:
Kód (HTML5) Kijelölés
<script type="text/javascript">
//<![CDATA[
var SenkiToken = '<? echo $_SESSION['n+j'];?>';
//]]>
</script>


A $_SESSION['n+j'] -ben tárolom el belépéskor a felhasználó név:jelszó SAH1 encode-olt formáját. Vagyis konkrétan a TrinityCore AUTH --> accoun --> sah_pass_hash értékét a megfelelő account-nál.

Amint láthattátok, csak vaktába Post-olok, mivel ezen PHP fájl, minden oldalon Include-olva van, és így át bírja venni a változót. Úgy gondoltam, kicsit bonyolítom, és jobban visszaellenőrzöm hogy ki, és mire akar váltani.

Ezért így oldottam meg:

Kód (php) Kijelölés
   if(isset($_POST['nev']) and isset($_SESSION['id']) and isset($_POST['Token'])){
   
   mysql_select_db($authdb);
   $ervenyes_e = mysql_query("SELECT username, sha_pass_hash FROM account WHERE username='".$_SESSION['username']."' AND sha_pass_hash='".$_POST['Token']."'");
   if(mysql_num_rows($ervenyes_e) == 1){
   
   mysql_select_db($charsdb);
   $kar_van_e = mysql_query("SELECT account, name FROM characters WHERE account='".$_SESSION['id']."' AND name='".$_POST['nev']."'");
   if(mysql_num_rows($kar_van_e) == 1){

   
   
   mysql_select_db($charsdb);
   $karaktervaltas_query = mysql_query("SELECT * FROM characters WHERE account='".$_SESSION['id']."' and name='".$_POST['nev']."'");
   $karaktervaltas_query_row = mysql_fetch_array($karaktervaltas_query);
   $karakterbok_karakterrace = $karaktervaltas_query_row['race'];
   $awatar_osszefuzes = $karakterbok_karakterrace.'-'.$karaktervaltas_query_row['gender'];
   // Update-elek a felhasználók táblába, hogy leváltsam a karaktert.
      mysql_select_db($weboldaldb);
   mysql_query("UPDATE felhasznalok SET avatar='$awatar_osszefuzes', karakternev='$karaktervaltas_query_row[name]', level='$karaktervaltas_query_row[level]', class='$karaktervaltas_query_row[class]', realm='$_SESSION[realmnev]' WHERE fiokid='$_SESSION[id]'");
   }}}


És a kód további részében, az UPDATE-elt `felhasznalok` táblából olvasom ki az adatokat.
Amit még nem említettem, a SenkiToken változó, a láblécben van elhelyezve.

Működőképes a konstrukció, de viszont a kérdés az, hogy szerintetek ez jó megoldás-e.
A másik pedig az, hogy ez a Jquery POSt megoldás mennyire állja meg a helyét. Mint láthattátok betettem a végére a    

window.location.reload(true);

parancsot. Nem tudom hogy működik-e a reload, vagy csak a POST miatt frissül az oldal. Mert van olyan eset, amikor rákattintok a kiválasztani kívánt karakterre, de nem cseréli le. Vagyis nem UPDATE-el az adatbázisba, de viszont kattintottam.

Várom az észrevételeket, megjegyzéseket, véleményeket.

Előre is köszönöm a válaszokat.

Üdv.: Senki

UPDATE

Itt egy videó hogy most miként váltja a karaktert, és látható a hiba is.

http://youtu.be/YuEwz9s1UlE


Üdv.: Senki
Csak a Puffin ad neked erőt, és mindent lebíró akaratot!

NevemSenki

#318
PhP Mail küldés, SMTP és barátai Locahost-ról Windows alatt.

Kód (php) Kijelölés
mail($to,$subject,$message,$header);

De mégis hogyan?
Ha valaki windows + localhost alatt megvalósította a dolgot, az írhatna pár szót.
Mondjuk úgy az elejétől a végéig hogy miként csinálta.

Előre is köszönöm.

Most csak én érzem így, vagy tényleg olyan kérdéseket teszek fel amihez senki nem akar hozzászólni? Vagy nincs senki aki érdemben hozzá tudna szólni?

Üdv.: Senki
Csak a Puffin ad neked erőt, és mindent lebíró akaratot!

AximCore

Idézetet írta: NevemSenki Dátum 2013 február 02, 01:16:30 DÉLUTÁN
PhP Mail küldés, SMTP és barátai Locahost-ról Windows alatt.

Kód (php) Kijelölés
mail($to,$subject,$message,$header);

De mégis hogyan?
Ha valaki windows + localhost alatt megvalósította a dolgot, az írhatna pár szót.
Mondjuk úgy az elejétől a végéig hogy miként csinálta.

Előre is köszönöm.

Most csak én érzem így, vagy tényleg olyan kérdéseket teszek fel amihez senki nem akar hozzászólni? Vagy nincs senki aki érdemben hozzá tudna szólni?

Üdv.: Senki

Nem inkább IMAP ? Amúgy ez hátha segít : http://www.devarticles.com/c/a/PHP/Create-Your-Own-Mail-Script-With-PHP-and-IMAP/1/
"Tanítani lehet az ostobát, de gondolkodásra bírni nem."
A Talmud

Windows Firewall
http://devopsreactions.tumblr.com/

Why use Windows, if you have open doors... to Linux

Avete

Sziasztok. Itt van ez a script és azt, hogy tudnám megoldani, hogy az item addolós résznél az itemet csak 1x adja oda a playernek tehát 1x odaadja a command az itemet és utána ha még1x beírná a commandot a player már ne adja oda még1x az itemet. Tegyük fel, hogy tokent szeretnék adni nem itemet és akkor azt az xy mennyiségű tokent csak 1x kapja meg a játékos akkor amikor legelőször beírja a commandot.#include "ScriptMgr.h"
#include "ObjectMgr.h"
#include "MapManager.h"
#include "Chat.h"
#include "Common.h"


class vipcommands : public CommandScript
{
public:
    vipcommands() : CommandScript("vipcommands") { }

    ChatCommand* GetCommands() const
    {
        static ChatCommand vipCommandTable[] =

        {
        { "list",           SEC_PLAYER,  true,  &HandleVipListFullCommand,      "", NULL },
        { "buffs",                      SEC_PLAYER,      false, &HandleBuffsCommand,    "", NULL },
        { "gear",                       SEC_PLAYER,      false, &HandleGearCommand,     "", NULL },
        { NULL,              0,                     false, NULL,                                           "", NULL }
        };
        static ChatCommand commandTable[] =
        {
        { "vip",            SEC_PLAYER,   true, NULL,      "",  vipCommandTable},
            { NULL,             0,                  false, NULL,                               "", NULL }
        };
        return commandTable;
    }




static bool HandleGearCommand(ChatHandler* handler, const char* args)
        {
                Player* player;
                Player* me = handler->GetSession()->GetPlayer();
                if (!me->AddItem(1122334, 1))
                {     
                        handler->GetSession()->SendNotification("Your inventory is full!");
                        return false;
                }
                else
                        me->AddItem(1919190, 1);
                        me->AddItem(1919191, 1);
                        me->AddItem(1919192, 1);
                        me->AddItem(1919193, 1);
                        me->AddItem(1919194, 1);
                        me->AddItem(1919195, 1);
                        return true;
                }

static bool HandleBuffsCommand(ChatHandler* handler, const char* args)
        {
                Player* player;
                Player* me = handler->GetSession()->GetPlayer();
                if(player->isInCombat())
                {
                        handler->GetSession()->SendNotification("You're in combat!");
                        return false;
                }
                me->CastSpell(me, 48162, 1);
                me->CastSpell(me, 48074, 1);
                me->CastSpell(me, 48170, 1);
                me->CastSpell(me, 43223, 1);
                me->CastSpell(me, 48934, 1);
                me->CastSpell(me, 48938, 1);
                me->CastSpell(me, 25899, 1);
                me->CastSpell(me, 36880, 1);
                me->CastSpell(me, 43015, 1);
                me->CastSpell(me, 43017, 1);
                me->CastSpell(me, 69381, 1);
                me->CastSpell(me, 467, 1);
                me->CastSpell(me, 69994, 1);
                me->CastSpell(me, 33077, 1);
                me->CastSpell(me, 33078, 1);
                me->CastSpell(me, 33080, 1);
                me->CastSpell(me, 33081, 1);
                me->CastSpell(me, 33082, 1);
                me->CastSpell(me, 24705, 1);
                me->CastSpell(me, 26035, 1);
                me->CastSpell(me, 48161, 1);
                me->CastSpell(me, 48073, 1);
                me->CastSpell(me, 48469, 1);
                me->CastSpell(me, 16609, 1);
                me->CastSpell(me, 15366, 1);
                return true;
        }

/// Display the list of GMs
static bool HandleVipListFullCommand(ChatHandler* handler, char const* /*args*/)
    {
        ///- Get the accounts with VIP Level >0
        QueryResult result = LoginDatabase.PQuery("SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel = 1 AND (aa.realmid = -1 OR aa.realmid = %u)", SEC_MODERATOR, realmID);
        if (result)
        {
            handler->SendSysMessage(LANG_GMLIST);
            handler->SendSysMessage("========================");
            ///- Cycle through them. Display username and VIP level
            do
            {
                Field* fields = result->Fetch();
                char const* name = fields[0].GetCString();
                uint8 security = fields[1].GetUInt8();
                uint8 max = (16 - strlen(name)) / 2;
                uint8 max2 = max;
                if ((max + max2 + strlen(name)) == 16)
                    max2 = max - 1;
                if (handler->GetSession())
                    handler->PSendSysMessage("|    %s VipLevel %u", name, security);
                else
                    handler->PSendSysMessage("|%*s%s%*s|   %u  |", max, " ", name, max2, " ", security);
            } while (result->NextRow());
            handler->SendSysMessage("========================");
        }
        else
            handler->PSendSysMessage(LANG_GMLIST_EMPTY);
        return true;
    }


};

void AddSC_vipcommands()
{
    new vipcommands();
}

NevemSenki

#321
Megoldottam az E-mail-es dolgot, most viszont szintén lenne egy érdekesség.

Encsi + Gem.

http://collab.kpsn.org/display/tc/Item+instance+tc2#Iteminstancetc2-enchantments

Ezen oszlop tárolja, a nálad lévő, azon belül a rajtad lévő itemeket, pontosabban az azon lévő encsiket, és benne lévő gem-eket.
Az már megoldott hogy el tudjam dönteni hogy a megadott szám gem vagy encsi, és az pontosan mit is ad... stb...

De a baj itt van, hogy ez a sor így néz ki ( Mikor egy új stat kerül az itemhez, + encsi vagy + gem, akkor az egyik '0' átváltozik egy számmá. És mit ne mondjak, TC nem sokat árul el erről az oszlopról. ):

Csak az oszlop tartalma:
Kód (mysql) Kijelölés
2604 0 0 0 0 0 2728 0 0 2735 0 0 0 0 0 2876 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Az egész sor tartalma:
Kód (mysql) Kijelölés
guid itemEntry owner_guid creatorGuid giftCreatorGuid count duration charges flags enchantments randomPropertyId durability playedTime text
307 30980 2 0 0 1 0 0 0 0 0 0 1 2604 0 0 0 0 0 2728 0 0 2735 0 0 0 0 0 2876 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 141


Ugye webről van szó, PHP pontosabban.

Hogyan tudnám kiválogatni, majd tömbként kezelni azon számokat ezen oszlopból, amik nagyobbak mint '0'?
Volt már str_replace... próbálkoztam már mindennel. Hogy én ebből össze tudjak hozni egy tömböt, az str_replace -vel nem megoldható.

Esetlegesen így meg tudnám, de ez így nem tömb, csak kiirt karakterek.
Kód (php) Kijelölés
$sz = '2604 0 0 0 0 0 2728 0 0 2735 0 0 0 0 0 2876 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ';

$csere = str_replace('0 ', ',', $sz);
echo 'array('.$csere.');';


Valakinek valami ötlete, hogy hogyan tudnám kiválogatni ezen oszlop tartalmából a 0-nál nagyobb számokat, és azokkal egyesével tovább dolgozni?

Üdv.: Senki

Frissítés!

Ez valami ördögi kör.... küzdök vele napok óta mint állat, és sehogy sem sikerült megoldanom. Miest beírom ide hogy segítséget kérjek, rá egy 20 percre sikerül megcsinálnom...

Itt a megoldás: http://php.net/manual/en/function.explode.php

És az előző kódom megoldása, hátha valakinek szüksége lesz rá. Olyan lett most ez a Post, mint egy kis példa. :)

Kód (php) Kijelölés
$sz = '2604 0 0 0 0 0 2728 0 0 2735 0 0 0 0 0 2876 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ';
$hello = explode(" ", $sz);

$i = 0;
while($e = $hello and $i < 37){
echo $e[$i].'<br />';

$i++;
}


Így, már ténylegesen tömbként lehet kezelni.

Üdv.: Senki
Csak a Puffin ad neked erőt, és mindent lebíró akaratot!

NevemSenki

Olyat mutatok, amit szerintem még ti sem láttatok. Most vagy nagyon benézek valamit, vagy meghülyültem....

Adott ez a kis PHP kód:

Kód (php) Kijelölés

mysql_connect( 'localhost', 'root', 'xxxxx' );
$weboldaldb = "website"; // Weboldalhoz tartozó adatbázis

mysql_select_db($weboldaldb);
$user = mysql_num_rows(mysql_query("SELECT * FROM online"));
echo $user;

mysql_close();


Online tábla:

Kód (mysql) Kijelölés
create table `online` (
`ses` char ,
`ido` int
);


Megnyitom a fenti PHP-t, és frissítéskor minden alkalommal beszúr egy új sort az adatbázisba.
Megmutatom videó formájában is....

http://youtu.be/HBKjvuJRqpc

Erre mi a magyarázat? Mert biztosan van...

Üdv.: Senki
Csak a Puffin ad neked erőt, és mindent lebíró akaratot!

Armin

#323
A videó nem indul el, de ennek ellenére érdekes, hogy INSERT nélkül felvisz bármit is  ;D

Szerk: Már megy a vidi.

NevemSenki

Most nézd, most már jó a videó.

Üdv.: Senki
Csak a Puffin ad neked erőt, és mindent lebíró akaratot!

Armin

#325
Hát egész érdekes  ;D
Ez most a weboldalon bejelentkezett felhasználókat mutatná, vagy azokat, akik a szerveren fent vannak?

NevemSenki

Ezek a későbbiekben az oldalon tartózkodó felhasználókat, majd ha be vannak jelentkezve akkor kiírná a nevüket is. Valami hasonló lenne, mint ezen a fórumon is van.

Üdv.: Senki
Csak a Puffin ad neked erőt, és mindent lebíró akaratot!

Armin

Esetleg ott lehet még a gond, hogy ahányszor betöltődik az oldal, akkor azt úgy értelmezi, hogy online valaki.

NevemSenki

Kipakoltam belőle mindent, csak az a PHP kód van benne mint ami lentebb látható. És így is. Pedig csak SELECT van. Se require_once, se include, se semmi. Csak az a kopasz kód van mint ami lentebb.
Ezt lehet látni a videóban is.

Üdv.: Senki
Csak a Puffin ad neked erőt, és mindent lebíró akaratot!

Armin

Akkor ezt a kérdést passzolom  ;D

Powered by EzPortal