PHP / SQL Ban状态未回显
Posted
技术标签:
【中文标题】PHP / SQL Ban状态未回显【英文标题】:PHP / SQL Ban status not echoing 【发布时间】:2018-08-07 00:53:20 【问题描述】:我创建了一个 Banned.php 页面,所以说用户被禁止了,只要他们被禁止,他们就会重定向到banned.php 页面!
问题我将status
设置为1
很好,但禁止Reason
不会为该用户回显
bans
的 SQL 表有这些表 username
& reason
代码:
<?php
//Check if the user is banned
$SQL = $odb -> prepare("SELECT `status` FROM `users` WHERE `username` = :username");
$SQL -> execute(array(':username' => $username));
$status = $SQL -> fetchColumn(0);
if ($status == 1)
$ban = $odb -> query("SELECT `reason` FROM `bans` WHERE `username` = '$username'") -> fetchColumn(0);
if(empty($ban)) $ban = "No reason given.";
$error = 'You are banned. Reason: '.htmlspecialchars($ban);
?>
如果您可以帮助我尝试 error_reporting 但无法获取错误,则不会显示原因/从 SQL 中获取
【问题讨论】:
我在这里看到了 SQL 注入和错误的代码结构。 请提供 1) 连接创建代码; 2)您用于错误报告的代码; 3)CREATE TABLE
语法。
我还建议只使用一个表users
,其结构如下:user_id | username | banned | ban_reason
。
【参考方案1】:
$sql = "SELECT reason FROM bans WHERE username LIKE '$username' LIMIT 1";
$result = $odb->query($sql);
然后$ban = $result->fetchColumn();
或$ban = $result->fetchColumn()[0];
$stmt
可能是一个不太容易混淆的变量名,因此$sql
通常用于查询字符串。
fetchColumn()
至少可以与PDO
一起使用,但不清楚使用的是哪个驱动程序。
【讨论】:
【参考方案2】:示例数据库表
(运行代码 sn-p 以查看“格式化”表。)
<table border="1px solid black;">
<tr>
<td>UserID</td>
<td>Username</td>
<td>Status</td>
<td>Reason</td>
</tr>
<tr>
<td>51414</td>
<td>FelixCrystal</td>
<td>0</td>
<td>System exploitation.</td>
</tr>
</table>
示例代码
$Server = "localhost";
$Username = "myDBUsername";
$Password = "myDBPassword";
$dbName = "myDBName";
$Connect = mysqli_Connect($Server, $Username, $Password, $dbName);
$SQL = "SELECT Status,Reason FROM Users WHERE UserID='51414'";
$Result = MySQLi_Query($this->Link, $SQL);
// Maybe 'If ($Result->num_rows == 0)' would be better to avoid duplicate accounts (Which shouldn't happen for ID based tables anyways)
If ($Result->num_rows > 0)
While ($Row = $Result->fetch_assoc())
$Status = $Row["Status"];
$Reason = $Row["Reason"];
If ($Status == 0 /* Or whatever your 'banned' value is */)
Header("Location: https://www.example.com/MyBannedPage.php?Reason=$Reason");
/*
I used a GET request for this example. You can use anything you'd like such as GET, POST, Sessions, Cookies, etc.
*/
Else
// Account is active!
Else
Echo "Error looking up account.";
MyBannedPage.php
<?php
If (Isset($_GET["Reason"]))
$Reason = $_GET["Reason"];
Else
$Reason = "Banned reason not supplied.";
Echo "Your account has been banned. Reason: $Reason";
?>
【讨论】:
其实他用的是PDO扩展。 @dakis,是的,我意识到谢谢。这更多是为了展示检索的逻辑和选项。它可以很容易地转换为 PDO。 编码风格很奇怪。建议使用小写的 GET/POST 参数、保留关键字和函数名。此外,对于 URL,最好使用小写(在 Linux 服务器中,大写 URL 与小写 URL 不同)。最后,UserID
可能是一个整数,不需要用单引号括起来。
@Raptor,我知道这不是传统的,但它工作得很好。我使用 CentOS,它是一个没有问题的 Linux 发行版。但是,我确实验证了大写和小写字母的 URL,这无疑是一个不必要的步骤,但仍然是我的偏好。只要不损失性能(不考虑微优化),我的语法和任何语法一样好。
单引号除外。您对此很满意,因为它可以被排除在外。当我们知道该值是整数时,无需进行不必要的比较,因此感谢您的观察。【参考方案3】:
好的,我设法获得了显示的原因,但是当从面板输入状态时,它使用 INSERT
不更新,因此不显示最新的禁止原因,如下所示:http://prntscr.com/kfq2pi
gggggggg
是旧的禁止原因,Banned as a test
是新的原因,但它一遍又一遍地插入这里是我尝试使用 UPDATE
但无济于事的代码
代码:
if ($status != $_POST['status'])
$SQL = $odb -> prepare("UPDATE
usersSET
status= :status WHERE
ID= :id");
$SQL -> execute(array(':status' => $_POST['status'], ':id' => $id));
$status = htmlspecialchars($_POST['status']);
$reason = htmlspecialchars($_POST['reason']);
$SQLinsert = $odb -> prepare('INSERT INTO
bansVALUES(:username, :reason)');
$SQLinsert -> execute(array(':username' => $username, ':reason' => $reason));
$update = true;
$updateMsg = "Users status updated from $status to $_POST['status'] with Reason: $_POST['reason'] ";
【讨论】:
再次:为了能够正确帮助到您,请提供1)连接创建代码; 2) 您用于错误报告的代码; 3)CREATE TABLE
语法。此外,给我们整个 php 页面的代码,以便我们弄清楚您正在使用的值的语义含义。从截图看,你的表结构好像不对。【参考方案4】:
Sql查询: SELECT * FROM users WHERE status = '1' AND username = :username
【讨论】:
以上是关于PHP / SQL Ban状态未回显的主要内容,如果未能解决你的问题,请参考以下文章