Balkan SA:MP

San Andreas Multiplayer - www.sa-mp.com => Tutorijali u vezi SA-MPa => Temu započeo: LuKsA poslato Avgust 28, 2010, 11:44:38 PRE PODNE

Naslov: [TuT] Izrada MYSQL Systema
Poruka od: LuKsA poslato Avgust 28, 2010, 11:44:38 PRE PODNE
Izrada MYSQL Systema! by: [HiC]TheKiller

Sta je potrebno?

     
Napomena: Ovaj tutorial je za malo bolje skriptere, ukoliko se ne smatrate time, nemojte niti pocet radit.. Takoder zahtijeva dosta dobro poznavanje HTML | PHP i CSSa

Koraci

#1

Napocetku, treba pokrenuti WAMP server i MYSQL plugin, kada ste zavrsili krenite na #2 korak.

#2

Sada kada je WAMP i MYSQL plugin slozen, sada mozemo poceti praviti MYSQL System.

#include <a_samp>
#include <a_mysql>
//DCMD - za register i login komandu
#define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
//WAMP
#define SQL_HOST "localhost" //WAMP host, ako je externi, promjenite ovo
#define SQL_USER "root" //WAMP User
#define SQL_PASS "" //WAMP PW(default - nema PWa)
#define SQL_DB "sa-mp" //Databazu koju ste kreirali(kasnije u koracima)
#define mysql_fetch_row(%1) mysql_fetch_row_format(%1,"|")


public OnGameModeInit()
{
    if(!mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS))
    {
        print("SQL connection attempt 1 FAILED!");
        if(!mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS))
        {
            print("SQL connection attempt 2 FAILED!");
            if(!mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS))
            {
                print("SQL connection attempt 3 FAILED!");
                return 1;
            }
        }
    }
    return 1;
}


public OnPlayerConnect(playerid)
{
    new Query[200], Pname[24]; //Kreira Query i Pname
    GetPlayerName(playerid, Pname, 24); //Uzima igracevo ime
    format(Query, sizeof(Query), "SELECT * FROM `playerinfo` WHERE `user` = '%s'", Pname); //Selektira liniju gdje 'playername' je igrac
    mysql_query(Query);
    mysql_store_result();
    if(mysql_num_rows() != 0) //Ako je igrac pronaden
    {
        new PIP[56]; //Kreira IP String
        GetPlayerIp(playerid, PIP, 56); //Uzima igracev IP
        format(Query, sizeof(Query), "SELECT * FROM `playerinfo` WHERE `user` = '%s' AND `IP` = '%s'", Pname, PIP); //Gleda dali je IP igraca isti kao i prosle konekcije, ako je = autologin
        mysql_query(Query);
        mysql_store_result();
        if(mysql_num_rows() != 0) // Ako je igracev IP isti ko i prosle konekcije
        {
            new line[750];
            SetPVarInt(playerid, "Logged", 1); //Stavlja igracu da je logiran
            SendClientMessage(playerid, 0x009600AA, "Automatski ste Logirani!");
            if(mysql_fetch_row(line))
            {
                   new data[3][50]; //Data stringovi
                   new data2[4]; //Data varijable
                   sscanf(line, "p|ssdddds", data[0], data[1], data2[0], data2[1], data2[2], data2[3], data[2]); //Razdvojava linije pomocu sscanfa
                   SetPVarInt(playerid, "Kills", data2[0]); //Stavlja Pvarove
                   SetPVarInt(playerid, "Logged", 1); //Stavlja Pvarove
                   SetPVarInt(playerid, "Deaths", data2[1]); //Stavlja Pvarove
                   SetPlayerScore(playerid, data2[2]); //Stavlja igracev Score
                   GivePlayerMoney(playerid, data2[3]); //Stavlja igracu novac
                   mysql_free_result();
               }
        }
        if(!mysql_num_rows())
        {
            SendClientMessage(playerid, 0x009600AA, "Ovaj korisnicki racun je registriran, molimo logirajte se"); //Igrac je vec registriran, ali se IP ne podudara s proslom konekcijom
            ShowPlayerDialog(playerid, 15000, DIALOG_STYLE_INPUT , "Login", "Ovaj korisnicki racun je registriran, molimo logirajte se", "OK", "Izlaz");
        }
    }
    else
    {
        ShowPlayerDialog(playerid, 14600, DIALOG_STYLE_INPUT , "Registracija", "Ovaj korisnicki Racun nije registriran, molimo registrirajte se!", "OK", "Izlaz");
        SendClientMessage(playerid, 0x009600AA, "Ovaj korisnicki racun nije registriran, registirajte se!"); //Igrac nije registriran
    }
    mysql_free_result();
    return 1;
}


