【问题标题】:PHP MySQL undefined Index and other errorsPHP MySQL未定义索引和其他错误
【发布时间】:2013-05-01 03:02:41
【问题描述】:

无法让我的脚本正确运行,我有 2 个未定义的索引错误和一个无效的参数提供的错误,在我的一生中我无法弄清楚我为什么会得到。 2 个未定义的索引错误来自这些行。

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

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

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

警告:为 foreach() 提供的参数无效

由此产生

<?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>

【问题讨论】:

  • 你所做的非常不安全。您已经在使用 PDO,因此开始使用准备好的查询并不难。就目前而言,您对 SQL 注入攻击完全开放,如果您还没有被黑客入侵,那么您将会被黑客入侵
  • 你为什么使用 !is_null 而不是 isset?

标签: php mysql


【解决方案1】:
  1. 您应该使用isset 而不是is_null 以防止它发出有关未定义变量的警告。

  2. $books 从未被定义 它被定义了,只是错误地...... foreach 需要它是一个数组。无论如何你真的不需要它,使用while 循环将每一行提取到数组中。 (见下面我的例子)。您还在查询中多次重新定义 $count

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

编辑

回答您的问题。 query() 返回一个语句句柄。 (我将其定义为$sth)。 fetch() 返回一个 result,您需要传递其中一个 fetch 模式常量(或者默认情况下早先使用 $db-&gt;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。特别注意错误处理和准备好的语句!

【讨论】:

  • 嘿,感谢您的反馈,我在代码中将其更改为“isset”。至于你的第二部分,我在这一行定义了 '$books','$books = $db->query($query);'如果在重新定义之前很难在代码中找到它。我是否遗漏了有关退货的信息?不是已经是数组格式了吗?
  • 广泛编辑了我的答案
  • Hey Cfreak,很抱歉打扰您,希望这是最后一次,但我在您建议的 PDO 上收到错误“调用未定义方法 PDO::fetch()”。我对计数和书籍的代码进行了更改。据我所知, PDO::FETCH_ASSOC 是一个常量,并且 fetch() 被定义了吗?我需要在我的代码前面调用什么来正确实现 fetch() 吗?
  • 我的错。应该是$sth-&gt;fetch() 我只是做错了。我编辑了答案以更正它
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 2016-08-17
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2012-06-27
相关资源
最近更新 更多