Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
  • Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Веб MCTOP PHP бонусы - продвинутое решение

Alex_Bond

Старожил
Девелопер
Пользователь
Баллы
153
Имя в Minecraft
Alex_Bond_UA
Скажу сразу - писать доку пока лень.

Сегодня ко мне постучался один паренек и попросил модифицировать для него скрипт поощрений для mctop. И тут я вспомнил какой дырявый и не удобный скрипт предлагает Илья (он сейчас ушел с головой в кодинг McTop v2:) ). Решил переписать.

Вот что вышло:
1. Теперь можно обновлять несколько значений сразу. Причем они могут быть в разных таблицах.
2. Можно выставлять значения, а не обновлять. Пример добавлять в таблицу запись о выдаче какого то предмета. На форуме есть плагины позволяющие делать такую штуку.

+ сделана глубочайшая защита от инъекций - написано все на PDO с использование prepared statment. Возможность хака через инъекцию = 0%!

Код написан "на коленке", но вполне рабочий и может использоваться в продакшне.

Вот ссыль на гитхаб:
https://github.com/Alex-Bond/minecraft-ratings-awards-php/

Думаю что те кто понимают хотя бы немного PHP смогут разобраться в работе)
Ну или я всетаки созрею написать документацию)
 
Слу, я тут чутка подредактил твой код(прости плз). Хочу сделать так, что бы выдавало ,допустим, 4 алмаза за голос в существующую таблицу.
Можешь проверить,все ли правильно?

Добавил 4-ый Кейс. В нем впис. в таблицу в которой есть 3 столбца.

Вот кодик:
Код:
<?php
 
$config = array(
 
'db' => array(
 
'driver' => 'mysql',
 
'host' => 'sr1.firolab.org.ua',
 
'username' => 'rootty',
 
'password' => 'ug0.jpg',
 
'database' => 'minecraft',
 
),
 
'security-code' => 'GkvPzrnA',
 
'jobs' => array(
 
array(
 
'active' => true,
 
'table-name' => 'w2v_bonus',
 
'type' => 4,
 
/*
 
* # ДОБАВЛЕНИЕ К ЧИСЛЕННОМУ ЗНАЧЕНИЮ
 
* 0 - только обновление (пополнение).
 
* 1 - вставка нового параметра если нет такой записи (поле user-column дожно быть уникально в схеме (уникальный индекс)).
 
* # ВЫСТАВЛЕНИЕ ЗНАЧЕНИЯ
 
* 2 - выставления значения
 
* 3 - вставка или выставление значения (поле user-column дожно быть уникально в схеме (уникальный индекс)).
 
* 4 - Моя дорисовка. Которая записывает в таблицу w2v_bonus 4 алмаза(id=264) проголосовавшему игроку.
 
* */
 
'change-column' => 'item_amount',
 
'item_amuntfromtable' => 'item_amount',
 
'item_count' => 4,
 
'item_id' => 264,
 
'user-column' => 'username',
 
'nicknamefromtable' => 'nickname',
 
'item_idfromtable' => 'item_id',
 
'default' => 30, // Стандартный баланс
 
'change' => 1 // Бонус или значение
 
)
 
)
 
);
 