public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 14600)
    {
       if(response)
       {
            if(!strlen(inputtext)) //Ako igrac nije unesio PW
            {
                ShowPlayerDialog(playerid, 14600, DIALOG_STYLE_INPUT , "Registracija", "Ovaj korisnicki racun nije registriran, registrirajte se!", "OK", "Izlaz");
                SendClientMessage(playerid, 0xF60000AA, "Molimo unesite PW.");
            }
            new PIP[50];
            new Query[200], Pname[24];
            GetPlayerName(playerid, Pname, 24); //Igracevo ime
            GetPlayerIp(playerid, PIP, 50); //Igracev IP
            format(Query, sizeof(Query), "INSERT INTO `playerinfo` (`user`, `password`, `kills`, `deaths`, `score`, `money`, IP) VALUES ('%s', '%s', 0, 0, 0, 0, '%s')", Pname, inputtext, PIP); //Unosava string
            mysql_query(Query);
            GameTextForPlayer(playerid, "~g~Registrirani", 2000, 3);
            SendClientMessage(playerid, 0x0000D9AA, "Vi ste registrirani i logirani na svoj korisnicki racun!");
            SetPVarInt(playerid, "Logged", 1);
        }
    }
    if(dialogid == 15000)
    {
       if(response)
       {
           new Query[200], Pname[24];
           GetPlayerName(playerid, Pname, 24);
           format(Query, sizeof(Query), "SELECT * FROM `playerinfo` WHERE `user` = '%s' AND `password` = '%s'", Pname, inputtext);
           mysql_query(Query);
           mysql_store_result();
           if(!mysql_num_rows())
           {
               SendClientMessage(playerid, 0xF60000AA, "Pogresna lozinka!");
               SetPVarInt(playerid, "WrongPass", GetPVarInt(playerid, "WrongPass") + 1);
               ShowPlayerDialog(playerid, 15000, DIALOG_STYLE_INPUT , "Login", "Ovaj korisnicki racun je registriran, molimo logirajte se", "OK", "Izlaz");
               if(GetPVarInt(playerid, "WrongPass") == 3)
               {
                   SendClientMessage(playerid, 0xF60000AA, "Izbaceni ste, jer ste pogrijesili PW 3 puta!!");
                   Kick(playerid);
               }
           }
           else
           {
               new line[750];
               if(mysql_fetch_row(line))
               {
                   new data[3][50]; //Data string
                   new data2[4]; //Data varijable
                   sscanf(line, "p|ssdddds", data[0], data[1], data2[0], data2[1], data2[2], data2[3], data[2]); //Razdvojava liniju putem sscanfa
                   SetPVarInt(playerid, "Kills", data2[0]); //Stavlja Pvar
                   SetPVarInt(playerid, "Logged", 1); //Stavlja Pvar
                   SetPVarInt(playerid, "Deaths", data2[1]); //Stavlja Pvar
                   SetPlayerScore(playerid, data2[2]); //Stavlja igracev Score
                   SetPVarInt(playerid, "MoneyGiven", data2[3]); //Stavlja igracu novac
                   SendClientMessage(playerid, 0x0000D9AA, "Logirani ste!");
                   mysql_free_result();
               }
           }
       }
    }
    return 1;
}


public OnPlayerRequestSpawn(playerid)
{
    if(GetPVarInt(playerid, "Logged") == 0)
    {
        new Query[200], Pname[24]; //Varijable
        GetPlayerName(playerid, Pname, 24); //Uzima igracevo ime
        format(Query, sizeof(Query), "SELECT * FROM `playerinfo` WHERE `user` = '%s'" , Pname); //MySQL string
        mysql_query(Query);
        mysql_store_result();
        if(!mysql_num_rows()) ShowPlayerDialog(playerid, 14600, DIALOG_STYLE_INPUT , "Registracija", "Ovaj korisnicki racun nije registriran, registrirajte se!", "OK", "Izlaz"); //Ako igrac nije registriran, prikazuje Dialog
        else ShowPlayerDialog(playerid, 15000, DIALOG_STYLE_INPUT , "Login", "Ovaj korisnicki racun je registriran, logirajte se", "OK", "Izlaz"); //Ako je igrac registriran, prikazuje dialog za login
        return 0;
    }
    return 1;
}


public OnPlayerSpawn(playerid)
{
    if(GetPVarInt(playerid, "Logged") == 1 && GetPVarInt(playerid, "MoneyGiven") > 0)
    {
        GivePlayerMoney(playerid, GetPVarInt(playerid, "MoneyGiven"));
        SetPVarInt(playerid, "MoneyGiven", 0);
    }
    return 1;
}


public OnPlayerDeath(playerid, killerid, reason)
{
    SetPVarInt(playerid, "Deaths", GetPVarInt(playerid, "Deaths") + 1); //Stavlja smrti igracu +1 koji je umro(playerid)
    if(killerid != INVALID_PLAYER_ID) SetPVarInt(playerid, "Kills", GetPVarInt(playerid, "Kills") + 1); // Dodaje kill igracu koji je ubio +1 (killerid)
    return 1;
}


