Hi everyone,
I have made these open-source PHP classes so that you can manage your MuOnline database very easily. You won't even have to manipulate SQL queries anymore, the code behind the classes does it all for you.
MuEngine is made up of 6 classes: MuDatabase, MuCharacter, MuAccount, MuGuild, MuAccountCreator, MuQueryResult
Here is a short preview to each of them:
MuDatabase: Represents a connection to your database. You can execute raw queries from there if you want, but it is WAY simpler calling one of the functions such as account(), character(), guild(), etc.
MuCharacter: Represents a MuOnline character.
MuAccount: Represents a MuOnline account.
MuGuild: Represents a MuOnline guild.
MuAccountCreator: Represents an account creator.
MuQueryResult: Represents the result to a query executed through MuDatabase::execute() or MuDatabase::query().
Unfortunately, MuEngine is NOT documented yet, BUT the function names are pretty self-explanatory, besides I will give a few examples of how to use MuEngine below.
Personally, I am almost done with a website, that uses MuEngine without having to write raw SQL queries about 99% of the time, proof that you can do A LOT with it.
MUENGINE CLASS METHOD LIST :
Code:
<return_type> <class>::<function_name> (<args>)
===== MuDatabase CLASS ====
const MuDatabase::CONNTYPE_MSSQL
const MuDatabase::CONNTYPE_ODBC
MuDatabase MuDatabase::setUsername(string $username)
MuDatabase MuDatabase::setPassword(string $password)
MuDatabase MuDatabase::setHost(string $host)
MuDatabase MuDatabase::setDSN(string $dsn)
MuDatabase MuDatabase::setConnType(int $conntype)
MuDatabase MuDatabase::useResetSystem()
MuDatabase MuDatabase::connect()
MuDatabase MuDatabase::useMD5()
MuDatabase MuDatabase::lastError(bool $forceShowEvenIfNotInDebugMode=false)
bool MuDatabase::connected()
MuDatabase MuDatabase::useDebugMode()
MuQueryResult MuDatabase::execute(string $queryFormat, string $arg1, string $arg2, ...)
MuQueryResult MuDatabase::query(string $query)
MuAccount MuDatabase::account(string $accountname)
MuCharacter MuDatabase::character(string $charactername)
MuDatabase MuDatabase::enableLogging(string $fileName, string $format)
MuDatabase MuDatabase::use64KStatSupport()
bool MuDatabase::accountExists(string $accountName)
bool MuDatabase::emailExists(string $emailAddress)
MuAccountCreator MuDatabase::accountCreator()
array MuDatabase::rankings(int $max, bool $showGM) [array<MuCharacter>]
MuGuild MuDatabase::guild(string $guildName)
====MuCharacter CLASS====
string MuCharacter::getName()
int MuCharacter::getStrength()
int MuCharacter::getAgility()
int MuCharacter::getVitality()
int MuCharacter::getEnergy()
int MuCharacter::getCommand()
int MuCharacter::getFreePoints()
MuCharacter MuCharacter::setFreePoints(int $newVal)
MuCharacter MuCharacter::addFreePoints(int $addVal)
MuCharacter MuCharacter::remFreePoints(int $remVal)
MuCharacter MuCharacter::setStrength(int $newVal)
MuCharacter MuCharacter::setAgility(int $newVal)
MuCharacter MuCharacter::setVitality(int $newVal)
MuCharacter MuCharacter::setEnergy(int $newVal)
MuCharacter MuCharacter::setCommand(int $newVal)
MuCharacter MuCharacter::setPK(int $newVal)
string MuCharacter::getClass()
int MuCharacter::getClassCode()
string MuCharacter::getRawClass()
MuCharacter MuCharacter::setClass(mixed $newVal)
MuCharacter MuCharacter::addStrength(int $addVal)
MuCharacter MuCharacter::addAgility(int $addVal)
MuCharacter MuCharacter::addVitality(int $addVal)
MuCharacter MuCharacter::addEnergy(int $addVal)
MuCharacter MuCharacter::addCommand(int $addVal)
MuCharacter MuCharacter::remStrength(int $remVal)
MuCharacter MuCharacter::remAgility(int $remVal)
MuCharacter MuCharacter::remVitality(int $remVal)
MuCharacter MuCharacter::remEnergy(int $remVal)
MuCharacter MuCharacter::remCommand(int $remVal)
int MuCharacter::getLevel()
int MuCharacter::setLevel(int $newVal)
int MuCharacter::getExp(int $newVal)
MuCharacter MuCharacter::addLevel(int $addVal)
MuCharacter MuCharacter::remLevel(int $remVal)
bool MuCharacter::isBlocked()
int MuCharacter::getMuteTime()
MuCharacter MuCharacter::mute(int $minutes)
MuCharacter MuCharacter::unmute()
MuCharacter MuCharacter::block()
MuCharacter MuCharacter::unblock()
bool MuCharacter::isGM()
int MuCharacter::getMapID()
string MuCharacter::getMap()
MuCharacter MuCharacter::getGM(int $gmCode=8)
MuCharacter MuCharacter::unmakeGM()
MuCharacter MuCharacter::move(mixed $map, int $x, int $y)
MuCharacter MuCharacter::warp(mixed $map)
MuCharacter MuCharacter::setX(int $x)
MuCharacter MuCharacter::setY(int $y)
int MuCharacter::getResets()
MuCharacter MuCharacter::addResets(int $addVal)
MuCharacter MuCharacter::setResets(int $newVal)
MuCharacter MuCharacter::remResets(int $remVal)
MuAccount MuCharacter::account()
MuCharacter MuCharacter::setNumArray(array $vals)
array MuCharacter::getInfo() [array<string=>mixed>]
MuGuild MuCharacter::guild()
====MuAccount CLASS====
string MuAccount::getPassword()
string MuAccount::getUsername()
string MuAccount::getName()
MuAccount MuAccount::setName(string $newVal)
bool MuAccount::isBlocked()
string MuAccount::getSecretQuestion()
MuAccount MuAccount::setSecretQuestion(string $newVal)
string MuAccount::getSecretAnswer()
MuAccount MuAccount::setSecretAnswer(string $newVal)
MuAccount MuAccount::block()
MuAccount MuAccount::unblock()
bool MuAccount::hasPassword(string $password)
MuAccount MuAccount::setPassword(string $newVal)
MuAccount MuAccount::setPersonalID(string $newID)
string MuAccount::getPersonalID()
MuAccount MuAccount::setEmail($newVal)
string MuAccount::getEmail()
bool MuAccount::isOnline()
int MuAccount::onlineHours()
MuCharacter MuAccount::getLastUsedChar()
string MuAccount::getLastUsedServer()
array MuAccount::characters() [array<MuCharacter>]
array MuAccount::getInfo() [array<string=>mixed>]
string MuAccount::get(string $columnName)
MuAccount MuAccount::set(string $columnName, string $newVal)
====MuAccountCreator CLASS====
MuAccountCreator MuAccountCreator::setUsername(string $val)
MuAccountCreator MuAccountCreator::setPassword(string $val)
MuAccountCreator MuAccountCreator::setSecretQuestion(string $val)
MuAccountCreator MuAccountCreator::setSecretAnswer(string $val)
MuAccountCreator MuAccountCreator::setName(string $val)
MuAccountCreator MuAccountCreator::setEmail(string $val)
MuAccountCreator MuAccountCreator::setPersonalID(string $val)
MuAccountCreator MuAccountCreator::set(string $clumnName, string $to)
MuAccountCreator MuAccountCreator::save()
====MuGuild CLASS====
string MuGuild::getName()
MuCharacter MuGuild::getGM()
MuCharacter MuGuild::getAGM()
array MuGuild::getBMs() [array<MuCharacter>]
array MuGuild::getChars()
array MuGuild::getMembers()
string MuGuild::getGMC()
====MuQueryResult CLASS====
array MuQueryResult::fetchArray()
int MuQueryResult::affectedRows()
void MuQueryResult::free()
array MuQueryResult::fetchRow()
object(stdclass) MuQueryResult::fetchObject()
MuQueryResult MuQueryResult::nextResult()
EXAMPLES :
Example 1. Including MuEngine
PHP Code:
<?php
include 'muengine/all';
?>
Example 2. Establishing a connection to your database
PHP Code:
<?php
include 'muengine/all';
$db = new MuDatabase(); // Note that MuDatabase is the ONLY class we have to instanciate this way.
$db->setConnType(CONNTYPE_MSSQL);
$db->setHost('127.0.0.1');
$db->setUsername('sa');
$db->setPassword('sqlpassword');
$db->connect() or die('Could not connect to SQL database');
/* Note that we also could have done
$db->setConnType(CONNTYPE_MSSQL)->setHost('127.0.0.1')->setUsername('sa')->setPassword('sqlpassword')->connect()
Since all setters return the current object. */
?>
IN THE FOLLOWING EXAMPLES I WILL NOT REWRITE THE CONNECTION CODE. I ASSUME $db IS A VALID DATABASE CONNECTION.
Example 2. Getting a character's account name
PHP Code:
<?php
echo $db->character('MyCharacter')->account()->getUsername();
?>
Example 2. Getting all of an account's characters
PHP Code:
<?php
foreach($db->account('myaccount')->characters() as $character)
echo $character->getName();
?>
Example 3. Setting all of an account's character stats to 32767
PHP Code:
<?php
foreach($db->account('myaccount')->characters() as $character) {
$character->setStrength(32767)->setAgility(32767)->setVitality(32767)->setEnergy(32767);
if($character->getRawClass() == 'dl') {
$character->setCommand(32767);
}
}
/* However, this will run 4 different queries per character.
Performance-wise, it would have been better to use setNumArray(), but the above way is the easiest to read */
?>
Example 4. Blocking the assistant guild master of a specific guild
PHP Code:
<?php
$agm = $db->guild('myguild')->getAGM();
$agm->block();
?>
Example 5. Creating an account
PHP Code:
<?php
$accountcreator = $db->accountCreator();
$accountcreator->setUsername('mynewacc');
$accountcreator->setPassword('mynewpwd');
$accountcreator->setSecretQuestion('lol');
$accountcreator->setSecretAnswer('yeah');
$accountcreator->setName('mynewacc');
$accountcreator->setPersonalID(111111);
$accountcreator->save();
?>
Example 6. Displaying all of a guild's characters, as well as if they are online
PHP Code:
<?php
foreach($db->guild('myguild')->getChars() as $character) {
echo $character->getName();
if($character->account()->isOnline())
echo ' - ONLINE';
echo '<br />';
}
Example 7. Running an SQL query <-- even though you shouldn't need it
PHP Code:
<?php
/* MuDatabase::execute() escapes its arguments after the first one AUTOMATICALLY, THEREFORE we need to remove the magic quote effect
(it is also good to do it preventively, as PHP6 will have magic quotes removed) */
if(@get_magic_quotes_gpc()) {
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
}
/* SAFE WAY to run a query with user input
You can use any format that printf() uses */
$db->execute("SELECT * FROM Character WHERE Name = '%s'", $_POST['character']);
/* UNSAFE WAY: NEVER DO THIS!! */
$db->execute("SELECT * FROM Character WHERE Name = '" . $_POST['name'] . "'");
?>
DOWNLOADS
Download the latest version at https://sourceforge.net/projects/muengine/files/
IF YOU WANT TO CONTRIBUTE TO THIS PROJECT, PLEASE SEND ME A FORUM PM ON RAGEZONE AT LifeTaker.
OF COURSE YOUR WORK WILL BE CREDITED.
TODO
- Documentation
- MuItem class
- Make MuAccountCreator more convenient
- Make sure MuEngine supports all server databases