注意:未定义的索引:变量

时间:2016-11-27 07:22:02

标签: php html mysql apache

我正在尝试使用下拉列表构建一个简单的表单来查询我的数据库(专为课后计划的库设计)。这个想法是下拉列表由书籍或学生的名字填充,因此当您选择名称和提交时,数据库将从表格中选择具有匹配外键的详细信息。

问题是,每当我打开表单时,我都会在表单上方获得这些行的几个副本:

  

注意:未定义的索引:第88行的E:\ XAMPP \ htdocs \ CMPS \ Library \ query \ index.php中的id

     

注意:未定义的索引:第88行的E:\ XAMPP \ htdocs \ CMPS \ Library \ query \ index.php中的名称

     

注意:未定义的索引:第104行的E:\ XAMPP \ htdocs \ CMPS \ Library \ query \ index.php中的isbn

     

注意:未定义的索引:第104行的E:\ XAMPP \ htdocs \ CMPS \ Library \ query \ index.php中的标题

同样,每个下拉列表都显示

  

注意:未定义的索引:第20行的E:\ XAMPP \ htdocs \ CMPS \ Library \ query \ searchform.html.php中的名称

  

注意:未定义的索引:第30行的E:\ XAMPP \ htdocs \ CMPS \ Library \ query \ searchform.html.php中的标题

的index.php

<?php include_once 
'../includes/helpers.inc.php';

require_once '../access.inc.php';

if (!userIsLoggedIn())
{
    include '../login.html.php';
    exit();
}

if (!userHasRole('Verified'))
{
    $error = 'Only verified accounts may access this page.';
    include '../accessdenied.html.php';
    exit();
}

if (isset($_GET['action']) and $_GET['action'] == 'search')
{
  include '../includes/db.inc.php';

  $select = 'SELECT CONCAT_WS(\' \', student.First, student.Last) as Name, book.Title, checkout.Checked, checkout.Due';
  $from   = ' FROM checkout, student, book';
  $where  = ' WHERE student.ID = checkout.StudentID AND book.ISBN = checkout.BookISBN';

  $placeholders = array();

  if ($_GET['student'] != '') 
  {
    $where .= " AND checkout.StudentID = :studentid";
    $placeholders[':studentid'] = $_GET['student'];
  } 

  if ($_GET['book'] != '') 
  {
    $where .= " AND checkout.BookISBN = :bookisbn";
    $placeholders[':bookisbn'] = $_GET['book'];
  } 

  if (isset($_POST['ongoing']) && $_POST['ongoing'] == 'Yes') 
  { 
    $where .= " AND Ongoing = 1";
  } 

  try
  {
    $sql = $select . $from . $where;
    $s = $pdo->prepare($sql);
    $s->execute($placeholders);
  }
  catch (PDOException $e)
  { 
    $error = 'Error fetching checkouts.';
    include 'error.html.php';
    exit();
  }

  foreach ($s as $row)
  { 
    $checkouts[] = array('Name' => $row['name'], 'book.Title' => $row['title'], 
                         'Checked' => $row['checked'], 'Due' => $row['due']);
  } 

  include 'query.html.php';
  exit();
}

include '../includes/db.inc.php';

try
{ 
  $result = $pdo->query('SELECT ID, CONCAT_WS(\' \', First, Last) as Name FROM student');
} 
catch (PDOException $e)
{ 
  $error = 'Error fetching students from database!';
  include 'error.html.php';
  exit();
}

foreach ($result as $row)
{ 
  $students[] = array('ID' => $row['id'], 'Name' => $row['name']); #Line 88
} 

try
{ 
  $result = $pdo->query('SELECT ISBN, Title FROM book');
} 
catch (PDOException $e)
{ 
  $error = 'Error fetching books from database!';
  include 'error.html.php';
  exit();
}

foreach ($result as $row)
{ 
  $books[] = array('ISBN' => $row['isbn'], 'Title' => $row['title']); #Line 104
} 

include 'searchform.html.php'; 

searchform.html.php

<?php include_once 
'../includes/helpers.inc.php';  ?>
<!DOCTYPE html>
 <html lang="en">
  <head>
    <meta charset="utf-8">
    <!-- <link href="../style.css" rel="stylesheet" media="screen"> -->
    <title>Query Checkouts</title>
  </head>
  <body>
    <h1>Query</h1>
    <form action="" method="get">
      <p>View checkouts satisfying the following criteria:</p>
      <div>
        <label for="student">By student:</label>
        <select name="student" id="student">
          <option value="">Any student</option>
          <?php foreach ($students as $student): ?>
            <option value="<?php htmlout($student['id']); ?>"><?php
                htmlout($student['name']); ?></option> <!-- Line 20 -->
          <?php endforeach; ?>
        </select>
      </div>
      <div> 
        <label for="book">By book:</label>
        <select name="book" id="book">
          <option value="">Any book</option>
          <?php foreach ($books as $book): ?>
            <option value="<?php htmlout($book['isbn']); ?>"><?php
                htmlout($book['title']); ?></option> <!-- Line 30 -->
          <?php endforeach; ?>
        </select>
      </div>
      <div>
        <label for="ongoing">Ongoing only?:</label>
        <input type="checkbox" name="ongoing" value="Yes" />
      </div>
      <div>
        <input type="hidden" name="action" value="search">
        <input type="submit" value="Search">
      </div>
    </form>
    <p><a href="..">Return to PHL home</a></p>
    <?php include '../logout.inc.html.php'; ?>
  </body>
</html>

我尝试检查代码,但phpcodechecker.com说没有错误,而且我很难使用Chrome Logger进行调试。

希望我能理解我做错了什么,所以我不会在以后的开发中犯错!

1 个答案:

答案 0 :(得分:3)

在访问循环中的$row时,您需要确保使用区分大小写的索引。

更改:

$students[] = array('ID' => $row['id'], 'Name' => $row['name']);

致:

$students[] = array('ID' => $row['ID'], 'Name' => $row['Name']);

此外,在searchform.html.php中,您需要在定义数组时访问数组,即。使用IDName来访问这些值。或者更改上述更改中的那些索引以匹配预期的小写版本。

示例:

$students[] = array('id' => $row['ID'], 'name' => $row['Name']);

您也知道,这可能也会影响其他结果循环。只需对这些更改应用相同的更改,您应该没事(例如。$checkouts似乎也会受到影响)。