当我单击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
所以我得到了这行代码的notice
和warning
:while($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>
答案 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