if (isset($_GET['hash']) && isset($_GET['player']) && strlen($_GET['hash']) == 32 && strlen($_GET['player']) >= 3 && $_GET['hash'] == md5($config['security-code'] . $_GET['player'])) {
 
try {
 
$db = new PDO($config['db']['driver'] . ':host=' . $config['db']['host'] . ';dbname=' . $config['db']['database'], $config['db']['username'], $config['db']['password']);
 
foreach ($config['jobs'] as $item) {
 
if ($item['active'] == true) {
 
switch ($item['type']) {
 
case 0:
 
{
 
$query = $db->prepare("UPDATE " . $item['table-name'] . " SET `" . $item['change-column'] . "`=`" . $item['change-column'] . "`+" . $item['change'] . " WHERE `" . $item['user-column'] . "`=?");
 
$query->execute(array($_GET['player']));
 
break;
 
}
 
case 1:
 
{
 
$query = $db->prepare("INSERT INTO " . $item['table-name'] . " (`" . $item['user-column'] . "`,`" . $item['change-column'] . "`) VALUES (?, " . $item['default'] + $item['change'] . ") ON duplicate KEY UPDATE `" . $item['change-column'] . "`=`" . $item['change-column'] . "`+" . $item['change']);
 
$query->execute(array($_GET['player']));
 
break;
 
}
 
case 2:
 
{
 
$query = $db->prepare("UPDATE " . $item['table-name'] . " SET `" . $item['change-column'] . "`=`? WHERE `" . $item['user-column'] . "`=?");
 
$query->execute(array($item['change'], $_GET['player']));
 
break;
 
}
 
case 3:
 
{
 
$query = $db->prepare("INSERT INTO " . $item['table-name'] . " (`" . $item['user-column'] . "`,`" . $item['change-column'] . "`) VALUES (?, ?) ON duplicate KEY UPDATE `" . $item['change-column'] . "`=?");
 
$query->execute(array($_GET['player'], $item['change'], $item['change']));
 
break;
 
case 4:
 
{
 
//var_dump($item);
 
$query = $db->prepare("INSERT INTO " . $item['table-name'] . " (`".$item['nicknamefromtable'] . " `,`" . $item['item_idfromtable'] . "`, `" . $item['item_amuntfromtable'] . "`) VALUES (". $item['user-column'] ."', '". $item['item_id'] ."', '". $item['change-column'] ."`=?");
 
$query->execute(array($_GET['player']));
 
break;
 
}
 
//Добавил кейс 4. Посмотри плз соответствие в названиях и правильно ли они тут приведены. Спс.
 
}
 
if ($db->errorCode() != 0000) {
 
$error_array = $db->errorInfo();
 
die("SQL error: " . $error_array[2] . '');
 
}
 
}
 
}
 
echo 'ok';
 
} catch (PDOException $e) {
 
die('Error: ' . $e->getMessage());
 
}
 
} else {
 
die('DO NOT HACK ME!');
 
}

И еще, я так понимаю, что проверка на работоспособность кода идет вот таким путем?
Вбивая в строке : http://Сайт/mctop.php?security-code=Секретныйкод&player=ник
 
Слу, я тут чутка подредактил твой код(прости плз). Хочу сделать так, что бы выдавало ,допустим, 4 алмаза за голос в существующую таблицу.
Можешь проверить,все ли правильно?

Добавил 4-ый Кейс. В нем впис. в таблицу в которой есть 3 столбца.

Вот кодик:


И еще, я так понимаю, что проверка на работоспособность кода идет вот таким путем?
Вбивая в строке : http://Сайт/mctop.php?security-code=Секретныйкод&player=ник

зачем свой способ то?) просто 3й тип юзай и будет тебе счастье)
 
блин, действительно) спасибо. А в массив новые елементы добавляются так как я сделал?
 
странно, люди только что голосовали - в БД не добасилось.
 
id int 11 0 0 -1 0 0 0 0 -1 0
nickname varchar 16 0 0 0 0 0 0 0 utf8 utf8_general_ci 0 0
item_id int 11 0 0 0 0 0 0 0 0 0
item_amount int 11 0 0 0 0 0 0 0 0 0
 
хрень. Вот скрин)
 

Вложения:

  • Безымянный.png
    Безымянный.png
    Размер файла
    9,3 КБ
    Просмотров
    72
Понял. юзернейм не уникальное поле?
 
Тогда... Вот скрипт. Не работает.

В чем сок?

Код:
<?php
 
