Anasayfa
UO Sunucular
Forumlar
Profilim

Sphere 0.56b — MySQL Account Sistemi Kurulumu

UO-Developer.com — AppServ, phpMyAdmin, PHP kayıt formu ve Sphere aktarımı

Merhaba arkadaşlar — hep beraber bir hesap sistemi yapalım. Vereceğim kodlar basittir; geliştirilebilir ve SphereServer'da geçmiştir. Web sitesinden kayıt olan kullanıcılar MySQL'e yazılır; Sphere periyodik olarak bu kayıtları account dosyasına aktarır.

Konu: MySQL tabanlı web kayıt + Sphere import | Seviye: Orta – İleri

İlgili: 56b Account Sistemi | Sphere 0.56b Win32 | Sphere, MySQL ve PHP

MySQL kurulum: projedeki Sphere MySQL Entegrasyonu rehberi | MySQL Kurulumu


İçindekiler
  • Gereksinimler
  • AppServ kurulumu
  • phpMyAdmin — veritabanı ve accounts tablosu
  • sphere.ini MySQL ayarları
  • PHP kayıt sayfası
  • Sphere — f_onserver_start ve f_acc_update
  • Aktarım zamanlaması
  • Güvenlik uyarıları
  • Kontrol listesi

1. Gereksinimler

Veritabanı kullanacağımız için Sphere sürümünüzün 0.56b olması gerekir.

İndirme: Sphere Releases — işletim sisteminize uygun sürüm.

PHP kodları Linux hosting ortamında doğal çalışır. Windows'ta doğrudan PHP+Apache kurulumu yerine AppServ, XAMPP veya EasyPHP gibi paketler kullanılır; belirlenen www klasörü web kökü olur. Bu rehberde AppServ anlatılır.

AppServ: appserv.org — Download


2. AppServ Kurulumu

Adım 1 — Kurulum sihirbazı

  • Server Name: localhost
  • Administrator e-mail: e-posta adresiniz
  • Port: varsayılan — genelde Apache 80, MySQL 3306
  • MySQL root şifresi: kurulumda iki kez girin — phpMyAdmin için gerekli
  • Charset: UTF-8 Unicode — Türkçe karakter desteği için bırakın

Adım 2 — Web kök klasörü

Kurulum sonrası C:\AppServ\www klasörü web alanınızdır. phpMyAdmin hariç varsayılan dosyaları silip account sistemi dosyalarını buraya koyacağız.


3. phpMyAdmin — Veritabanı ve Tablo

Adım 1 — Giriş

Tarayıcıda:

http://localhost/phpmyadmin

Kullanıcı: root | Şifre: kurulumda belirlediğiniz şifre.

Adım 2 — Yetkiler

Yetkililer → parola kısmında Evet dışındaki gereksiz global yetkileri kapatın — veritabanlarına şifresiz erişim olmasın.

Adım 3 — Veritabanı oluşturma

Yeni veritabanı adı — örnek sphere. Kendi adınızı kullanabilirsiniz; sphere.ini ve PHP'de aynı olmalı.

Adım 4 — accounts tablosu

Veritabanını seçin → üst menü SQL → aşağıdaki sorguyu yapıştırın → Git:

