0

私のスクリプトを正しく実行するのに問題があります.2つの未定義のインデックスエラーと無効な引数が提供されたエラーがあり、私の人生ではなぜ私が得ているのかわかりません. 2 つの未定義のインデックス エラーは、これらの行から発生します。

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

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

私の無効な引数エラーはこれです

警告: foreach() に無効な引数が指定されました

これから生成される

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

2つのクラス間の私の完全なコードはこれです..私が間違ったことのアイデアはありますか? これで私の髪を引き裂きます。

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

1 に答える 1

1
  1. 未定義の変数について警告しissetないようにするために使用する必要があります。is_null

  2. $booksis never defined 定義されていましたが、間違って...foreach配列である必要があります。whileとにかく、実際には必要ありません。ループを使用して各行を配列にフェッチします。(以下の私の例を参照してください)。$countまた、クエリで数回再定義しています。

@Bradが言ったように。準備済みステートメントとプレースホルダーを使用します。データベースは現在のコードでハッキングされてしまいます。

編集

あなたの質問に答えてください。ステートメントハンドルをquery()返します。(私はそれを と定義しました)。フェッチモード定数の 1 つを渡す必要がある結果を返します(または、デフォルトで以前に で定義します) 。$sthfetch()$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 の使用方法を深く理解するための優れたガイドのようです。エラー処理と準備済みステートメントに特に注意してください。

于 2013-05-01T03:12:52.040 に答える