public OnPlayerDisconnect(playerid, reason)
{
    if(GetPVarInt(playerid, "Logged") == 1) //Samo ako je igrac bio logiran
    {
        new query[300]; //Varijable
        new Pname[24]; //Varijable
        GetPlayerName(playerid, Pname, 24); //Uzima igracevo ime
        format(query, sizeof(query), "UPDATE `playerinfo` SET `score` = '%d',`money` = '%d', `kills` = '%d', `deaths` = '%d'  WHERE `user` = '%s'", GetPlayerScore(playerid), GetPlayerMoney(playerid), GetPVarInt(playerid, "Kills"), GetPVarInt(playerid, "Deaths"), Pname); //Uzima info igraca
        mysql_query(query);
        mysql_free_result();
    }
    return 1;
}


stock sscanf(string[], format[], {Float,_}:...)
{
    #if defined isnull
        if (isnull(string))
    #else
        if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    #endif
        {
            return format[0];
        }
    #pragma tabsize 4
    new
        formatPos = 0,
        stringPos = 0,
        paramPos = 2,
        paramCount = numargs(),
        delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ')
    {
        stringPos++;
    }
    while (paramPos < paramCount && string[stringPos])
    {
        switch (format[formatPos++])
        {
            case '\0':
            {
                return 0;
            }
            case 'i', 'd':
            {
                new
                    neg = 1,
                    num = 0,
                    ch = string[stringPos];
                if (ch == '-')
                {
                    neg = -1;
                    ch = string[++stringPos];
                }
                do
                {
                    stringPos++;
                    if ('0' <= ch <= '9')
                    {
                        num = (num * 10) + (ch - '0');
                    }
                    else
                    {
                        return -1;
                    }
                }
                while ((ch = string[stringPos]) > ' ' && ch != delim);
                setarg(paramPos, 0, num * neg);
            }
            case 'h', 'x':
            {
                new
                    num = 0,
                    ch = string[stringPos];
                do
                {
                    stringPos++;
                    switch (ch)
                    {
                        case 'x', 'X':
                        {
                            num = 0;
                            continue;
                        }
                        case '0' .. '9':
                        {
                            num = (num << 4) | (ch - '0');
                        }
                        case 'a' .. 'f':
                        {
                            num = (num << 4) | (ch - ('a' - 10));
                        }
                        case 'A' .. 'F':
                        {
                            num = (num << 4) | (ch - ('A' - 10));
                        }
                        default:
                        {
                            return -1;
                        }
                    }
                }
                while ((ch = string[stringPos]) > ' ' && ch != delim);
                setarg(paramPos, 0, num);
            }
            case 'c':
            {
                setarg(paramPos, 0, string[stringPos++]);
            }
            case 'f':
            {

                new changestr[16], changepos = 0, strpos = stringPos;   
                while(changepos < 16 && string[strpos] && string[strpos] != delim)
                {
                    changestr[changepos++] = string[strpos++];
                    }
                changestr[changepos] = '\0';
                setarg(paramPos,0,_:floatstr(changestr));
            }
            case 'p':
            {
                delim = format[formatPos++];
                continue;
            }
            case '\'':
            {
                new
                    end = formatPos - 1,
                    ch;
                while ((ch = format[++end]) && ch != '\'') {}
                if (!ch)
                {
                    return -1;
                }
                format[end] = '\0';
                if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
                {
                    if (format[end + 1])
                    {
                        return -1;
                    }
                    return 0;
                }
                format[end] = '\'';
                stringPos = ch + (end - formatPos);
                formatPos = end + 1;
            }
            case 'u':
            {
                new
                    end = stringPos - 1,
                    id = 0,
                    bool:num = true,
                    ch;
                while ((ch = string[++end]) && ch != delim)
                {
                    if (num)
                    {
                        if ('0' <= ch <= '9')
                        {
                            id = (id * 10) + (ch - '0');
                        }
                        else
                        {
                            num = false;
                        }
                    }
                }
                if (num && IsPlayerConnected(id))
                {
                    setarg(paramPos, 0, id);
                }
                else
                {
                    #if !defined foreach
                        #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
                        #define __SSCANF_FOREACH__
                    #endif
                    string[end] = '\0';
                    num = false;
                    new
                        name[MAX_PLAYER_NAME];
                    id = end - stringPos;
                    foreach (Player, playerid)
                    {
                        GetPlayerName(playerid, name, sizeof (name));
                        if (!strcmp(name, string[stringPos], true, id))
                        {
                            setarg(paramPos, 0, playerid);
                            num = true;
                            break;
                        }
                    }
                    if (!num)
                    {
                        setarg(paramPos, 0, INVALID_PLAYER_ID);
                    }
                    string[end] = ch;
                    #if defined __SSCANF_FOREACH__
                        #undef foreach
                        #undef __SSCANF_FOREACH__
                    #endif
                }
                stringPos = end;
            }
            case 's', 'z':
            {
                new
                    i = 0,
                    ch;
                if (format[formatPos])
                {
                    while ((ch = string[stringPos++]) && ch != delim)
                    {
                        setarg(paramPos, i++, ch);
                    }
                    if (!i)
                    {
                        return -1;
                    }
                }
                else
                {
                    while ((ch = string[stringPos++]))
                    {
                        setarg(paramPos, i++, ch);
                    }
                }
                stringPos--;
                setarg(paramPos, i, '\0');
            }
            default:
            {
                continue;
            }
        }
        while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
        {
            stringPos++;
        }
        while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
        {
            stringPos++;
        }
        paramPos++;
    }
    do
    {
        if ((delim = format[formatPos++]) > ' ')
        {
            if (delim == '\'')
            {
                while ((delim = format[formatPos++]) && delim != '\'') {}
            }
            else if (delim != 'z')
            {
                return delim;
            }
        }
    }
    while (delim > ' ');
    return 0;
}


