Баланс - MySQL
Формулировка задачи:
Как сделать, чтобы при нулевом балансе выдавало ошибку и не записывались данные в таблицу?
Есть две таблицы одна usertbl(id,username,password,balance) articles(id, gnumber, telephone, author, publicationdate)
<?php session_start(); if(!isset($_SESSION["session_username"])): header("location:login.php"); else: ?> <?php if(isset($_POST["add"])){ $gnumber= htmlspecialchars($_POST['gnumber']); $telephone=htmlspecialchars($_POST['telephone']); $author=htmlspecialchars($_POST['author']); $publicationdate=htmlspecialchars($_POST['publicationdate']); if(!empty($gnumber) && !empty($telephone) && !empty($author) && !empty($publicationdate)) { $sql="INSERT INTO articles (gnumber, telephone, author, publicationdate) VALUES ('$gnumber','$telephone', '$author', '$publicationdate' )"; $result=mysqli_query($con, $sql); $editbalance="UPDATE usertbl SET balance=balance-1 WHERE username='".$_SESSION['session_username']."'"; $minus=mysqli_query($con, $editbalance); header("Cache-Control: no-store,no-cache,mustrevalidate"); } else { $message = "Имя пользователя уже занято!"; } } else { $message = "Все поля обязательны для заполнения!"; } ?> <?php $balance = mysqli_query ($con, "SELECT * FROM usertbl WHERE username='".$_SESSION['session_username']."'"); while ($myrow = mysqli_fetch_assoc ($balance)) {echo '<b>Баланс: '. $myrow['balance'].'</b>';}?>
Решение задачи: «Баланс»
textual
Листинг программы
<?php session_start(); if(!isset($_SESSION["session_username"])): header("location:login.php"); else: ?> <?php if(isset($_POST["add"])){ $gnumber= htmlspecialchars($_POST['gnumber']); $telephone=htmlspecialchars($_POST['telephone']); $author=htmlspecialchars($_POST['author']); $publicationdate=htmlspecialchars($_POST['publicationdate']); $balance = mysqli_query ($con, "SELECT username FROM usertbl WHERE username='".$_SESSION['session_username']."' AND balance>0"); if (mysqli_num_rows($balance) > 0) { if(!empty($gnumber) && !empty($telephone) && !empty($author) && !empty($publicationdate)) { $sql="INSERT INTO articles (gnumber, telephone, author, publicationdate) VALUES ('$gnumber','$telephone', '$author', '$publicationdate' )"; $result=mysqli_query($con, $sql); $editbalance="UPDATE usertbl SET balance=balance-1 WHERE username='".$_SESSION['session_username']."'"; $minus=mysqli_query($con, $editbalance); header("Cache-Control: no-store,no-cache,mustrevalidate"); } else { $message = "Имя пользователя уже занято!"; } } else { $message = "Недостаточно баланса на счету!"; } } else { $message = "Все поля обязательны для заполнения!"; } ?> <?php $balance = mysqli_query ($con, "SELECT * FROM usertbl WHERE username='".$_SESSION['session_username']."'"); while ($myrow = mysqli_fetch_assoc ($balance)) {echo '<b>Баланс: '. $myrow['balance'].'</b>';}?>
Объяснение кода листинга программы
- Стартует сессия PHP
- Проверяется, установлена ли переменная сессии
session_username
. Если нет, то происходит перенаправление на страницу входа в систему. - Проверяется, был ли отправлен POST-запрос с ключом
add
. Если да, то выполняется следующий код. - Значения переменных $gnumber, $telephone, $author и $publicationdate получают специальную обработку, чтобы предотвратить SQL-инъекции.
- Выполняется SQL-запрос, чтобы выбрать имя пользователя из таблицы usertbl, где имя пользователя равно значению переменной сессии
session_username
и баланс больше 0. - Если в результате запроса есть строки, то проверяется, не пустые ли значения переменных $gnumber, $telephone, $author и $publicationdate. Если все они не пустые, то выполняется следующий код.
- Выполняется SQL-запрос для вставки новой записи в таблицу articles с значениями переменных $gnumber, $telephone, $author и $publicationdate.
- Выполняется SQL-запрос для обновления баланса в таблице usertbl, где имя пользователя равно значению переменной сессии
session_username
, и баланс уменьшается на 1. - Если произошли ошибки при выполнении SQL-запросов, то выводится сообщение об ошибке.
- Если баланс на счету пользователя после вычета 1 равен 0, то выводится сообщение
Недостаточно баланса на счету!
. - Если не все поля формы заполнены, то выводится сообщение
Все поля обязательны для заполнения!
. - Выполняется SQL-запрос для выбора всех данных из таблицы usertbl, где имя пользователя равно значению переменной сессии
session_username
. - В цикле while выводятся данные из последней SQL-запроса, включая баланс пользователя.