PHP MySQL 未定义索引等错误

标签 php mysql

无法让我的脚本正确运行,我有 2 个 undefined index 错误和一个提供了无效参数的错误,我一生都无法弄清楚为什么会出现这种情况。 2 个 undefined index 错误来自这些行。

if(!is_null($_GET['order']) && $_GET['order'] != 'courseTitle')

if (!is_null($_GET['page']))

我的无效参数错误是这样的

Warning: Invalid argument supplied for foreach() in

由此生成

<?php foreach ($books as $book) : ?>

我在两个类之间的完整代码是这样的..我做错了什么有什么想法吗?为此我抓狂了。

index.php 
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Catalog</title>
    </head>
    <body bgcolor="white">
        <?php
            /////////////////////////////////////////////////
            //connect to db
            /////////////////////////////////////////////////
            $dsn = 'mysql:host=localhost;dbname=book_catalog';
            $username = "php";
            $password = "php";
            $db = new PDO($dsn, $username, $password);

            //get data
            if(!is_null($_GET['order']) && $_GET['order'] != 'courseTitle')
            {
                $thesort = $_GET['order'];
                $query = "Select * FROM book
                INNER JOIN course
                ON book.course = course.courseID
                ORDER BY ".$_GET['order'];
            }
            else
            {
                $thesort = "courseTitle";
                $query = "Select * FROM book
                INNER JOIN course
                ON book.course = course.courseID
                ORDER BY $thesort";
            }

            //if page is null go to first page otherwise query for correct page
            if (!is_null($_GET['page']))
            {
                $query = $query." LIMIT ".($_GET['page']*8-8).", 8";
            }
            else
            {
                $query = $query." LIMIT 0, 8";
            }

            //query result
            $books = $db->query($query);

            //get number of overall rows
            $query2 = $db->query("SELECT * FROM book");
            $count = $db->query("SELECT Count(*) As 'totalRecords' FROM book");
            $count = $count->fetch();
            $count = $count['totalRecords'];
        ?>

        <table border =" 1">
            <tr>
                <th bgcolor="#6495ed"><a href="?order=course">Course #</th>
                <th bgcolor="#6495ed"><a href="?order=courseTitle">Course Title</th>
                <th bgcolor="#6495ed"><a href="?order=bookTitle">Book Title</th>
                <th bgcolor="#6495ed"></th>
                <th bgcolor="#6495ed"><a href="?order=price">Price</th>
            </tr>
            <?php foreach ($books as $book) : ?>
            <tr>
                <td><a href="rsc/catalog.pdf"><?php echo $book['course']; ?></a></td>
                <td><?php echo $book['courseTitle']; ?></td>
                <td><?php echo $book['bookTitle']; ?></td>
                <td><?php
                $bookcourse = $book['course'];
                $isbn = $book['isbn13'];
                $booklink = "<a href=\"course.php?course=$bookcourse&isbn=$isbn\">";
                echo $booklink ;?><img src='images/<?php echo $book['isbn13'].'.jpg'; ?>'></a></td>
                <td><?php echo $book['price']; ?></td>
            </tr>
            <?php endforeach; ?>
            </tr>
        </table>
         <?php
         //paging function... not sure if it works correctly?
            for ($j=1; $j <= ceil($count/8); $j++)
            { ?>

            <a href=<?php echo "?page=".$j."&order=".$thesort; ?>><?php echo $j; ?></a>
            <?php
            }?>
    </body>
</html>


**course.php**

