Продолжайте получать сообщение об ошибке php при открытии документа php

#php #mysql

#php #mysql

Вопрос:

У меня есть форма php, но каждый раз, когда я открываю документ php, в котором он включен, я продолжаю получать эти ошибки уведомления php:

Уведомление: неопределенный индекс: идентификатор сеанса в /web/stud/u0867587/MOBILEPHP/exam_interface.php в строке 37

Уведомление: неопределенный индекс: moduleid в /web/stud/u0867587/MOBILEPHP/exam_interface.php в строке 38

Уведомление: неопределенный индекс: teacherid в /web/stud/u0867587/MOBILEPHP/exam_interface.php в строке 39

Уведомление: неопределенный индекс: studentid в /web/stud/u0867587/MOBILEPHP/exam_interface.php в строке 40

Уведомление: неопределенный индекс: оценка в /web/stud/u0867587/MOBILEPHP/exam_interface.php в строке 41

Когда я нажимаю на кнопку отправки, уведомления исчезают, но что мне нужно сделать, чтобы при открытии документа php в неопределенном индексе не было ошибок уведомления?

Ниже приведена кодировка:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<title>Exam Interface</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>

<form action="exam_interface.php" method="post" name="sessionform">        <!-- This will post the form to its own page"-->
<p>Session ID: <input type="text" name="sessionid" /></p>      <!-- Enter Session Id here-->
<p>Module Number: <input type="text" name="moduleid" /></p>      <!-- Enter Module Id here-->
<p>Teacher Username: <input type="text" name="teacherid" /></p>      <!-- Enter Teacher here-->
<p>Student Username: <input type="text" name="studentid" /></p>      <!-- Enter User Id here-->
<p>Grade: <input type="text" name="grade" /></p>      <!-- Enter Grade here-->
<p>Order Results By: <select name="order">
<option name="noorder">Don't Order Results</option>
<option name="ordersessionid">Session ID</option>
<option name="ordermoduleid">Module Number</option>
<option name="orderteacherid">Teacher Username</option>
<option name="orderstudentid">Student Username</option>
<option name="ordergrade">Grade</option>
</select>
<p><input type="submit" value="Submit" /></p>
</form>

<?php

$username="u0867587";
$password="xxxxxxx";
$database="mobile_app";

mysql_connect('localhost',$username,$password);

@mysql_select_db($database) or die("Unable to select database");

$sessionid = $_POST['sessionid'];
$moduleid = $_POST['moduleid'];
$teacherid = $_POST['teacherid'];
$studentid = $_POST['studentid'];
$grade = $_POST['grade'];

$result = mysql_query("SELECT * FROM Module m INNER JOIN Session s ON m.ModuleId = s.ModuleId JOIN Grade_Report gr ON s.SessionId = gr.SessionId JOIN Student st ON gr.StudentId = st.StudentId WHERE ('$sessionid' = '' OR gr.SessionId = '$sessionid') AND ('$moduleid' = '' OR m.ModuleId = '$moduleid') AND ('$teacherid' = '' OR s.TeacherId = '$teacherid') AND ('$studentid' = '' OR gr.StudentId = '$studentid') AND ('$grade' = '' OR gr.Grade = '$grade')");

$num=mysql_numrows($result);    

echo "<table border='1'>
<tr>
<th>Student Id</th>
<th>Forename</th>
<th>Session Id</th>
<th>Grade</th>
<th>Mark</th>
<th>Module</th>
<th>Teacher</th>
</tr>";

while ($row = mysql_fetch_array($result)){

 echo "<tr>";
  echo "<td>" . $row['StudentId'] . "</td>";
  echo "<td>" . $row['Forename'] . "</td>";
  echo "<td>" . $row['SessionId'] . "</td>";
  echo "<td>" . $row['Grade'] . "</td>";
  echo "<td>" . $row['Mark'] . "</td>";
  echo "<td>" . $row['ModuleName'] . "</td>";
  echo "<td>" . $row['TeacherId'] . "</td>";
  echo "</tr>";
}

echo "</table>";

mysql_close();


 ?>

</body>
</html>
  

Ответ №1:

Это потому, что форма еще не опубликована, и эти значения пусты. Замените на что-то вроде:

 $sessionid = isset($_POST['sessionid']) ? $_POST['sessionid'] : "";
