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

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

Тема в разделе "Веб-обвязки и лаунчеры", создана пользователем Alex_Bond, 9 фев 2013.

  1. Автор темы
    Alex_Bond

    Alex_Bond Старожил Девелопер Пользователь

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

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

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

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

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

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

    Думаю что те кто понимают хотя бы немного PHP смогут разобраться в работе)
    Ну или я всетаки созрею написать документацию)
     
    SSS_Steep_Boy_SSS, Nightfear, Eugene1997 и 6 другим нравится это.
  2. Хостинг MineCraft
    <
  3. Ifimidey

    Ifimidey Старожил Пользователь

    Баллы:
    103
    Skype:
    ifimidey
    тот паренек это я:trf:
     
    Nightfear нравится это.
  4. Мистер Лень

    Мистер Лень Активный участник

    Баллы:
    88
    Имя в Minecraft:
    Admin
    Только смысл это все выкладывать в паблик:why:
    Столько старания, времени, сил...
     
  5. Автор темы
    Alex_Bond

    Alex_Bond Старожил Девелопер Пользователь

    Баллы:
    153
    Skype:
    Alex.Bond.d
    Имя в Minecraft:
    Alex_Bond_UA
    ахахаха)) ну есть те кто и такого не могут)
     
    Nightfear нравится это.
  6. Мистер Лень

    Мистер Лень Активный участник

    Баллы:
    88
    Имя в Minecraft:
    Admin
    Таки надо было (сарказм) написать :(
     
  7. Nightfear

    Nightfear Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    nightfear
    Слу, я тут чутка подредактил твой код(прости плз). Хочу сделать так, что бы выдавало ,допустим, 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=ник
     
  8. Автор темы
    Alex_Bond

    Alex_Bond Старожил Девелопер Пользователь

    Баллы:
    153
    Skype:
    Alex.Bond.d
    Имя в Minecraft:
    Alex_Bond_UA
    зачем свой способ то?) просто 3й тип юзай и будет тебе счастье)
     
    Nightfear нравится это.
  9. Nightfear

    Nightfear Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    nightfear
    блин, действительно) спасибо. А в массив новые елементы добавляются так как я сделал?
     
  10. Автор темы
    Alex_Bond

    Alex_Bond Старожил Девелопер Пользователь

    Баллы:
    153
    Skype:
    Alex.Bond.d
    Имя в Minecraft:
    Alex_Bond_UA
    там все верно) у тебя всеравно 1 действие)
     
    Alisher-98 и Nightfear нравится это.
  11. Eugene1997

    Eugene1997 Активный участник

    Баллы:
    88
    а скрипт на бесплатном хостинге работает? Hostinger :trf:
     
  12. Nightfear

    Nightfear Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    nightfear
    странно, люди только что голосовали - в БД не добасилось.
     
  13. Автор темы
    Alex_Bond

    Alex_Bond Старожил Девелопер Пользователь

    Баллы:
    153
    Skype:
    Alex.Bond.d
    Имя в Minecraft:
    Alex_Bond_UA
    хмм. А можно схему таблички?
     
    Nightfear нравится это.
  14. Автор темы
    Alex_Bond

    Alex_Bond Старожил Девелопер Пользователь

    Баллы:
    153
    Skype:
    Alex.Bond.d
    Имя в Minecraft:
    Alex_Bond_UA
    Ой. Даже не знаю. Должен...
     
    Nightfear нравится это.
  15. Nightfear

    Nightfear Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    nightfear
    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
     
  16. Nightfear

    Nightfear Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    nightfear
    хрень. Вот скрин)
     

    Вложения:

  17. Автор темы
    Alex_Bond

    Alex_Bond Старожил Девелопер Пользователь

    Баллы:
    153
    Skype:
    Alex.Bond.d
    Имя в Minecraft:
    Alex_Bond_UA
    Понял. юзернейм не уникальное поле?
     
    Nightfear нравится это.
  18. Nightfear

    Nightfear Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    nightfear
    Нет, только поле ID уникальное
     
    zuma2 нравится это.
  19. Автор темы
    Alex_Bond

    Alex_Bond Старожил Девелопер Пользователь

    Баллы:
    153
    Skype:
    Alex.Bond.d
    Имя в Minecraft:
    Alex_Bond_UA
    тогда понятно... тогда действительно твой вариант надо...
     
    Nightfear нравится это.
  20. Nightfear

    Nightfear Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    nightfear
    Тогда... Вот скрипт. Не работает.

    В чем сок?

    Код:
    <?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!');
    //}
     
  21. Loger

    Loger Активный участник Пользователь

    Баллы:
    88
    Skype:
    trofimov1995trofimov
    Такие сложные скрипты =) Только зачем? не понятно что-то, я себе сделал проще намного.
    Есть скрипт, если на него приходит определенный запрос (с ником и секретным кодом), то он проверяет, совпадает ли код, если да, то проверяет существует ли такой ник в базе, если нет то создает новую запись, если существует то просто апдейтит старую.
     

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