#3

Postavljanje PhpMyAdmin-a je korak 3.

1. Idite u MYSQL stranicu

     
2. Pronadite i napravite novu databazu imena sa-mp.

3. Pronadite gdje pise "Create new table on database sa-mp" i napisite "playerinfo" sa 7 polja(field)

4. Unesite sljedece informacije u svaku liniju

1 linija:
Field - user
Type - varchar
Length - 24

2 linija:
Field - password
Type - varchar
Length - 24

3 linija:
Field - kills
Type - int
Length - 11

4 linija:
Field - deaths
Type - int
Length - 11

5 linija:
Field - score
Type - int
Length - 11

6 linija:
Field - money
Type - int
Length - 11

7 linija:
Field - IP
Type - varchar
Length - 50

5. Pritisnite Save gumb(Spremi)

#4

Pravljenje websitea, UCP-a(User Control Panel) u PHPu

File: database.php
Info: Ovo je prvi file koji trebate imati da bi se Web spojio na MYSQL databazu i koji bude includan(ubacen) u vecinu vasih web stranica UCPa.

<?php$con = mysql_connect("localhost","root","");mysql_select_db("sa-mp");//Ako koristite externi(tj. server negdje na web stranici, a ne na vasem compu) onda ne zaboravite promjeniti: (mysql_connect(server[],user[],pass[]);?>


File: index.php
Info: Prva web stranica na koju ide igrac

<html>
<body>
<form action="Logged.php" method="post">
<b><font size="4" color="#000080">Dobrodosli na UCP</font></b>
<p>Ime_Prezime <input type="text" name="User" size="20" /> </p>
<p>Lozinka&nbsp; <input type="password" name="Password" size="20" /></p>
<p>&nbsp;<input type="submit" />
<input type="reset" /> </p>
<p>Molimo logirajte se</p>
</form>
</body>
</html>


File: Logged.php
Info: Nakon sto se igrac ulogira, bit ce ovdje redirektan(prebacen).

<?phpinclude("database.php");session_start();if (!$con)  {  die('Could not connect: ' . mysql_error());  }  if(isset($_SESSION["Username"]))  {    $user = $_SESSION["Username"];    $pass = $_SESSION["Password"];  }  else  {    $user = $_POST["User"];     $pass = $_POST["Password"];    $_SESSION['Username'] = $user;    $_SESSION['Password'] = $pass;  }  $query = "SELECT * FROM playerinfo WHERE user = '$user'";  $result = mysql_query($query);  $username_exist = mysql_num_rows($result);  if($username_exist == 0)  {    echo('Taj nick ne postoji');    echo '<a href="index.php"">Natrag</a>';    unset($_SESSION['Username']);    unset($_SESSION['Password']);    die;  }    $row = mysql_fetch_row($result);  if($row[1] !== $pass)  {    echo('Kriva lozinka!');    echo '<a href="index.php"">Natrag</a>';    unset($_SESSION['Username']);    unset($_SESSION['Password']);  }  $str = '<b><font size="4" color="#000080"> Dobrodosli na UCP! </font></b>';  echo $str;  echo "<table>";  echo "  <tr>  <td>Nick:</td>  <td>$row[0]</td>  </tr>";  echo "  <tr>  <td>Ubojstva:</td>  <td>$row[2]</td>  </tr>";  echo "  <tr>  <td>Smrti:</td>  <td>$row[3]</td>  </tr>";  echo "  <tr>  <td>Skor:</td>  <td>$row[4]</td>  </tr>";    echo "  <tr>  <td>Novac:</td>  <td> $$row[5]</td>  </tr>";  echo "</table>";  echo '<a href="NewPassword.php"">Promijena Lozinke</a>';  echo '<p><a href="Stats.php"">Pogledajte statistike igraca</a></p>'?>


File: NewPassword.php
Info: Ovo je gdje igrac mjenja svoj PW.

<html>
<body>
<form action="Newpass.php" method="post">
<b><font size="4" color="#000080">Promijena lozinke! </font></b>
<p>Stara lozinka <input type="password" name="P1" size="20" /> </p>
<p>Nova lozinka &nbsp; <input type="password" name="P2" size="20" /></p>
<p>Potvrda nove lozinke &nbsp; <input type="password" name="P3" size="20" /></p>
<p>&nbsp;<input type="submit" />
<input type="reset" /> </p>
<a href="Logged.php"">Natrag</a>
</form>
</body>
</html>


File: Newpass.php
Info: Provijerava dal je sve uredu u newpassword-u.

