如何以PHP形式摆脱通知和警告?

时间:2015-05-03 08:28:13

标签: php forms validation

当我单击php按钮而没有选择任何我不希望系统显示的选项时,我有一个form submit

Notice: Undefined variable: result in C:\XAMPP\htdocs\statistics\lecturer.php on line 83

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given in C:\XAMPP\htdocs\statistics\lecturer.php on line 83

所以我得到了这行代码的noticewarningwhile($unit=mysql_fetch_assoc($result)),尤其是$result

lecturer.php

<?php 
 session_start();
 include 'connect.php';

 $years = array(
    2005,
    2006,
    2007
 );
 $lecturers = array(
      'lec1',
      'lec2',
      'lec3',
      'lec4'
  );


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


$year = mysql_real_escape_string($_POST['year']);
$lecturer = mysql_real_escape_string($_POST['lecturer']);

/*checks if the user types the url of the page that he is not allowed to use, it leads him to the main page so to login*/
if(!isset($_SESSION['username'])){

    header("location:../../statistics/main.htm");
}
$username=$_SESSION['username'];


    if(!empty($lecturer) && !empty($year)){

        if (in_array($lecturer, $lecturers) && in_array($year, $years)) {

            $sql = mysql_query("SELECT unit_name,a1,a2,a3,l1,l2,l3,l4,l5,l6,l7,lavg,r1,r2,u1,u2,u3 FROM $lecturer WHERE year=$year)")or die(mysql_error());

            $result = mysql_query($sql);
        }

    else{
        echo "Please select a lecturer and a year.";
    }   
  }
}
?>
<html>
 <head>
 <link rel="stylesheet" type="text/css" href="../../statistics/style.css">
</head>
<body>
  <div id="container">
   <table id="table" width="900" border="1" cellspacing="1">
<tr>
    <td>Unit Name</td>
    <td>A1 </td>
    <td>A2 </td>
    <td>A3 </td>
    <td>L1 </td>
    <td>L2 </td>
    <td>L3 </td>
    <td>L4 </td>
    <td>L5 </td>
    <td>L6 </td>
    <td>L7 </td>
    <td>LAVG </td>
    <td>R1 </td>
    <td>R2 </td>
    <td>U1 </td>
    <td>U2 </td>
    <td>U3 </td>


</tr>

<?php
    while($unit=mysql_fetch_assoc($result)){
        echo "<tr>";
        echo "<td>".$unit['unit_name']."</td>";
        echo "<td>".$unit['a1']."</td>";
        echo "<td>".$unit['a2']."</td>";
        echo "<td>".$unit['a3']."</td>";
        echo "<td>".$unit['l1']."</td>";
        echo "<td>".$unit['l2']."</td>";
        echo "<td>".$unit['l3']."</td>";
        echo "<td>".$unit['l4']."</td>";
        echo "<td>".$unit['l5']."</td>";
        echo "<td>".$unit['l6']."</td>";
        echo "<td>".$unit['l7']."</td>";
        echo "<td>".$unit['lavg']."</td>";
        echo "<td>".$unit['r1']."</td>";
        echo "<td>".$unit['r2']."</td>";
        echo "<td>".$unit['u1']."</td>";
        echo "<td>".$unit['u2']."</td>";
        echo "<td>".$unit['u3']."</td>";
        echo "</tr>";    
    }
?>
</table>
</div>
</body>
</html>

3 个答案:

答案 0 :(得分:0)

错误消息告诉您,您已尝试在没有所有值的情况下推进代码的条件部分。

您正在询问该值是否为空,但该值不为空,值为false,因为未设置post值。

这确实可以帮助您编写更好的代码 - 您只需要了解缺少的条件。

在你的情况下,你的行:

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

并添加一些额外的约束

if( (isset($_POST['submit'])) && (isset($_POST['year']))  && (isset($_POST['lecturer'])) ){

现在你有简单的错误检查,除非它是完美的,否则将忽略所有输入。

但是,您的最终用户现在会抱怨有时表单不起作用。这也很有用,因为它告诉您可以使用条件

做更多事情
$noerrors = true;
if( !isset($_POST['year']) ){
    echo "Did you forget to choose a year?";
    $noerrors = false;
}
if( !isset($_POST['lecturer']) ){
    echo "Did you forget to choose a lecturer?";
    $noerrors = false;
}
if( isset($_POST['submit']) && $noerrors){
    //...

基本&#34;规则&#34;您需要记住的开发是假设用户会滥用您制作的表单或其他UI,然后针对每种可能的滥用和滥用进行编码。从有人打算破坏你的系统的假设开始通常是有帮助的。

答案 1 :(得分:0)

尝试以下方法:

查询:

$sql = mysql_query("SELECT `unit_name`, `a1`, `a2`, `a3`, `l1`, `l2`, `l3`, `l4`, `l5`, `l6`, `l7`, `lavg`, `r1`, `r2`, `u1`, `u2`, `u3` FROM `$lecturer` WHERE `year` = $year)") or die (mysql_error());

反引号可以防止出现错误mysql reserved words

对于while循环,请执行以下操作:

if(!empty($result)) {
        while($unit = mysql_fetch_assoc($result)){
            echo "<tr>";
            echo "<td>".$unit['unit_name']."</td>";
            echo "<td>".$unit['a1']."</td>";
            echo "<td>".$unit['a2']."</td>";
            echo "<td>".$unit['a3']."</td>";
            echo "<td>".$unit['l1']."</td>";
            echo "<td>".$unit['l2']."</td>";
            echo "<td>".$unit['l3']."</td>";
            echo "<td>".$unit['l4']."</td>";
            echo "<td>".$unit['l5']."</td>";
            echo "<td>".$unit['l6']."</td>";
            echo "<td>".$unit['l7']."</td>";
            echo "<td>".$unit['lavg']."</td>";
            echo "<td>".$unit['r1']."</td>";
            echo "<td>".$unit['r2']."</td>";
            echo "<td>".$unit['u1']."</td>";
            echo "<td>".$unit['u2']."</td>";
            echo "<td>".$unit['u3']."</td>";
            echo "</tr>";    
        }
    }

如果仍然在if语句之前得到错误/警告回显$result。让我知道你得到了什么。尝试此操作时,请从@EngCy中删除2行。

您应该开始使用mysqli_*pdo,因为mysql_*已被删除并将被删除

<强> 更新

我再次查看了代码并发现了另一个错误:

$sql = mysql_query("SELECT unit_name,a1,a2,a3,l1,l2,l3,l4,l5,l6,l7,lavg,r1,r2,u1,u2,u3 FROM $lecturer WHERE year=$year)")or die(mysql_error());

$result = mysql_query($sql);

你基本上也是这样做的。您首先进行查询并将结果设置为$sql。完成后,您查询$sql这不会起作用。因此,您可以在while循环中使用$sql或说$result = $sql;

答案 2 :(得分:-1)

因此,我假设您的代码处于生产阶段并隐藏显示中的所有错误。在php块上添加这些:

ini_set('error_reporting', 0);    // type of error for displaying
ini_set('display_errors', 0);     // 0 = hide errors; 1 = display errors

对于测试阶段,以下这些代码将显示致命错误以及隐藏通知和警告:

ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_WARNING);
ini_set('display_errors', 1);     // 0 = hide errors; 1 = display errors