为什么我无法回复adm_no
,adm_dt
等内容?
require_once("lib/connection.php");
$adm_no = $_POST['adm_no'];
if (!$adm_no == "intval") echo "You Entered wrong Admission no Recheack Admission no";
exit();
$clas = $_POST['clas'];
$query = "SELECT * FROM $clas WHERE adm_no = $adm_no";
$result = mysql_query($query);
//searchs the query in db.
while ($result1 = mysql_fetch_array($result)) {
$adm_no = $result1['adm_no'];
$adm_dt = $result1['adm_dt'];
$name = $result1['name'];
$dob = $result1['dob'];
$f_name = $result1['f_name'];
$f_office = $result1['f_office'];
$f_o_no = $result1['f_o_no'];
$m_name = $result1['m_name'];
$m_office = $result1['m_office'];
$addr = $result1['addr'];
};
echo "Admission no = ";
$adm_no;
echo " <p>Admission Date </p>";
echo " <p>Name </p>";
echo " <p>Class </p>";
echo " <p>D.O.B </p>";
echo " <p>Father s name </p>";
echo " <p>Office address </p>";
echo " <p>Office No </p>";
echo " <p>Mother s name </p>";
echo " <p>Office Address </p>";
echo " <p>Address </p>";
echo " <p>Phone no </p>";
答案 0 :(得分:4)
您有语法错误
echo "Admission no = " ;$adm_no ;
应该是
echo "Admission no = " ;
echo $adm_no ;
或
echo "Admission no = " . $adm_no ;
答案 1 :(得分:4)
好吧,以下是print
字符串,然后对变量执行任何操作:
echo "Admission no = " ;$adm_no ;
你可能会去哪里:
echo "Admission no = " . $adm_no;
除此之外,您是否知道在 while
循环迭代了所有结果(如果多于一个)之后仅评估打印逻辑。也就是说,变量将仅保留 last 记录的值。
答案 2 :(得分:4)
即使输入exit();
正常,每次都会$adm_no
执行此问题。
更改此
if (!$adm_no=="intval")
echo "You Entered wrong Admission no Recheack Admission no" ;
exit();
到
if (!$adm_no=="intval")
{
echo "You Entered wrong Admission no Recheack Admission no" ;
exit();
}
答案 3 :(得分:3)
正如我在上一个(已删除)问题中告诉您的那样,您有一个 SQL注入孔。
这是如何解决它。
更改此代码:
编码恐怖
$adm_no = $_POST['adm_no'];
if (!$adm_no == "intval")
echo "You Entered wrong Admission no Recheack Admission no";
exit();
$clas = $_POST['clas'];
$query = "SELECT * FROM $clas WHERE adm_no = $adm_no";
进入此代码,该代码未暴露于SQL注入危险
$adm_no = mysql_real_escape_string($_POST['adm_no']);
if (!$adm_no == "intval") {
echo "You Entered wrong Admission no Recheack Admission no"; exit();
}
$allowed_tables = array('table1', 'table2');
$clas = $_POST['clas'];
if (in_array($clas, $allowed_tables))
{
$query = "SELECT * FROM `$clas` WHERE adm_no = '$adm_no'";
}
我知道If
只会接受整数,但是前一个问题中的if被注释掉了,因此它来来去去,所以在将它们注入查询之前总是先输入你的输入!
请注意代码中的if
如何无效,因为您忘记将then
放在括号{}
后面,导致exit();
始终执行。
有关SQL注入的更多信息,请参阅:How does the SQL injection from the "Bobby Tables" XKCD comic work?
有关为什么mysql-real-escape_string
或PDO不适用于动态表名称的信息
见:How to prevent SQL injection with dynamic tablenames?
并且:Sample code to fix this particular SQL-injection hole
XSS洞
要修复可能的XSS漏洞,请不要执行
编码恐怖
echo "Admission no = ".$adm_no;
但请改为:
echo "Admission no = ".htmlspecialchars($adm_no);
在你的情况下,似乎$ adm_no只能保存一个整数,但我没有表定义所以我不能确定。最好是在安全的一面,并始终使用htmlspecialchars
来逃避动态输出。
请参阅:What are the best practices for avoiding xss attacks in a PHP site
答案 4 :(得分:2)
声明1:echo "Admission no = " ;
声明2:$adm_no ;
你没有回应变量。
你应该有类似的东西:
<p>Admission no = <?php echo htmlspecialchars($adm_no); ?></p>
答案 5 :(得分:1)
在循环中分配变量的方式没有任何意义:如果SQL查询返回的行数超过1行,则代码将只替换值。您可能希望在循环中回显结果 。
此处存在语法错误:echo "Admission no = " ;$adm_no ;
..它应为echo "Admission no = ".$adm_no;
当您回显结果时,实际上并没有回显变量:echo " <p>Admission Date: $adm_dt </p>";
答案 6 :(得分:0)
因为 echo 接受参数为逗号分隔列表,例如
echo $one, "two"
使用逗号也是可能的,但最好只使用支持变量替换的heredoc语法,如果需要用换行符输出大块文本
echo <<<HEREDOC
Your text with $variables or {$variables} here
with newlines and other nifty plaintext formatting
HEREDOC;