<?phpsession_start();$pass1 = $_POST["P1"];$pass2 = $_POST["P2"];$pass3 = $_POST["P3"];$user = $_SESSION['Username'];if(!isset($_SESSION['Username'])){    echo('Ulogirani ste!');    echo '<a href="index.php"">Natrag</a>';    die;}include("database.php");$query = "SELECT * FROM playerinfo WHERE user = '$user'";$result = mysql_query($query);$row = mysql_fetch_row($result);if (!$con)  {  die('Could not connect: ' . mysql_error());  }  $username_exist = mysql_num_rows($result);  if($username_exist == 0)  {    echo('Nick ne postoji');    echo '<a href="NewPassword.php"">Natrag</a>';    die;  }    if($pass1 !== $row[1])  {    echo("Pogresan stari PW!");    echo '<a href="New Password.php"">Natrag</a>';     die;  }  if($pass2 !== $pass3)  {    echo("Nove lozinke vam se ne podudaraju!");    echo '<a href="NewPassword.php"">Natrag</a>';     die;  }    $query = "UPDATE playerinfo SET password = '$pass3' WHERE user= '$user'";  $result = mysql_query($query);  echo 'Password Changed!';   $_SESSION['Password'] = $pass3;  echo '<a href="Logged.php"">Natrag</a>';?>


File: Stats.php
Info: Statsi igraca

<html>
<body>
<form action="ShowStats.php" method="post">
<b><font size="4" color="#000080">Statsi drugih igraca</font></b>
<p>Nick <input type="text" name="User" size="20" /> </p>
<p>&nbsp;<input type="submit" />
<input type="reset" /> </p>
</form>
<p><font face="Arial" color="#000080" size="2"><b><a href="Logged.php">Natrag</a></b></font></p>
</body>
</html>


File: ShowStats.php
Info: Ubacuje ime igraca za stats

<?phpinclude("database.php");if (!$con)  {  die('Could not connect: ' . mysql_error());  }  $user = $_POST["User"];   $query = "SELECT * FROM playerinfo WHERE user= '$user'";  $result = mysql_query($query);  $username_exist = mysql_num_rows($result);  if($username_exist == 0)  {    echo('Nick ne postoji');    echo('<p><font face="Arial" color="#000080" size="2"><b><a href="stats.php">Natrag</a></b></font></p>');    die;  }    $row = mysql_fetch_row($result);  $message = "<b><font size='4' color='#000080'> Statsi od | $user</font></b>";  echo $message;  echo "<table>";  echo "  <tr>  <td>Nick:</td>  <td>$row[0]</td>  </tr>";  echo "  <tr>  <td>Ubojstva:</td>  <td>$row[2]</td>  </tr>";  echo "  <tr>  <td>Smrti:</td>  <td>$row[3]</td>  </tr>";    echo "  <tr>  <td>Skor:</td>  <td>$row[4]</td>  </tr>";  echo "  <tr>  <td>Novac:</td>  <td>$$row[5]</td>  </tr>";  echo "</table>";    echo'<p><font face="Arial" color="#000080" size="2"><b><a href="stats.php">Pronadi statse drugog igraca</a></b></font></p>';?>


Nadam se da vam se tut svida, kao i moje prevodenje ;)..

original: http://forum.sa-mp.com/showthread.php?t=159785 (http://forum.sa-mp.com/showthread.php?t=159785)
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: LordShigi poslato Avgust 28, 2010, 12:17:02 POSLE PODNE
Nije lose...
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: John poslato Avgust 28, 2010, 12:18:09 POSLE PODNE
Tut je poprilicno lose napravio TheKiller,

1. Nigdje ne sprjecava SQL injection
2. ne koristi Threadane querye
3. postoji bolji nacin od selektiranja svega cim se igrac spoji, npr selektiranje prvo IDa pa da vidi dal igrac uopce postoji
4. umjesto da fetcha cijeli row moze ici polje po polje (field by field)

5. ovo je vise stats page nego ucp, i niti u njemu se ne brine za nikakvu sigurnost oko SQL Injectiona ili session hijackinga


Za one koji misle ovo koristit  :)


I da sto sam zaboravio je da je WAMP server postao XAMPP te WAMP vjerojatno nema najnoviji PHP ili MySQL
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: Rotcod poslato Avgust 28, 2010, 12:22:05 POSLE PODNE
A za cega ovo sluzi ako smem da pitam ?  :D :D :D
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: LordShigi poslato Avgust 28, 2010, 12:25:16 POSLE PODNE
Citat: John poslato Avgust 28, 2010, 12:18:09 POSLE PODNE
Tut je poprilicno lose napravio TheKiller,

1. Nigdje ne sprjecava SQL injection
2. ne koristi Threadane querye
3. postoji bolji nacin od selektiranja svega cim se igrac spoji, npr selektiranje prvo IDa pa da vidi dal igrac uopce postoji
4. umjesto da fetcha cijeli row moze ici polje po polje (field by field)

5. ovo je vise stats page nego ucp, i niti u njemu se ne brine za nikakvu sigurnost oko SQL Injectiona ili session hijackinga


