无法回显变量

时间:2011-05-19 11:44:44

标签: php mysql

为什么我无法回复adm_noadm_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>";

7 个答案:

答案 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注入孔。
这是如何解决它。

更改此代码:

enter image description here 编码恐怖

$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漏洞,请不要执行

enter image description here 编码恐怖

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)

  1. 在循环中分配变量的方式没有任何意义:如果SQL查询返回的行数超过1行,则代码将只替换值。您可能希望在循环中回显结果

  2. 此处存在语法错误:echo "Admission no = " ;$adm_no ; ..它应为echo "Admission no = ".$adm_no;

  3. 当您回显结果时,实际上并没有回显变量: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;