$moduleid = isset($_POST['moduleid']) ? $_POST['moduleid'] : "";
$teacherid = isset($_POST['teacherid']) ? $_POST['teacherid'] : "";
$studentid = isset($_POST['studentid']) ? $_POST['studentid'] : "";
$grade = isset($_POST['grade']) ? $_POST['grade'] : NULL;
  

И они должны быть очищены перед использованием в запросе к базе данных, чтобы защитить ваше приложение от атак SQL-инъекций.

 $sessionid = mysql_real_escape_string($sessionid);
$moduleid = mysql_real_escape_string($moduleid);
$teacherid = mysql_real_escape_string($teacherid);
$studentid = mysql_real_escape_string($studentid);
$grade = mysql_real_escape_string($grade);
  

Настоятельно рекомендуется удалить @ вызовы из вашей базы данных, поскольку они скрывают сообщения об ошибках, которые могут возникнуть в результате этих вызовов. Вместо этого используйте ini_set("display_errors", 0); , чтобы избежать появления ошибок на экране в вашем производственном коде.

 // Remove the @
@mysql_select_db(...)
  

Комментарии:

1. @user992147 Рад помочь и добро пожаловать в Stack Overflow. Пожалуйста, отметьте ответ как принятый, нажав на галочку, а также проголосуйте за все ответы, которые вы нашли полезными.

Ответ №2:

Замените эти строки:

 $sessionid = $_POST['sessionid'];
$moduleid = $_POST['moduleid'];
$teacherid = $_POST['teacherid'];
$studentid = $_POST['studentid'];
$grade = $_POST['grade'];
  

с:

 $sessionid = isset($_POST['sessionid']) ? $_POST['sessionid'] : '';
$moduleid = isset($_POST['moduleid']) ? $_POST['moduleid'] : '';
$teacherid = isset($_POST['teacherid']) ? $_POST['teacherid'] : '';
$studentid = isset($_POST['studentid']) ? $_POST['studentid'] : '';
$grade = isset($_POST['grade']) ? $_POST['grade'] : '';
  

Кроме того, я рекомендую вам удалить пароль из вашего исходного кода, вставленного здесь!

Комментарии:

1. Первый ответ сработал, но ваш был таким же, как и первый ответ, за исключением того, что вы не включили SQL-инъекцию, которая была в первом ответе. Но вы бы тоже ответили на мой вопрос, так что спасибо

Ответ №3:

При первом открытии вашего php-файла вы уже присваиваете переменным значения $ _POST. Однако на данный момент они еще не установлены. Попробуйте if(isset($_POST[‘name’])) перед назначениями, чтобы предотвратить это.

Ответ №4:

вам нужно указать :

 $sessionid 
$moduleid 
$teacherid 
$studentid
$grade
  

переменные имеют значение по умолчанию, подобное этому :

 $sessionid = 0;
$moduleid = 0;
$teacherid = 0;
$studentid = 0;
$grade = 0;
  

затем используйте их, чтобы получить значения массива $ _POST следующим образом :

 $sessionid = $_POST['sessionid'];
$moduleid = $_POST['moduleid'];
$teacherid = $_POST['teacherid'];
$studentid = $_POST['studentid'];
$grade = $_POST['grade'];
  

итак, окончательный код будет :

 $sessionid = 0;
$moduleid = 0;
$teacherid = 0;
$studentid = 0;
$grade = 0;
$sessionid = $_POST['sessionid'];
$moduleid = $_POST['moduleid'];
$teacherid = $_POST['teacherid'];
$studentid = $_POST['studentid'];
$grade = $_POST['grade'];
  

Ответ №5:

Это потому, что вы назначаете переменные, даже если они не установлены.

Используйте isset(); или empty(); для $_POST[] переменных

 if isset($_POST['variable']){
    $variable  = $_POST['variable'];
}
  

Не просто оставляйте его открытым.

Ответ №6:

При первом открытии страницы код попытается найти данные, которые, как он ожидает, были опубликованы, но поскольку вы еще не отправили форму, ее там нет. Вам нужно проверить, отправлен ли $_POST[‘sessionid’]; и т. Д. И т. Д. Затем присвоите он значения переменным.

Ответ №7:

Я рекомендую использовать только одну проверку в начале.

 if (!empty($_POST)) {
    // Get variables from $_POST
}
  

Комментарии:

1. Или, возможно, вы могли бы написать функцию, подобную isPost(), например: function isPost() { return !empty($_POST);}