Za one koji misle ovo koristit  :)


I da sto sam zaboravio je da je WAMP server postao XAMPP te WAMP vjerojatno nema najnoviji PHP ili MySQL

Aha, to nije on napravio. Ja mislio da je on pa s obzirom da je on pocetnik je dobro.
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: John poslato Avgust 28, 2010, 12:26:23 POSLE PODNE
Citat: LordShigi poslato Avgust 28, 2010, 12:25:16 POSLE PODNE
Citat: John poslato Avgust 28, 2010, 12:18:09 POSLE PODNE
Tut je poprilicno lose napravio TheKiller,

1. Nigdje ne sprjecava SQL injection
2. ne koristi Threadane querye
3. postoji bolji nacin od selektiranja svega cim se igrac spoji, npr selektiranje prvo IDa pa da vidi dal igrac uopce postoji
4. umjesto da fetcha cijeli row moze ici polje po polje (field by field)

5. ovo je vise stats page nego ucp, i niti u njemu se ne brine za nikakvu sigurnost oko SQL Injectiona ili session hijackinga


Za one koji misle ovo koristit  :)


I da sto sam zaboravio je da je WAMP server postao XAMPP te WAMP vjerojatno nema najnoviji PHP ili MySQL

Aha, to nije on napravio. Ja mislio da je on pa s obzirom da je on pocetnik je dobro.

da dobro je preveo, a ovaj je lose napravio   :) :D
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: LuKsA poslato Avgust 28, 2010, 12:27:34 POSLE PODNE
Dobro je to za pocetnike :D.. ovaj je i sam napisao da ne sprecava injection ovo..
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: dexx poslato Avgust 28, 2010, 12:52:28 POSLE PODNE
pogle gresku ... valjda uocavas


sscanf(line, "p|ssdddds", data[0], data[1], data2[0], data2[1], data2[2], data2[3], data[2]); //Razdvojava linije pomocu sscanfa
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: nastoe poslato Avgust 28, 2010, 18:04:52 POSLE PODNE
Lol napises da je za bolje skriptere a tutorial pun gresaka naveo si sve jezike da treba poznavati a nisi sami SQL jezik ako nisi znao to je isto jezik
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: Dude poslato Avgust 28, 2010, 19:43:44 POSLE PODNE
sve je to ok, al realno cemu msql baza za samp server, po meni nepotrebno... zanimljive sam postove bas jucer citao od y_lessa o brzini zapisivanja, i sto on kaze, a i sam se slazem pored svih sistema zapisivanja podataka fwrite je najbrzi, tako da nema potrebe, osim ako ne zelis povezat u jednu bazu i server i forum acc ili iz vec nekog drugog meni nepoznatog razloga...
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: LordShigi poslato Avgust 28, 2010, 19:53:58 POSLE PODNE
Po meni postoje dva razloga. Jedan je da je sve puno lakÅ¡e upravo zbog tabličnog povezivanja podataka, jednostavnije za ureÄ'ivati = viÅ¡e volje za rad = bolje skripte.
A Drugi je kao što si i sam rekao povezivanje baza, Control Paneli i takve stvari...
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: Dude poslato Avgust 28, 2010, 20:03:59 POSLE PODNE
Citat: LordShigi poslato Avgust 28, 2010, 19:53:58 POSLE PODNE
Po meni postoje dva razloga. Jedan je da je sve puno lakÅ¡e upravo zbog tabličnog povezivanja podataka, jednostavnije za ureÄ'ivati = viÅ¡e volje za rad = bolje skripte.
A Drugi je kao što si i sam rekao povezivanje baza, Control Paneli i takve stvari...

ako imas msql bazu uopce ne mora znacit da ces napravit bolju skriptu, o njoj ovisi samo onaj mali djelic tvog moda, a on je u dva callbacka - ucitavanje i pisanje podataka, apsolutno nikakve veze sa dobrim/losim modom ili ikakvom voljom za radom na modu msql nema...
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: John poslato Avgust 28, 2010, 20:06:26 POSLE PODNE
Citat: Dude poslato Avgust 28, 2010, 19:43:44 POSLE PODNE
sve je to ok, al realno cemu msql baza za samp server, po meni nepotrebno... zanimljive sam postove bas jucer citao od y_lessa o brzini zapisivanja, i sto on kaze, a i sam se slazem pored svih sistema zapisivanja podataka fwrite je najbrzi, tako da nema potrebe, osim ako ne zelis povezat u jednu bazu i server i forum acc ili iz vec nekog drugog meni nepoznatog razloga...

