PHP система промокодов и проверка в бд

Имеется форма для ввода промокода:

    <div class="block-head">Активация бонус-кодов</div>
    <div class="block-body">
        <div class="info_warning">
            На данной странице Вы можете активировать, имеющийся у Вас, промо-код. Промо-коды можно найти на серверах, 
            получить в различных мероприятиях, получить как подарок на какой-либо праздник и т.д. Подробнее о получении и активации 
            Вы можете узнать в разделе <a href="/faq.html"><b>FAQ по проекту</b></a>.
        </div><br>
        Если у Вас есть бонус-код, то для получения различных бонусов введите его на этой странице.
        Благодаря бонус-кодам Вы можете получить:
        <br>
        <ul style="list-style: none;">
            <li>- Различного рода предметы в игре;</li>
            <li>- Денежный бонус на счет;</li>
            <li>- Поноценный статус на сервере.</li>
        </ul>
        <div class="promo_cont_title">Активация промо-кода</div>
        <div class="promo_code_line">
            Активация Вашего промо-кода<br/>
            <span class="promo_code_desc">Введите промо-код в поле</span>
            <div class="promo_block_button">
            <form method="post" action="">
                <input type="text" name="key" value="" placeholder="AAAA-BBBB-CCCC-DDDD" class="promo_tf" maxlength="19" required> 
                <a class="promo_code_info hint cursor" data-original-title="Промо-код обязательно должен состоять из 16 символов, в котором между каждыми 4-мя должен стоять дефис (тире)."><span class="icon-info"></span></a>
                <input type="submit" value="Активировать" class="promo_button">

            </form>
            </div>
            <div style="clear: right;"></div>
        </div>
    </div>
</div>

В бд есть таблица promocodes в которой есть строка с промокодом code, и строка price в которой должно содержится число, которое является суммой, зачисленной на баланс. Строка с балансом находится в таблице dle_users, в строке money.

Нужно чтобы при нажатии "Активировать" промокод проверялся в строке code(в таблице promocodes), и если он правильный, то изменял строку money(в таблице dle_users) на число, которое было в строке price.


Ответы (1 шт):

Автор решения: Pavel
if(isset($_POST['key'] && !empty($_POST['key'])){//так же критически важно провести проверку получаемых данных на содержание sql инъекций
  $userID = $_POST['user'];//пример получения id юзера которому идет зачисление
 //if(!ctype_digit($userID)) die('Некорректный id');
  $localhoctlogin= 'root';
  $password = '';
  $database = 'database_name';
  $code = htmlspecialchars($_POST['key']);
  $connection = $mysqli = new mysqli ("127.0.0.1", $localhoctlogin, $password, $database);
  if($connection){
    $mysqli->query ("SET NAMES 'utf8'");
    $getCode = $mysqli->query ("SELECT `price` FROM `promocodes` WHERE `code`='$code' LIMIT 1");
    $result = $getCode ->num_rows;
    if($result == '0') die('Неверный промокод');
    else{
       $promo = mysqli_fetch_assoc($getCode);
       $money = $promo['money'];
       $updMoney= $mysqli->query ("UPDATE `dle_users` SET `money` = `money`+'$money' WHERE `userID` = '$userID' LIMIT 1;");
       if($updMoney) echo 'Вам начислено '.$money.' сомони';
       else die('Неожиданная ошибка начисления бонусов');
    }
  }
  else die('Ошибка подключения к базе данных');
}
→ Ссылка