大家好,这是我编写的 PHP 代码,用于在人们使用信用购买设施时减少 MySQL 上的“信用”表。但我希望当他们的“信用”为 0 时,他们会收到错误“您的信用不够,请购买信用”。但我看到“echo”没有给出这个错误!我的代码有什么问题?
<?php
if (session_id() == "")
{
session_start();
}
if (!isset($_SESSION['username']))
{
$accessdenied_page = '';
header('Location: '.$accessdenied_page);
exit;
}
$mysql_server = 'localhost';
$mysql_username = '*******';
$mysql_password = '******';
$mysql_database = '******';
$mysql_table = 'details2';
$success_page = 'League.php';
$username = 'username';
$db = mysql_connect($mysql_server, $mysql_username, $mysql_password);
if (!$db)
{
die('Failed to connect to database server!<br>'.mysql_error());
}
mysql_select_db($mysql_database, $db) or die('Failed to select database<br>'.mysql_error());
$sql = "UPDATE `".$mysql_table."` SET `Credit` = `Credit` - 20 WHERE `username` = `".$username."` AND `Credit` >= 20";
mysql_query($sql, $db);
header('Location: '.$success_page);
exit;
?>
最佳答案
首先我将解决您最初的问题
您遇到的问题是,您的UPDATE
查询是以某种方式构建的,它总是更新表。如果我们仔细观察各个部分,您会发现差异。
SET `Credit` = IF(Credit > 0, Credit - 20, 0)
在 SET
部分中,您根据 if 条件覆盖 Credit
列中的值。 if 条件始终返回一个值。如果 Credit
的值为 0 或更小,它将被覆盖为 0,而在所有其他情况下它将减少 20。这意味着无论如何都会有更新。
WHERE `username` = $username
where 子句限制被覆盖的行,但仅将username
列与给定的用户名进行比较。
因此,要将您的 UPDATE
限制为仅具有给定用户名和适当积分数量的行,您需要将这两个条件打包到 WHERE
block 中您的UPDATE
查询:
UPDATE table
SET `Credit` = `Credit` - 20
WHERE `username` = $username AND `Credit` >= 20;
在这种情况下,只有那些包含给定用户名并且具有足够积分的行才会被更新。
其他问题
您正在使用已弃用的数据库函数。这意味着这些功能不符合当今的标准。您应该了解mysqli prepared statements或PDO prepared statements使用现代工具。
关于php - 为什么我的 PHP 条件不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48355615/