Mislim da je to bila rasprava o custom libaryi-ima (dini, dudb) vs fwrite i naravno pobjedio je fwrite i tu uopce nema rasprave, a vidio sam da se Y_Less prije zalagao za koristenje SQL Litea koji je ugradjen u SA:MP server  :)
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: LordShigi poslato Avgust 28, 2010, 20:06:43 POSLE PODNE
Svako ima svoj ukus i svoj system koji preferira. Meni je to MySql odnosno SQLite.
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: Tex poslato Februar 19, 2012, 00:38:49 PRE PODNE
stock sscanf(string[], format[], {Float,_}:...)
{
    #if defined isnull
        if (isnull(string))
    #else
        if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    #endif
        {
            return format[0];
        }
    #pragma tabsize 4
    new
        formatPos = 0,
        stringPos = 0,
        paramPos = 2,
        paramCount = numargs(),
        delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ')
    {
        stringPos++;
    }
    while (paramPos < paramCount && string[stringPos])
    {
        switch (format[formatPos++])
        {
            case '\0':
            {
                return 0;
            }
            case 'i', 'd':
            {
                new
                    neg = 1,
                    num = 0,
                    ch = string[stringPos];
                if (ch == '-')
                {
                    neg = -1;
                    ch = string[++stringPos];
                }
                do
                {
                    stringPos++;
                    if ('0' <= ch <= '9')
                    {
                        num = (num * 10) + (ch - '0');
                    }
                    else
                    {
                        return -1;
                    }
                }
                while ((ch = string[stringPos]) > ' ' && ch != delim);
                setarg(paramPos, 0, num * neg);
            }
            case 'h', 'x':
            {
                new
                    num = 0,
                    ch = string[stringPos];
                do
                {
                    stringPos++;
                    switch (ch)
                    {
                        case 'x', 'X':
                        {
                            num = 0;
                            continue;
                        }
                        case '0' .. '9':
                        {
                            num = (num << 4) | (ch - '0');
                        }
                        case 'a' .. 'f':
                        {
                            num = (num << 4) | (ch - ('a' - 10));
                        }
                        case 'A' .. 'F':
                        {
                            num = (num << 4) | (ch - ('A' - 10));
                        }
                        default:
                        {
                            return -1;
                        }
                    }
                }
                while ((ch = string[stringPos]) > ' ' && ch != delim);
                setarg(paramPos, 0, num);
            }
            case 'c':
            {
                setarg(paramPos, 0, string[stringPos++]);
            }
            case 'f':
            {

                new changestr[16], changepos = 0, strpos = stringPos;
                while(changepos < 16 && string[strpos] && string[strpos] != delim)
                {
                    changestr[changepos++] = string[strpos++];
                    }
                changestr[changepos] = '\0';
                setarg(paramPos,0,_:floatstr(changestr));
            }
            case 'p':
            {
                delim = format[formatPos++];
                continue;
            }
            case '\'':
            {
                new
                    end = formatPos - 1,
                    ch;
                while ((ch = format[++end]) && ch != '\'') {}
                if (!ch)
                {
                    return -1;
                }
                format[end] = '\0';
                if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
                {
                    if (format[end + 1])
                    {
                        return -1;
                    }
                    return 0;
                }
                format[end] = '\'';
                stringPos = ch + (end - formatPos);
                formatPos = end + 1;
            }
            case 'u':
            {
                new
                    end = stringPos - 1,
                    id = 0,
                    bool:num = true,
                    ch;
                while ((ch = string[++end]) && ch != delim)
                {
                    if (num)
                    {
                        if ('0' <= ch <= '9')
                        {
                            id = (id * 10) + (ch - '0');
                        }
                        else
                        {
                            num = false;
                        }
                    }
                }
                if (num && IsPlayerConnected(id))
                {
                    setarg(paramPos, 0, id);
                }
                else
                {
                    #if !defined foreach
                        #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
                        #define __SSCANF_FOREACH__
                    #endif
                    string[end] = '\0';
                    num = false;
                    new
                        name[MAX_PLAYER_NAME];
                    id = end - stringPos;
                    foreach (Player, playerid)
                    {
                        GetPlayerName(playerid, name, sizeof (name));
                        if (!strcmp(name, string[stringPos], true, id))
                        {
                            setarg(paramPos, 0, playerid);
                            num = true;
                            break;
                        }
                    }
                    if (!num)
                    {
                        setarg(paramPos, 0, INVALID_PLAYER_ID);
                    }
                    string[end] = ch;
                    #if defined __SSCANF_FOREACH__
                        #undef foreach
                        #undef __SSCANF_FOREACH__
                    #endif
                }
                stringPos = end;
            }
            case 's', 'z':
            {
                new
                    i = 0,
                    ch;
                if (format[formatPos])
                {
                    while ((ch = string[stringPos++]) && ch != delim)
                    {
                        setarg(paramPos, i++, ch);
                    }
                    if (!i)
                    {
                        return -1;
                    }
                }
                else
                {
                    while ((ch = string[stringPos++]))
                    {
                        setarg(paramPos, i++, ch);
                    }
                }
                stringPos--;
                setarg(paramPos, i, '\0');
            }
            default:
            {
                continue;
            }
        }
        while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
        {
            stringPos++;
        }
        while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
        {
            stringPos++;
        }
        paramPos++;
    }
    do
    {
        if ((delim = format[formatPos++]) > ' ')
        {
            if (delim == '\'')
            {
                while ((delim = format[formatPos++]) && delim != '\'') {}
            }
            else if (delim != 'z')
            {
                return delim;
            }
        }
    }
    while (delim > ' ');
    return 1;
}