<?php

    //get data from index.php
    $course = $_GET['course'];
    $isbn = $_GET['isbn'];    

        //connect to db
        $dsn = 'mysql:host=localhost;dbname=book_catalog';
        $username = "php";
        $password = "php";
        $db = new PDO($dsn, $username, $password);

        //get data
        $query = "Select * FROM book, course, author, publisher
    WHERE book.isbn13 = $isbn AND book.course = '$course' AND book.course = course.courseID AND book.bookID = author.bookID AND book.publisher = publisher.publisherID
            ORDER BY book.bookID";

        //query results        
        $books = $db->query($query);

        //error troubleshooting
          if (!$books) {
            echo "Could not successfully run query ($query) from DB: " . mysql_error();
            exit;
          }


        //count the number of rows in the result
        $results = $books->fetchAll();
        $rowCount = count($book);

        //get data from results
        foreach($results as $book){
            $bookID = $book['bookID'];
            $bookTitle = $book['bookTitle'];
            $isbn = $book['isbn13'];
            $price = $book['price']; 
            $desc = $book['description'];
            $publisher = $book['publisher'];
            $courseTitle = $book['courseTitle'];
            $courseID = $book['courseID'];
            $credits = $book['credit'];
            $edition = $book['edition'];
            $publishDate = $book['publishDate'];
            $length = $book['length'];
            $firstName = $book['firstName'];
            $lastName = $book['lastName'];

        }

        if($numrows > 1)
            {
                foreach ($books as $book)
                {
                    $authorArray[] = $book['firstName'] + ' ' + $book['lastName'];
                }
            }





?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>CIS Department Book Catalog</title>
    </head>
    <body bgcolor=white">

        <table border="0">
            <tr>
                <td>
                    <img src='images/<?php echo $isbn.'.jpg'; ?>'>
                </td>
                <td>
         <?php
         echo "For Course: $courseID  $courseTitle ($credits)";
         echo "</br>";    
         echo "Book Title: $bookTitle";
         echo "</br>";    
         echo "Price: $price";
         echo "</br>";    
         echo "Author";
         if ($numResults > 1)
         {
             echo "s:";
             for ($i = 0; $i < $numResults; $i++)
             {
                 if ($i!=0)
                 echo ", $authorArray[i]";
                 else
                     echo $authorArrat[i];
             }
         }
         else
             echo ": $firstName, $lastName";

         echo "</br>";    
         echo "Publisher: $publisher";
         echo "</br>";    
         echo "Edition: $edition ($publishDate)";
         echo "</br>";    
         echo "Length: $length pages";
         echo "</br>";    
         echo "ISBN-13: $isbn";
         ?>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <?php echo "Description: $desc"; ?>
                </td>
            </tr>
        </table>

    </body>

</html>

最佳答案

  1. 您应该使用 isset 而不是 is_null 来防止它发出有关 undefined variable 的警告。

  2. $books 从未定义 它已定义,只是不正确... foreach 需要它是一个数组。无论如何,您确实不需要它,使用 while 循环将每一行获取到数组中。 (请参阅下面我的示例)。您还在查询中多次重新定义 $count

就像@Brad 所说。使用准备好的语句和占位符。您的数据库最终将被您当前的代码入侵。

编辑

回答你的问题。 query() 返回一个语句句柄。 (我将其定义为 $sth)。 fetch() 返回一个结果,您需要传递一个获取模式常量(或者使用 $db->setFetchMode())

获取您需要的书籍

$books = array();
$sth = $db->query($query);
while( $row = $sth->fetch(PDO::FETCH_ASSOC) ) {
    $books[] = $row; // appends each row to the array
}

以下是您的代码应该如何获取计数。

// you're not using the $query2 you defined ... just remove it
$sth = $db->query("SELECT Count(*) As 'totalRecords' FROM book");
$result = $sth->fetch(PDO::FETCH_ASSOC);
$count = $result['totalRecords'];

看一下: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers看起来是一个很好的指南,可以让您深入了解如何使用 PDO。特别注意错误处理和准备好的语句!

关于PHP MySQL 未定义索引等错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16312153/

相关文章:

php - Propel:无交叉表的多对多关系

php - Mysql Order By Optimization 有两个索引

mysql - 所有记录显示为 '0000-00-00' ,将日期从文件加载到 mysql

javascript - 如何在 RESTful 中使用 VisualCaptcha 与 AngularJS 和 slimPHP

mysql - 如何连接tomcat 7和mysql

MySQL not 和 not equal 运算符失败,是什么原因导致的?

php - Jqgrid 分页由于查询而无法工作

php - Laravel 5.3 - 内部重定向或修改请求中间件

php - 根据 AJAX 响应更改下拉值

php - 使用 Twig 检查变量是否为日期