数据无法在表单中显示

时间:2010-03-21 18:49:50

标签: php mysql

关于我的系统大学投诉..工作人员可以使用此系统进行投诉。 第一个用户填写表格投诉并提交后提交用户可以查看投诉。现在问题是投诉无法显示....

此用户投诉代码(userCampus.php):

?php  // ------------------------------------------------------PROCESS -------------------------- START. ?>
<?php

     $page_title='userCampus';


     if(isset($_POST['submit'])){

         if($_POST['secname']){
          //$sn=escape_data($_POST['secname']);
          $sn=$_POST['secname'];
         // echo '<br> sn is : ' . $sn;
         }else{
         $sn=FALSE;
         $message .='<p>You forgot to select section name!</p>';      
         }

         if($_POST['subject']){ 
          //$s=escape_data($_POST['subject']);
          $s=$_POST['subject'];
         }else{ 
         $s=FALSE;
         $message .='<p>you forgot to enter subject!</p>'; 
        }

         if($_POST['comment']){
         //$c=escape_data($_POST['comment']);
         $c=$_POST['comment'];
         }else{
         $c=FALSE;
         $message .='<p>you forgot to enter comment!</p>';     
         }

         }

         if($sn && $s && $c ){

             $userid = $_SESSION['username'];
             $groupid = $_SESSION['secname'];



             $query=" INSERT INTO campuscomplaint (secname, subject, comment, nameuser, groupid, userid)" . 
                    " VALUES (" . "'" . $sn . "','" . $s . "','" . $c . "','" . $nameuser . "','" . $groupid . "','" . $userid . "')";
             //echo 'query is : ' . $query . '<br>'; 



             include "connectioncomplaint.php";

             mysql_query($query);
             echo'<p><b></b></p>';
             include('done.php');
             exit();
         }


?>
<?php //------------------------------------------------ PROCESS ------------------------------------ end. ?>   




<form action="<?php echo$_SERVER['PHP_SELF'];?>" method="post">

此代码用于查看投诉-userView.php(用于其他页面):

<?php //======================================================================================================================= PROCESS DATA ======================================================= START. 
include "connectioncomplaint.php";
?>
<?php


$userid  = $_GET['userid'];
$secname = $_GET['secname'];
$subject = $_GET['subject'];
$comment = $_GET['comment'];

//echo 'test : ' . $subject;
//Tarik data dari sini 
$queryDetail =  " SELECT * FROM campuscomplaint " . 
               " WHERE subject = '" . $subject . "' AND comment = '" . $comment . "' ";
//echo 'QUERY DETAIL :' . $queryDetail . '<br>' ;

$resultDetail = mysql_query($queryDetail);
//echo 'RESULT DETAIL :' . $resultDetail + 0 . '<br>' ;

$detail = mysql_fetch_array($resultDetail);


//echo $detail . '<br>';
//echo 'detail subject is : ' . $detail['subject'] . '<br>';
//echo 'detail comment is : ' . $detail['comment'] . '<br>';
//echo $detail[$x] . '<br>';

?>

我希望你们都能帮助我...... becoz我是零php .......

4 个答案:

答案 0 :(得分:2)

让我们看看我们是否可以查看代码片段中的所有内容:

将调试代码粘贴在以下行之后:

$detail = mysql_fetch_array($resultDetail); 

调试代码:


echo '<pre>';
echo '$userid = '.$userid."\n";
echo '$secname = '.$secname."\n\n";
echo 'Query: '.$queryDetail."\n\n";
echo 'Query results:'."\n\n";
print_r($detail);
echo '</pre>';
die();

这应该清楚你的问题所在。

此外,您应该了解为什么需要使用mysql_real_escape_string()确保人们不会对您的网站做坏事非常重要。切勿在不至少使用此功能的情况下将用户可以更改的任何内容(例如GET或POST数据)直接发送到数据库。这会转义允许他们更改查询的字符(使其执行您不想要的操作)。要了解有关此谷歌“sql注入攻击”的更多信息

答案 1 :(得分:2)

根据我的经验,有一件事。如果你的查询有问题,只需在mysql上试试。在 sql 中运行您的查询,而不是您的变量放置一些值,因此您可以轻松地看到您的问题。

答案 2 :(得分:0)

您似乎在$之前忘记了secname符号,并且您没有清理要转到查询的变量。所以,试试这样:

<?php    
include "connectioncomplaint.php";    

$userid  = mysql_real_escape_string($_GET['userid']);
$secname = mysql_real_escape_string($_GET['secname']);

//Tarik data dari sini     
$queryDetail = "SELECT * FROM campuscomplaint " .     
               "WHERE userid = '$userid' AND secname = '$secname'";    

$resultDetail = mysql_query($queryDetail) or trigger_error(mysql_error()." in ".$queryDetail);
$detail = mysql_fetch_array($resultDetail);    
?> 

答案 3 :(得分:0)

您看起来没有在campuscomplaint表上使用主键,并使用各种数据字段作为标识符。

由于您说数据插入正常,您必须查看如何检索它:

$userid  = $_GET['userid'];
$secname = $_GET['secname'];
$subject = $_GET['subject'];
$comment = $_GET['comment'];

然后在SQL查询中使用它们作为WHERE子句:

$queryDetail =  " SELECT * FROM campuscomplaint " . 
" WHERE subject = '" . $subject . "' AND comment = '" . $comment . "' ";

首先,这很容易受到SQL注入的攻击,任何包含单引号的$ subject或$注释都会破坏查询。在mysql_error()来电之后,您无需通过致电mysql_query()来查看查询是否成功。

还要考虑您是从GET查询中检索这些记录“标识符”。它们的长度有限(各种浏览器不同)。如果某人的评论是10千字节的数据,但浏览器只发送1024个字符怎么办?即使数据库查询成功,它也不会返回任何数据,因为注释字段永远不会匹配。

假设查询字符串限制为100个字符(仅用于示例目的)。您生成的投诉列表如下所示:

<a href="viewcomplaint.php?userid=7&secname=12&subject=This class sucks!!!&comment=Who hired this professor? He doesn't know anything!!!!">View complaint</a>

现在请记住,我们的查询字符串限制为32个字符,因此当用户点击链接时,这将被发送到服务器:

GET http://www.example.com/viewcomplaint.php?userid=7&secname=12&subject=This class sucks!!!&comment=Who hired this professor? He doesn't know a

你将得到以下“标识符”

$userid= 7;
$secname = 12;
$subject = "This class sucks!!!";
$comment = "Who hired this professor? He doesn't know a";

注意$comment是如何被切断的。它永远不会匹配存储在数据库中的内容,因此您的检索查询将失败。此外,请注意其中有一个引号(doesn't)。在查询中逐字插入$注释现在会因为单引号不平衡而导致SQL语法错误。

campuscomplaint表格中添加auto_incrementing主键字段,如下所示:

ALTER TABLE campuscomplaint ADD id int unsigned not null auto_increment primary key;

然后您的所有投诉都可以通过一个号码识别,您可以像这样检索它们:

$id = (int)$_GET['id']; // force $id to be a number. better than just blindly using the value in a query
$query = "SELECT * FROM campuscomplaint WHERE id = $id;";
$result = mysql_query($query);

if (mysql_error()) {
     // did the query fail? Say why!
     die("MySQL query failed! Error cause: " . mysql_error());
}
etc....

使用数字标识符可以很容易地保持您的查询字符串非常短(除非人们注册投诉文件这么多,你会得到数百或数千位数字的数字)。