Kad ovo ubacim u Pawno,izbaci mi da zatvorim pawno! sta da uradim?
Naslov: Odg: [TUT] Izrada MYSQL Systema
Poruka od: [BU]Davidoff poslato Februar 19, 2012, 04:53:39 PRE PODNE
Ja se ne razumijem u ovo MYSQL znam ponesto u skriptanju poceo sam prije 20 dana,ali kad nekoga pitam tebe je dobra skripta aa.A on odma odgovori pa moja skripta ima MYSQL to je nesto najbolje preko foruma nesto pocne da prdi.Ja ne znam ali sam procita Dudeove komentare i ja mislim kad on kaze da nije to potrebno mislim da je u pravu posto je on najbolji skripter kolko ja znam i kolko cujem
A svaka cast za tutorial
Naslov: Odg: [TuT] Izrada MYSQL Systema
Poruka od: Dane poslato Maj 02, 2012, 18:33:59 POSLE PODNE
Citat: McRyder poslato April 30, 2012, 23:33:50 POSLE PODNE
Ovako , zna li neko da mi pomogne , kada pokrenem wamp i upalim http://localhost/phpmyadmin/
onda mi bude bijela stranica , nista se ne pojavi , umjesto da dodje ono da dalje installiras :S

Očito nešto dobro nisi uradio..


Kada upalim server piše mi Run Time Error 20.Ubacio sam najnoviji plugin i include ali mi izbacuje error "undefined symbol: mysql_query".U mysql.logu mi piše da ne očitaje plugin(sve sam stavio što je izašlo zadenj(verzija)).
Naslov: Odg: [TuT] Izrada MYSQL Systema
Poruka od: [ПГ]Душан poslato Maj 02, 2012, 19:32:01 POSLE PODNE
Citat: McRyder poslato April 30, 2012, 23:33:50 POSLE PODNE
Ovako , zna li neko da mi pomogne , kada pokrenem wamp i upalim http://localhost/phpmyadmin/
onda mi bude bijela stranica , nista se ne pojavi , umjesto da dodje ono da dalje installiras :S

Mozda ti je port 80 a samo skype korsti port 80 probaj izaci iz skype i onda pokreni wamp server
Naslov: Odg: [TuT] Izrada MYSQL Systema
Poruka od: LuKsA poslato Maj 03, 2012, 12:31:00 POSLE PODNE
Port 80 ti nije free, taj port ti koristi skype / teamviewer i jos mnogo programa, ugl. probaj pogasit vecinu i onda isprobaj.

@Dane, izgleda da nisi ubacio kad ti neradi, skini g-styleezov plugin i ubaci ga, preporucam ti r6 verziju jer je verzija s threadanjem za tebe prekomplicirana.
Naslov: Odg: [TuT] Izrada MYSQL Systema
Poruka od: eNdle:S poslato Jul 06, 2012, 14:15:53 POSLE PODNE
OBRISITE MI KOMENTAR!
Naslov: Odg: [TuT] Izrada MYSQL Systema
Poruka od: [OG]penokSSS! poslato Jul 14, 2012, 20:08:15 POSLE PODNE
jel zna ko kako da se spoji ta databaza sa modom da netrebamo pokretat sa wampom '???
Naslov: Odg: [TuT] Izrada MYSQL Systema
Poruka od: LuKsA poslato Jul 14, 2012, 20:29:23 POSLE PODNE
Pokreni ju xampom.
Naslov: Odg: [TuT] Izrada MYSQL Systema
Poruka od: eNdle:S poslato Jul 15, 2012, 03:02:01 PRE PODNE
OBRISITE MI KOMENTAR!
Naslov: Odg: [TuT] Izrada MYSQL Systema
Poruka od: .G.h.0.s.T. poslato Septembar 05, 2012, 07:49:03 PRE PODNE
znaci ako radis u MySQL, ne znaci da ces imat "bolji mod"?
ako napravim fwrite sistem zapisivanja kao sto npr. ima mod LARP, to isto jednako moze biti dobro?
Naslov: Odg: [TuT] Izrada MYSQL Systema
Poruka od: dock poslato Septembar 05, 2012, 12:36:11 POSLE PODNE
Naravno da nije isto, mysql je sistem cuvanja kao i bilo koji drugi i to stoji i ne moze ti biti BOLJI mod od sebe ako ga koristis, ali ima neke prednosti kao sto su evo upravo u ovom tutu recimo UCP mozes napraviti dosta lako bez muka, takodje mozes veoma lako napraviti dinamicne potpise, dinamicne organizacije, u sustini dosta stvari koje su pre bile komplikovane su sada veoma lako moguce uz pomoc ovoga i nije tesko nauciti :) Ali ja idalje vise volim sisteme kao sto je y_ini <3 ... Mada sam poceo vezbati i sa MySQLom i veoma mi se dopada kako funkcionise..

@Luksa hvala na objavi :)