大家好,这是我编写的PHP代码,用于减少MySQL上的“Credit”表,当人们使用Credit来购买设施时。但我想当他们的“信用”为0时他们会得到错误“你的信用不够,请购买信用”。但我看到“回声”并没有给出这个错误!我的代码有什么问题?
<?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;
?>
答案 0 :(得分:1)
首先,我将解决您的初始问题
您遇到的问题是,UPDATE
查询是以某种方式构建的,它始终会更新表。如果我们仔细查看各个部分,您可以看到差异。
SET `Credit` = IF(Credit > 0, Credit - 20, 0)
在SET
部分,您将根据if条件覆盖Credit
列中的值。 if条件总是返回一个值。如果Credit
的值为0或更小,它将被覆盖为0,而在所有其他情况下它将减少20。这意味着无论如何都会有更新。
WHERE `username` = $username
where子句限制被覆盖的行,但只是将username
列与给定的用户名进行比较。
因此,要将UPDATE
限制为只有具有给定用户名和适当信用额度的行,您需要将这两个条件打包到WHERE
UPDATE
块中} query:
UPDATE table
SET `Credit` = `Credit` - 20
WHERE `username` = $username AND `Credit` >= 20;
在这种情况下,只会更新那些包含给定用户名并且还有足够信用的行。
其他问题
您正在使用已弃用的数据库函数。这意味着,这些功能不符合当今的标准。您应该了解mysqli prepared statements或PDO prepared statements以使用现代工具。
答案 1 :(得分:0)
<?php
if (session_id() == "")
{
session_start();
}
if (!isset($_SESSION['username']))
{
$accessdenied_page = '';
header('Location: '.$accessdenied_page);
exit;
}
// NOTE: your $username should be reflected in the actual username from the User...
$username = 'username';
$success_page = './League.php';
$dbservername = 'localhost';
$dbusername = 'bceus_user';
$dbpassword = 'password';
$dbname = 'bceus_data';
$dbtable = 'details2';
$conn = new mysqli($dbservername, $dbusername, $dbpassword, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "Select Credit from `".$dbtable."` WHERE `username` = `".$username."`";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
if ($row['Credit'] < 20) {
echo "Your Credit is not Enough , Please Buy a Credit";
}
else {
$sql2 = "update `".$dbtable."` set Credit = Credit - 20 WHERE `username` = `".$username."`";
$conn->query($sql2);
}
}
} else {
echo "0 results";
}
$conn->close();
header('Location: '.$success_page);
exit;
?>