$config = array(
    'db' => array(
        'driver' => 'mysql',
        'host' => 'sr1.firolab.org.ua',
        'username' => 'rootty',
        'password' => 'ug0.jpg',
        'database' => 'minecraft',
    ),
    'security-code' => 'GkvPzrnA',
    'jobs' => array(
        array(
            'active' => true,
            'table-name' => 'w2v_bonus',
            'type' => 4,
            /*
* # ДОБАВЛЕНИЕ К ЧИСЛЕННОМУ ЗНАЧЕНИЮ
* 0 - только обновление (пополнение).
* 1 - вставка нового параметра если нет такой записи (поле user-column дожно быть уникально в схеме (уникальный индекс)).
* # ВЫСТАВЛЕНИЕ ЗНАЧЕНИЯ
* 2 - выставления значения
* 3 - вставка или выставление значения (поле user-column дожно быть уникально в схеме (уникальный индекс)).
* 4 - Моя дорисовка. Которая записывает в таблицу w2v_bonus 4 алмаза(id=264) проголосовавшему игроку.
* */
            'change-column' => 'item_amount',
            'item_amountfromtable' => 'item_amount',
            'item_count' => 4,
            'item_id' => 264,
            'user-column' => 'player',
            'nicknamefromtable' => 'nickname',
            'item_idfromtable' => 'item_id',
           
            'default' => 30, // Стандартный баланс
            'change' => 1 // Бонус или значение
        )
    )
);
 
//if (isset($_GET['hash']) && isset($_GET['player']) && strlen($_GET['hash']) == 32 && strlen($_GET['player']) >= 3 && $_GET['hash'] == md5($config['security-code'] . $_GET['player'])) {
//  try {
  $player=mysql_escape_string($_GET['player']);
  $player=mysql_real_escape_string($player);
        $db = new PDO($config['db']['driver'] . ':host=' . $config['db']['host'] . ';dbname=' . $config['db']['database'], $config['db']['username'], $config['db']['password']);
 
        foreach ($config['jobs'] as $item) {
            if ($item['active'] == true) {
                switch ($item['type']) {
                    case 0:
                    {
                        $query = $db->prepare("UPDATE " . $item['table-name'] . " SET `" . $item['change-column'] . "`=`" . $item['change-column'] . "`+" . $item['change'] . " WHERE `" . $item['user-column'] . "`=?");
                        $query->execute(array($_GET['player']));
                        break;
                    }
                    case 1:
                    {
                        $query = $db->prepare("INSERT INTO " . $item['table-name'] . " (`" . $item['user-column'] . "`,`" . $item['change-column'] . "`) VALUES (?, " . $item['default'] + $item['change'] . ") ON duplicate KEY UPDATE `" . $item['change-column'] . "`=`" . $item['change-column'] . "`+" . $item['change']);
                        $query->execute(array($_GET['player']));
                        break;
                    }
                    case 2:
                    {
                        $query = $db->prepare("UPDATE " . $item['table-name'] . " SET `" . $item['change-column'] . "`=`? WHERE `" . $item['user-column'] . "`=?");
                        $query->execute(array($item['change'], $_GET['player']));
                        break;
                    }
                    case 3:
                    {
                        $query = $db->prepare("INSERT INTO " . $item['table-name'] . " (`" . $item['user-column'] . "`,`" . $item['change-column'] . "`) VALUES (?, ?) ON duplicate KEY UPDATE `" . $item['change-column'] . "`=?");
                        $query->execute(array($_GET['player'], $item['change'], $item['change']));
                        break;
                    case 4:
                    {
                    //var_dump($item);
                        $query = $db->prepare("INSERT INTO " . $item['table-name'] . " (`".$item['nicknamefromtable'] . " `,`" . $item['item_idfromtable'] . "`, `" . $item['item_amountfromtable'] . "`) VALUES (`". $item['user-column'] ."`, `". $item['item_id'] ."`, `". $item['change-column'] ."`);
                        $query->execute(array($_GET['player']));
                        break;
                    }
                    //Добавил кейс 4. Посмотри плз соответствие в названиях и правильно ли они тут приведены. Спс.
                }
 
                if ($db->errorCode() != 0000) {
                    $error_array = $db->errorInfo();
                    die("SQL error: " . $error_array[2] . '');
                }
            }
        }
 
        echo 'ok';
    } catch (PDOException $e) {
        die('Error: ' . $e->getMessage());
  // }
//} else {
  die('DO NOT HACK ME!');
//}
 
Такие сложные скрипты =) Только зачем? не понятно что-то, я себе сделал проще намного.
Есть скрипт, если на него приходит определенный запрос (с ником и секретным кодом), то он проверяет, совпадает ли код, если да, то проверяет существует ли такой ник в базе, если нет то создает новую запись, если существует то просто апдейтит старую.
 

Поделиться этой страницей

Назад
Верх