CREATE TABLE `accounts` (
  `id` int(11) NOT NULL auto_increment,
  `login` varchar(26) default NULL,
  `password` tinytext,
  `email` varchar(60) default NULL,
  `plevel` varchar(26) default 'player',
  `status` int(11) default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

status alanı: 0 = Sphere'e henüz aktarılmadı, 1 = aktarıldı.


4. sphere.ini MySQL Ayarları

56b MySQL özelliğini aktif edin:

// MySql configuration.
MYSQL=1
MySqlHost=localhost
MySqlUser=root
MySqlPassword=sifreniz
MySqlDatabase=sphere
  • MySqlPassword — AppServ kurulum şifresi
  • MySqlDatabase — oluşturduğunuz veritabanı adı

libMySQL.dll 32-bit dosyası Sphere klasöründe olmalı — libMySQL.dll 32-bit


5. PHP Kayıt Sayfası

Basit örnek kayıt formu — captcha, çift e-posta, PIN vb. ile geliştirilebilir. Dosyayı C:\AppServ\www\index.php olarak kaydedin.

Uyarı: Örnek kod eğitim amaçlıdır; düz metin şifre ve eski mysql_* fonksiyonları içerir. Canlı shard'da mysqli/PDO ve hash kullanın — bkz. bölüm 9.

MySQL bağlantı bilgilerini dosyanın üstündeki değişkenlerde düzenleyin:

$mysql_user = "root";
$mysql_pass = "sifreniz";
$mysql_database = "sphere";
$mysql_host = "localhost";

Tam kayıt sayfası örneği:

<html>
<head>
<title>Sphere Account Register</title>
<style>
body { color: #003300; font-family: Verdana, Arial, Serif; font-size: 10pt; }
input { border: 1px solid #003300; color: #003300; background: #DDDDDD;
  font-family: Verdana, Arial, Serif; font-size: 10pt; }
tr { font-size: 10pt; }
a:link, a:visited, a:active { text-decoration: none; color: #003300; }
a:hover { text-decoration: none; color: #FF6600; }
</style>
</head>
<body>
<div align="center">
<?php
$mysql_user = "root";
$mysql_pass = "sifreniz";
$mysql_database = "sphere";
$mysql_host = "localhost";
?>
<FORM METHOD=POST ACTION="<?php echo $_SERVER['PHP_SELF']; ?>?act=register">
<table cellspacing=0 border=0>
<tr>
<td colspan=2 style="border: 1px solid #003300; background: #DDDDDD;">
<CENTER><A HREF="index.php">Sphere Account Register</A></CENTER></td>
</tr>
<tr>
<td style="border-left: 1px solid #003300">&nbsp;User:</td>
<td style="border-right: 1px solid #003300"><INPUT TYPE="text" NAME="login"></td>
</tr>
<tr>
<td style="border-left: 1px solid #003300">&nbsp;Password:</td>
<td style="border-right: 1px solid #003300"><INPUT TYPE="password" NAME="senha1"></td>
</tr>
<tr>
<td style="border-left: 1px solid #003300">&nbsp;Retype Password:</td>
<td style="border-right: 1px solid #003300"><INPUT TYPE="password" NAME="senha2"></td>
</tr>
<tr>
<td style="border-left: 1px solid #003300">&nbsp;Email:</td>
<td style="border-right: 1px solid #003300"><INPUT TYPE="text" NAME="email"></td>
</tr>
<tr>
<td style="border: 1px solid #003300; border-top: 0px;" colspan=2>
<CENTER><INPUT NAME="Register" VALUE="Register" TYPE="submit"></CENTER></td>
</tr>
</table>
</FORM>
<?php
if ($_GET['act'] == 'register')
{
    $conn = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
    mysql_select_db($mysql_database);
    $user = anti_injection($_POST['login']);
    $pass1 = anti_injection($_POST['senha1']);
    $pass2 = anti_injection($_POST['senha2']);
    $email = anti_injection($_POST['email']);
    if (valida(Array($user,$pass1,$pass2,$email)) == true)
    {
        if ($pass1 == $pass2)
        {
            if (ereg("([0-9,a-z,A-Z])", $user))
            {
                if (ereg("^([0-9,a-z,A-Z]+)([.,_]([0-9,a-z,A-Z]+))*[@]([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[.]([0-9,a-z,A-Z]){2}([0-9,a-z,A-Z])?$", $email))
                {
                    $query = mysql_query("SELECT * FROM accounts WHERE login='$user'");
                    $num_rows = mysql_num_rows($query);
                    if ($num_rows == 0)
                    {
                        $query = mysql_query("SELECT * FROM accounts WHERE email='$email'");
                        $num_rows = mysql_num_rows($query);
                        if ($num_rows == 0)
                        {
                            $query = mysql_query("INSERT INTO accounts (login, password, email, status) VALUES ('$user','$pass1','$email','0')");
                            if (!$query)
                                echo ":: Error on trying to register account ::";
                            else
                                echo ":: Account added with sucess ::";
                        }
                        else
                            echo ":: Email is already exist in database ::";
                    }
                    else
                        echo ":: User is already exist in database ::";
                }
                else
                    echo ":: Invalid email type ::";
            }
            else
                echo ":: Use only numbers(0-9) and letters(a-z) ::";
        }
        else
            echo ":: The password is not equal ::";
    }
}

function anti_injection($sql)
{
    $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);
    $sql = trim($sql);
    $sql = strip_tags($sql);
    $sql = addslashes($sql);
    return $sql;
}

function valida($campos){
    foreach($campos as $c){
        if(empty($c)){
            echo ":: Write all fields ::<br>";
            return false;
        }
    }
    return true;
}
?>
</div>
</body>
</html>

Test: http://localhost/index.php — kayıt sonrası phpMyAdmin'de accounts tablosunda status=0 satır görünmeli.


6. Sphere — MySQL Bağlantısı

Genelde scripts/sphere_serv_triggers.scp içinde f_onserver_start fonksiyonu bulunur — sunucu açılışında çalışır.

Veritabanı bağlantı testi:

[FUNCTION f_onserver_start]
db.connect
if (<db.connected>)
    serv.log Bilgi: Mysql baglantisi basarili.
else
    serv.log Bilgi: Mysql baglantisi basarisiz
endif
return 1

Orijinal metinde DB.CONNECT büyük harf geçer; çoğu 56b build'de db.connect küçük harf kullanılır — sunucu logundan hangisinin çalıştığını doğrulayın.


7. Sphere — Account Aktarımı (f_acc_update)

Aynı script dosyasına account aktarım fonksiyonunu ekleyin:

[FUNCTION f_acc_update]
if (<db.connected>)
    db.query "SELECT * FROM accounts WHERE status='0'"
    if (<db.row.numrows> > 0)
        for r 0 <eval <db.row.numrows>-1>
            serv.account add <db.row.<eval <local.r>>.login> <eval <db.row.<eval <local.r>>.password>>
            db.execute "UPDATE accounts SET status='1' WHERE login='<db.row.<eval <local.r>>.login>'"
            serv.log Bilgi: #<eval <local.r>> Account <db.row.<eval <local.r>>.login> yaratildi.
        end
    endif
endif
return 1

f_acc_update web'den gelen hesapları Sphere'e aktarır. status=0 kayıtları alır, account oluşturur, status=1 yapar.


8. Aktarım Zamanlaması

Ne sıklıkla aktarılacağını siz belirlersiniz:

Her save'de bir:

[FUNCTION f_onserver_save]
serv.f_acc_update
return 1

Zamanlayıcı ile — örnek 30 dakikada bir:

sphere.ini içinde timer ayarlıysa f_onserver_timer fonksiyonuna ekleyin:

[FUNCTION f_onserver_timer]
serv.f_acc_update
return 1

Sunucu açılışında bir kez de çalıştırmak için f_onserver_start sonuna serv.f_acc_update ekleyebilirsiniz.


9. Güvenlik Uyarıları

Bu rehber bilinçli olarak basit tutulmuştur. Canlı kullanım öncesi:

  • Şifreleri düz metin yerine hash saklayın — Sphere tarafında uyumlu doğrulama gerekir
  • PHP mysql_* ve ereg kaldırıldı — PHP 7+ için mysqli veya PDO
  • anti_injection yeterli değil — prepared statement kullanın
  • valida fonksiyonu orijinalde hatalı döngü mantığı içerebilir — yukarıdaki sürüm düzeltildi
  • Web + Sphere aynı makinede saldırı yüzeyini artırır — mümkünse web hosting ayrı

Gelişmiş sistemler: Sorter Account Sistemi | Forum: Client ve Account Sistemleri


10. Özet Kontrol Listesi
  • [ ] Sphere 0.56b kurulu mu?
  • [ ] AppServ / MySQL çalışıyor mu?
  • [ ] sphere veritabanı ve accounts tablosu oluşturuldu mu?
  • [ ] sphere.ini MYSQL=1 ve bilgiler doğru mu?
  • [ ] libMySQL.dll Sphere klasöründe mi?
  • [ ] index.php www klasöründe, MySQL bilgileri güncel mi?
  • [ ] Web kayıt testi — status=0 satır oluşuyor mu?
  • [ ] f_onserver_start bağlantı logu başarılı mı?
  • [ ] f_acc_update eklendi ve zamanlandı mı?
  • [ ] Sphere'de yeni account ile giriş denendi mi?

11. Sonuç

MySQL ile Sphere bağlantısı mantıken basittir: web formu veritabanına yazar, Sphere periyodik olarak okur ve account oluşturur. Birkaç rehber okuduktan sonra istatistik, online listesi ve benzeri verileri de aynı yöntemle aktarabilirsiniz.

Sorular: Sphere MySQL forumu | Account sistemi Sphere bağlantısı

afro boyz / Afronola

UO-Dev SPONSOR

Önceki / Sonraki

UO-Dev SPONSOR

TheRaskol 01-03-2010 21:10
Çok yararlı teşekkür ederiz
Vincent 01-03-2010 21:21
bu quadruxsun account sistemi degilmi ?
Afronola 01-03-2010 21:30
Birşey değil raskol.

@vincent
Snaity paylaşmıştı ben de nasıl entegre edebilirler diye döküman hazırladım.
Vincent 01-03-2010 21:50
oke tamam.
Afronola 01-03-2010 22:41
hehe gözümden localde oluşturduğum bilgiler kaçmış ama problem yok nasıl olsa hostta bunlar olmayacak
Xearth 11-03-2010 20:13
Afronola peki bu sistem yazilari engelledinmi u-s dekinde yazi yazdığında şifresi 0 oluo degişik birşeyler oluyor fixledinizmi?
Afronola 14-03-2010 17:35
password kısmı `password` tinytext, oldugundan dolayı rakam veya harf farketmiyor ve tümü kullanılıyor.

Üyelerin oylama ortalaması (10 dışında) :

2.00

Oylar: 2 den itibaren 19-12-2011 00:45

Önceki / Sonraki