变量不适用于 SQL
Variable not working with SQL
我认为我的问题相当简单,但经过一整天尝试不同的变体后,我不得不打扰你们,如果已经涵盖,请原谅,但我找不到足够接近的例子
我有一个 php 文件,它是一个简单的 html 表单的处理文件
Process.php:
<?php
error_reporting(E_ALL); ini_set('display_errors', 1);
$host="1.2.3.4:3306"or die("wrong server"); // Host name
$username="username"or die("wrong Username"); // Mysql username
$password="password"or die("Wrong Password"); // Mysql password
$db_name="db-name"or die("wrong DB"); // Database name
$tbl_name="banned"or die("Wrong table"); // Table name
$member = isset($_REQUEST['member']) ? $_REQUEST['member'] : "";
// Connect to server and select database.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
$find_member = mysql_query("SELECT member FROM banned WHERE member='$member'")or
die(mysql_error());
$ban = mysql_fetch_array($find_member);
if($member == $ban['member']){
echo ("this member is banned");
}
else {
echo ("<form method='post' action='http://example.com/access.php'>
<input type='text' style='display:none;' value='<?php echo
htmlspecialchars($member);?'/>'
<button type='submit'>Continue</button>");
}
?>
Form.html:
<form method="post" action="http://example.com/process.php">
<input type="text" name="member">
<input type="submit">
</form>
我要完成的任务:
用户将在 form.html 中输入他们的会员编号并单击提交,process.php 将捕获 POST 并回显文本 "this member is banned" 或者如果会员编号是不在被禁止的 sql table 上,然后显示一个带有隐藏输入字段的 html 按钮,它将把 $member 变量带到下一页
实际发生了什么
无论在 form.html 中输入什么数字,它总是显示 html 按钮。黑名单上有一个号码,但输入时仍然显示按钮
报错
php和sql错误报告显示没有错误
旁注
数据库结构
member VARCHAR(20)/id(自增)/Time(时间戳-defalt:current时间戳)
会员编号为字母数字,最多 15 个字符
示例:+ayw7394
使用初始错误:
if($member = $ban['member']){
被替换为:
if($member == $ban['member']){
但无论输入哪个数字都会产生回显 "banned member" 消息的相反效果
好像
if statements are being ignored
谁能给我一些建议吗?
感谢您迄今为止的帮助
"no matter what number is entered into the form.html it always displays the html button. there is one number on the blacklist but when entered still displays the button"
原因是这样的:
在此 if($member = $ban['member'])
中,您 assigning =
instead of comparing ==
将 $member
与 "member" 行进行比较。
将其更改为 if($member == $ban['member'])
- 我必须注意,您现在的代码是对 SQL injection. Use
mysqli
with prepared statements, or PDO with prepared statements 开放的,它们更安全。
脚注:
</input>
不是有效的结束标记,可以安全删除。
编辑:
还有这个代码块:
echo ("<form method='post' action='http://example.com/access.php'>
<input type='text' style='display:none;' value='<?php echo
htmlspecialchars($member);?'/>'
<button type='submit'>Continue</button>");
您已经在 PHP,因此不需要 <?php echo
和 ?>
改为:
echo ("<form method='post' action='http://example.com/access.php'>
<input type='text' value='".htmlspecialchars($member)."'/>
<button type='submit'>Continue</button>");
这可以解释为什么它显示 "banned",因为您之后可能会重新点击它。
- 我建议您将其删除并改用重定向。
示例,并将其替换为回显按钮:
else{
header("Location: your_form.html");
exit;
}
你的问题在行
if($member = $ban['member']){
这实际上总是正确的,因为您将 $member
设置为等于 $ban['member']
。你的意思是?
if($member == $ban['member']){
回显 $member 和 $ban['member'] 看它们是相同还是不同的值。
另一个步骤,除了像其他人所说的那样防止 SQL 注入,将是在您的输入和 MYSQL 字段上使用 运行 TRIM 命令来确保空间不是问题。
我认为我的问题相当简单,但经过一整天尝试不同的变体后,我不得不打扰你们,如果已经涵盖,请原谅,但我找不到足够接近的例子
我有一个 php 文件,它是一个简单的 html 表单的处理文件
Process.php:
<?php
error_reporting(E_ALL); ini_set('display_errors', 1);
$host="1.2.3.4:3306"or die("wrong server"); // Host name
$username="username"or die("wrong Username"); // Mysql username
$password="password"or die("Wrong Password"); // Mysql password
$db_name="db-name"or die("wrong DB"); // Database name
$tbl_name="banned"or die("Wrong table"); // Table name
$member = isset($_REQUEST['member']) ? $_REQUEST['member'] : "";
// Connect to server and select database.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
$find_member = mysql_query("SELECT member FROM banned WHERE member='$member'")or
die(mysql_error());
$ban = mysql_fetch_array($find_member);
if($member == $ban['member']){
echo ("this member is banned");
}
else {
echo ("<form method='post' action='http://example.com/access.php'>
<input type='text' style='display:none;' value='<?php echo
htmlspecialchars($member);?'/>'
<button type='submit'>Continue</button>");
}
?>
Form.html:
<form method="post" action="http://example.com/process.php">
<input type="text" name="member">
<input type="submit">
</form>
我要完成的任务:
用户将在 form.html 中输入他们的会员编号并单击提交,process.php 将捕获 POST 并回显文本 "this member is banned" 或者如果会员编号是不在被禁止的 sql table 上,然后显示一个带有隐藏输入字段的 html 按钮,它将把 $member 变量带到下一页
实际发生了什么
无论在 form.html 中输入什么数字,它总是显示 html 按钮。黑名单上有一个号码,但输入时仍然显示按钮
报错
php和sql错误报告显示没有错误
旁注 数据库结构
member VARCHAR(20)/id(自增)/Time(时间戳-defalt:current时间戳)
会员编号为字母数字,最多 15 个字符 示例:+ayw7394
使用初始错误:
if($member = $ban['member']){
被替换为:
if($member == $ban['member']){
但无论输入哪个数字都会产生回显 "banned member" 消息的相反效果
好像
if statements are being ignored
谁能给我一些建议吗?
感谢您迄今为止的帮助
"no matter what number is entered into the form.html it always displays the html button. there is one number on the blacklist but when entered still displays the button"
原因是这样的:
在此 if($member = $ban['member'])
中,您 assigning =
instead of comparing ==
将 $member
与 "member" 行进行比较。
将其更改为 if($member == $ban['member'])
- 我必须注意,您现在的代码是对 SQL injection. Use
mysqli
with prepared statements, or PDO with prepared statements 开放的,它们更安全。
脚注:
</input>
不是有效的结束标记,可以安全删除。
编辑:
还有这个代码块:
echo ("<form method='post' action='http://example.com/access.php'>
<input type='text' style='display:none;' value='<?php echo
htmlspecialchars($member);?'/>'
<button type='submit'>Continue</button>");
您已经在 PHP,因此不需要 <?php echo
和 ?>
改为:
echo ("<form method='post' action='http://example.com/access.php'>
<input type='text' value='".htmlspecialchars($member)."'/>
<button type='submit'>Continue</button>");
这可以解释为什么它显示 "banned",因为您之后可能会重新点击它。
- 我建议您将其删除并改用重定向。
示例,并将其替换为回显按钮:
else{
header("Location: your_form.html");
exit;
}
你的问题在行
if($member = $ban['member']){
这实际上总是正确的,因为您将 $member
设置为等于 $ban['member']
。你的意思是?
if($member == $ban['member']){
回显 $member 和 $ban['member'] 看它们是相同还是不同的值。
另一个步骤,除了像其他人所说的那样防止 SQL 注入,将是在您的输入和 MYSQL 字段上使用 运行 TRIM 命令来确保空间不是问题。