Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] [sql] czytanie tabeli przez skrypt php
Forum PHP.pl > Forum > Przedszkole
BCMU
Na początku chciałbym powitać całą społeczność forum php.pl.

Otóż mój problem polega na tym, iż chcę zmodyfikować moduł do mojej strony internetowej tak, by po wykonaniu operacji tego modułu został dodatkowo dodany wpis do kolumny w wybranej tabeli. Jest to skrypt resetu postaci w grze MuOnline, gdzie to postać po osiągnięciu maksymalnego poziomu może wykonać tzw reset czyli zresetować statystyki + bonus statystyk za reset. Chciałbym by ten skrypt dodawał "kredyty" (waluta do webshopa, gdzie gracz może sobie kupić przedmioty) za każdym razem kiedy zrobi reset- a konkretnie 25 kredytów za reset.

Oto część kodu modułu reset_character, o którym mowa:
Kod

$load_reset_settings = simplexml_load_file('engine/config_mods/reset_character_settings.xml');
$active              = trim($load_reset_settings->active);
if ($active == '0') {
    echo msg('0', text_sorry_feature_disabled);
} else {
    $reset_level          = trim($load_reset_settings->level);
    $reset_zen            = trim($load_reset_settings->zen);
    $reset_points         = trim($load_reset_settings->bpoints);
    $reset_points_formula = trim($load_reset_settings->bpoints_formula);
    $reset_clear_skills   = trim($load_reset_settings->clear_skills);
    $reset_clear_inv      = trim($load_reset_settings->clear_inv);
    $reset_stats          = trim($load_reset_settings->reset_stats);
    $reset_limit          = trim($load_reset_settings->reset_limit);
    
    if (isset($_GET['rid'])) {
        echo '<div style="margin-top: 10px;">';
        $id = safe_input($_GET['rid'], '');
        if (empty($id) || !is_numeric($id)) {
            header('Location: ' . $core_run_script . '');
            exit();
        } else {
            if (character_and_account($id, $user_auth_id) === false) {
                header('Location: ' . $core_run_script . '');
                exit();
            } else {
                if (account_online($user_auth_id) === true) {
                    echo msg('0', text_resetcharacter_t1);
                } else {
                    $select_req = $core_db->Execute("select clevel,money,resetcount,leveluppoint from character where mu_id=? and accountid=?", array(
                        $id,
                        $user_auth_id
                    ));
                    if ($select_req->fields[0] < $reset_level) {
                        echo msg('0', str_replace("{levels}", ($reset_level - $select_req->fields[0]), text_resetcharacter_t2));
                        $no_reset = 1;
                    }
                    if ($select_req->fields[1] < $reset_zen) {
                        echo msg('0', str_replace("{zen}", number_format($reset_zen - $select_req->fields[1]), text_resetcharacter_t3));
                        $no_reset = 1;
                    }
                    if ($select_req->fields[2] >= $reset_limit) {
                        echo msg('0', str_replace("{resets_limit}", number_format($reset_limit), text_resetcharacter_t4));
                        $no_reset = 1;
                    }
                    if ($no_reset != '1') {
                        $new_money = $select_req->fields[1] - $reset_zen;
                        switch ($reset_points_formula) {
                            case '0':
                                $new_bpoints = ($select_req->fields[3] + $reset_points);
                                break;
                            case '1':
                                $new_bpoints = ($reset_points * ($select_req->fields[2] + 1));
                                break;
                        }
                        switch ($reset_stats) {
                            case '1':
                                if ($reset_clear_inv == '1' and $reset_clear_skills == '1') {
                                    $reset_formula = "Update character set [resetcount]=(resetcount+1),[clevel]='1',[experience]='0',[leveluppoint]=?,[money]=?,[strength]='25',[dexterity]='25',[vitality]='25',[energy]='25',[Leadership]='25',[MapNumber]='0',[MapPosX]='150',[MapPosY]='140',[inventory]=CONVERT(varbinary(1080), null),[magiclist]=CONVERT(varbinary(180), null) where mu_id=?";
                                } elseif ($reset_clear_inv == '1') {
                                    $reset_formula = "Update character set [resetcount]=(resetcount+1),[clevel]='1',[experience]='0',[leveluppoint]=?,[money]=?,[strength]='25',[dexterity]='25',[vitality]='25',[energy]='25',[Leadership]='25',[MapNumber]='0',[MapPosX]='150',[MapPosY]='140',[inventory]=CONVERT(varbinary(1080), null) where mu_id=?";
                                } elseif ($reset_clear_skills == '1') {
                                    $reset_formula = "Update character set [resetcount]=(resetcount+1),[clevel]='1',[experience]='0',[leveluppoint]=?,[money]=?,[strength]='25',[dexterity]='25',[vitality]='25',[energy]='25',[Leadership]='25',[MapNumber]='0',[MapPosX]='150',[MapPosY]='140',[magiclist]=CONVERT(varbinary(180), null) where mu_id=?";
                                } elseif ($reset_clear_inv == '0' and $reset_clear_skills == '0') {
                                    $reset_formula = "Update character set [resetcount]=(resetcount+1),[clevel]='1',[experience]='0',[leveluppoint]=?,[money]=?,[strength]='25',[dexterity]='25',[vitality]='25',[energy]='25',[Leadership]='25',[MapNumber]='0',[MapPosX]='150',[MapPosY]='140' where mu_id=?";
                                }
                                break;
                            case '0':
                                if ($reset_clear_inv == '1' and $reset_clear_skills == '1') {
                                    $reset_formula = "Update character set [resetcount]=(resetcount+1),[clevel]='1',[experience]='0',[leveluppoint]=?,[money]=?,[inventory]=CONVERT(varbinary(1080), null),[magiclist]=CONVERT(varbinary(180), null) where mu_id=?";
                                } elseif ($reset_clear_inv == '1') {
                                    $reset_formula = "Update character set [resetcount]=(resetcount+1),[clevel]='1',[experience]='0',[leveluppoint]=?,[money]=?,[inventory]=CONVERT(varbinary(1080), null) where mu_id=?";
                                } elseif ($reset_clear_skills == '1') {
                                    $reset_formula = "Update character set [resetcount]=(resetcount+1),[clevel]='1',[experience]='0',[leveluppoint]=?,[money]=?,[magiclist]=CONVERT(varbinary(180), null) where mu_id=?";
                                } elseif ($reset_clear_inv == '0' and $reset_clear_skills == '0') {
                                    $reset_formula = "Update character set [resetcount]=(resetcount+1),[clevel]='1',[experience]='0',[leveluppoint]=?,[money]=? where mu_id=?";
                                }
                                break;
                        }


Ten kod już czyta jedną tabelę i ją aktualizuje ale chciałbym dodać by czytał i aktualizował jeszcze jedną.

Tabela z kredytami nosi nazwę MEMB_CREDITS a kolumna, którą ma aktualizować o 25 za każdy reset to kolumna "credits". Wszystko byłoby fajnie gdyby nie to, że skrypt musi wiedzieć komu dodać te kredyty a kolumna, która to definiuje to "memb___id" - ta sama kolumna jest w tabeli MEMB_STAT, gdzie każde konto ma swoje id.

Kod, który znalazłem w necie, zmodyfikowałem i próbuję dodać to:

Kod
Update character set [resetcount]=(resetcount+1),[clevel]='1',[experience]='0',[leveluppoint]=?,[money]=?,[strength]='25',[dexterity]='25',[vitality]='25',[energy]='25',[Leadership]='25',[MapNumber]='0',[MapPosX]='150',[MapPosY]='140' where mu_id=?; ---- to jest bazowo w module a ja dodaję jedynie kolejne polecenie:
                    UPDATE MEMB_CREDITS SET [credits]=(credits+25) FROM MEMB_CREDITS JOIN MEMB_STAT ON MEMB_CREDITS.memb___id = MEMB_STAT.memb___id COLLATE Latin1_general_CI_AI WHERE [ConnectStat]='0'";


Proszę o wskazówki, co w kodzie dodanym przeze mnie jest nie tak, bo cały skrypt się nie uruchamia.



EDIT:


Ok udało mi się doprowadzić skrypt do ładu i się wykonuje, ale.. z tym kodem dodaje kredyty nie tylko dla konta, na którym postać się resetuje ale także innym. Co teraz?

Tutaj kod który dodałem:
Kod
$reset_formula = "Update character set [resetcount]=(resetcount+1),[clevel]='400',[experience]='0',[leveluppoint]=?,[money]=?,[strength]='25',[dexterity]='25',[vitality]='25',[energy]='25',[Leadership]='25',[MapNumber]='0',[MapPosX]='150',[MapPosY]='140' where mu_id=?;";
$reset_formula.= "UPDATE MEMB_CREDITS SET [credits]=(credits+25) FROM MEMB_CREDITS JOIN MEMB_STAT ON MEMB_CREDITS.memb___id = MEMB_STAT.memb___id COLLATE Latin1_general_CI_AI WHERE ConnectStat='0';";


W tym przypadku kredyt dostaje konto, na którym jest reset i jeszcze jedno, które nie bierze w niczym udziału(?).

Proszę o pomoc.
Rysh
  1. WHERE mu_id=?
BCMU
Dziękuję za odpowiedź.

Czyli skrypt powinien wyglądać tak?:

Kod
$reset_formula.= "UPDATE MEMB_CREDITS SET [credits]=(credits+25) FROM MEMB_CREDITS JOIN MEMB_STAT ON MEMB_CREDITS.memb___id = MEMB_STAT.memb___id COLLATE Latin1_general_CI_AI WHERE ConnectStat='0 WHERE mu_id=?';";


edit:
Po dodaniu tego tak jak powyżej- skrypt się nie wykonuje (tzn wykonuje się reset ale brak kredytów).
Usunąłem where connectstat i na to miejsce dałem where mu_id ale również bez zmian.

Wydaje mi się, że problem w tym momencie jest taki że zapytanie where mu_id jest w kontekście do tabeli MEMB_CREDITS, gdzie nie ma kolumny mu_id.
Rysh
Nie sądzę, aby zapis 2x WHERE był poprawny w MSSQL - szybciej WHERE connectstat=0 AND mu_id=?
BCMU
I tak i tak nie działa skrypt..
Terrorizer
Korzystając z okazji, chciałbym serdecznie pozdrowić wszystkich uzależnionych od MuOnline biggrin.gif
Rysh
Cytat(BCMU @ 16.03.2016, 22:29:03 ) *
I tak i tak nie działa skrypt..

Jeśli nie działa, powiedz jaki komunikat zwraca to zapytanie. Będzie łatwiej.
Cytat(Terrorizer @ 16.03.2016, 22:36:58 ) *
Korzystając z okazji, chciałbym serdecznie pozdrowić wszystkich uzależnionych od MuOnline biggrin.gif

Również pozdrawiam, chociaż dawno nie grałem smile.gif
BCMU
Nie zwraca niczego poza błędem ogólnym z mucore (aplikacji webowej do muo) czyli unable to reset coś tam coś tam..

Również pozdrawiam starych wyjadaczy MuO smile.gif

Może byłoby lepiej gdybyśmy porozmawiali na przykład na gg lub skype.

Wydaje mi się, że kiedy dodaję WHERE mu_id=? to skrypt szuka kolumny mu_id w tabeli MEMB_CREDITS, której tam nie ma..


Skrypt musi wiedzieć dla jakiego konta dodać kredyty. Myślę, że albo sobie to "weźmie" szukając po postaci, która się resetuje bądź po prostu po loginie (accountid) - dodam, że accountid czyli login do gry to jest również login na stronkę do panelu konta.

Jestem totalnym laikiem jeśli chodzi o php a z sql jak widać też nie za dobrze..
Pomocy smile.gif


Edit:

Rozwiązałem problem!
Dodałem skrypt:
Kod
$name = $_SESSION['user_auth_id'];
                    $credit = mssql_query("Select Credits from MEMB_CREDITS where memb___id='$name'");
                    $cr = mssql_fetch_row($credit);
                    mssql_query("Update MEMB_CREDITS set Credits=(Credits+15) where memb___id='$name'");


Dziękuję wszystkim za pomoc smile.gif
Pozdrawiam!

Korzystając z okazji wszystkich entuzjastów MuOnline zapraszam na swój serwer VulcanMU.
http://vulcanmu.pl

Zapraszam smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.