Tell me more ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I been working on a PHP page that involves reading from an XML file. However,I am seeing this error message: Parse error: parse error, unexpected T_OBJECT_OPERATOR on line 24. Yet I am not sure as to what is causing the error. So I am wondering if anyone can figure out what I am doing wrong.

<?php
if (!isset($_GET["searchstr"]))
    print "no Search String is provided! <br />";
else if (!isset($_GET["searchtype"]) || empty($_GET["searchtype"]))
    print "No Search type is selected!<br />";


    else 
{
    $searchstr = $_GET["searchstr"];
    $searchtype = $_GET["searchtype"];

    $xmlDoc = new DOMDocument();
    @ $success = $xmlDoc->load("books.xml");
    if (!$success)
        print "No XML book data on the server!";


else
{
    $books = $xmlDoc->getElementsByTagName("book");
    $num = 0;
    foreach ($books as $book)

        $title = $book->getElementsByTagName("title")->item(0)->firstChild->nodevalue;          
        $isbn13 = $book->getElementsByTagName("ISBN13")->item(0)->firstchild->nodevalue;
        $isbn10t = $book->getElementsByTagName("ISBN10");
        $isbn10 = "";
    if ($isbn10t->length > 0)
        $isbn10 = $isbn10t->item(0)->firstchild->nodevalue;

        $authors = $book->getElementsByTagName("author");
        $author = "";
        for ($j=0; $j<$authors->length; $j++)
        {

if ($j>0)
            {
                if ($j < $authors->length-1) $author .= ". ";
                else $author .= " and ";
            }
            $author .= $author->item($j)->getElementsByTagName("firstname")->item(0)->firstchild->nodevalue;
            $author .= " " . $authors->item($j)->getElementsByTagName("lastname")-item(0)->firstchild->nodevalue;
        }
        $desc = $book->getElementsByTagName("descritpion");
        $description = "";
        if ($desc->length > 0)
            $descreption = $desc->item(0)->firstchild->nodevalue;

        if (empty($searchstr)
        || searchtype == "title" && eregi($searchstr,$title)
        || $searchtype == "isbn" && (eregi($searchstr, $author)
        || $searchtype == "keyword" && (eregi($searchstr, $title) || eregi($searchstr, $description)

{
            $num++
            print "{$num}. Title: <a href=\"select.php?isbn={$isb13}\">{$title}</a><br />";
            print "Author: {$author}<br />"
            print "ISBN-13. ";
            print $books->getElementsByTagName("ISBN13")->item(0)->firstchild->nodevalue."<br />";
            $isbn10 = $book->getElementsByTagName("ISBN10");
            if ($isbn10->length > 0)
            {
                print " ISBN-10: " . $isbn10->item(0)->firstchild-nodevalue. "<br />";
            }
            print "Price: $";
            print $book->getElementsByTagName("price")->item(0)->firstchild->nodevalue. "<br />";
            print "<br />"
        }
        if ($num == 0)
            print "no book is found!";  
    }


}
}

?>

Here is an example of the XML code that I am using

<book id="1"> 
    <title>Beginning ASP.NET 4 in C# 2010</title> 
    <authors> 
      <author> 
        <lastname>MacDonald</lastname> 
        <firstname>Matthew</firstname> 
      </author> 
    </authors> 
    <ISBNs> 
      <ISBN13>9781430226086</ISBN13> 
      <ISBN10>1430226080</ISBN10> 
    </ISBNs> 
    <publisher>Apress</publisher> 
    <publishdate>2010-05</publishdate> 
    <pages>981</pages> 
    <price>49.99</price> 
    <description>This book discusses ASP.NET programming in C# with Visual Studio 2010.</description> 
  </book>

Here is the code from the Search page, the page before the PHP page;

 <!DOCTYPE html>
<html>
<head>
    <title>Textbook Buyer</title>
    <link href="styles.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">

    function doSearch()
    {
        var searchstr = document.getElementById("searchstr").value;
        var searchtype = document.getElementById("searchtype").value;

        $.ajax
        ({
            type: "GET",
            url: "searchlist.php?searchstr=" + searchstr + "&searchtype=" + searchtype,
            success: function(sText, sStatus, oXHR) 
            {
                $("div#results").html(sText);
            },
            error: function (oXHR, sStatus, sError) 
            {
                $("div#results").html("An error occurred.");
            }
        });
    }   

    </script>
</head>
<body>
    <table>
     <tr>
       <td class="header" colspan="5">Textbook Buyer</td>
     </tr>
     <tr>
       <td id="td1" colspan="5">
       | <a href="welcome.php">Welcome</a> 
       | <a href="bestsellers.php">Bestsellers</a>
       | <a href="hotdeals.php">Hot Deals</a>
       | <a href="bookstores.php">Bookstores</a>
       | <a href="myaccout.php">My Account</a>
       | <a href="help.php">Help</a>
       |</td>
     </tr>
     <tr>
       <td class="column">
        <strong>Browse Textbooks<br />
        by Category:</strong><br />
        <br />
        Business -<br />
        Computer Science -<br />
        History -<br />
        Mathematics -<br />
        Medical -<br />
        Social Science  -<br />
       </td>
       <td class="td2"></td>
       <td id="td3">
        <div id="searchBox"> <br />
          <input type="text" id="searchstr" size="30" />
          <select id="searchtype">
            <option value="title" selected="selected">Title</option>
            <option value="author">Author</option>
            <option value="isbn">ISBN</option>
            <option value="keyword">Keyword</option>
          </select>
          <br />
           <input type="button" id="searchButton" value="Search" onClick="doSearch();" /><br />

        </div>
        <div id="results"></div>
       </td>
       <td class="td2"></td>
       <td class="column">
        <strong>Customer Support:</strong><br />
        <br />
        Order Status<br />
        Customer Service <br /><br />
        <a href="search.php">Search Books</a>
       </td>
     </tr>
     <tr>
       <td id="td5" colspan="5">&copy; Copyright 2013, Textbook Buyer, Inc. All rights reserved.
       </td>
     </tr>
    </table>

</body>
</html>
share|improve this question
2  
The error message usually contains a line number. Look there for the problem. We can't tell, cause you left out this tidbit. Too localized anyway. – mario Apr 23 at 21:44
You may also want to post an example of the XML that's giving you the issue. – pilsetnieks Apr 23 at 21:50
I get a "PHP Parse error: syntax error, unexpected '{'" on line 43 of your code (unclosed if statement). See how handy line numbers are? – Wrikken Apr 23 at 21:58
Sorry, I forgot to include line number where the error was. Line 24 is where the error is being reported at. – herkles Apr 23 at 22:24
@herkles There isn't anything on line 24. There is obviously something here you're leaving out; please include it. – Daedalus Apr 23 at 22:25
show 3 more comments

closed as too localized by mario, Álvaro G. Vicario, Wrikken, Daedalus, Jocelyn Apr 24 at 0:04

This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, see the FAQ.

1 Answer

You have several syntax errors in this code:

foreach ($books as $book) // this is invalid given the lines below it and the lines at 
// the end of the page.  You forgot to open this:

foreach ($books as $book) { //this is what it should be.

$author .= $author->item($j)->getElementsByTagName("firstname")->item(0)->firstchild->nodevalue;
$author .= " " . $authors->item($j)->getElementsByTagName("lastname")-item(0)->firstchild->nodevalue;

$isbn10 = $isbn10t->item(0)->firstchild->nodevalue;

$descreption = $desc->item(0)->firstchild->nodevalue;

print $books->getElementsByTagName("ISBN13")->item(0)->firstchild->nodevalue."<br />";
//         ^ not to mention, you need to delete this S      ^   and    ^ both need to be upper-case

// The above lines(and pretty much every single instance in which you use those two
// methods) are using an incorrect property.  nodevalue should be nodeValue,
// firstchild should be firstChild.  The capital C/V makes all the difference.

$num++
   // ^ no semi-colon

print "Author: {$author}<br />"
                            // ^ no semi-colon

print "<br />"
         //   ^ again, no semi-colon

// the below..

$author .= $author->item($j)->getElementsByTagName("firstname")->item(0)->firstchild->nodevalue;

//should be this:

$author .= $authors->item($j)->getElementsByTagName("firstname")->item(0)->firstchild->nodevalue;
//                ^ notice the s here

$author .= " " . $authors->item($j)->getElementsByTagName("lastname")-item(0)->firstchild->nodevalue;
//                                                                    ^ forgot a key character, the >

This:

if (empty($searchstr)
    || searchtype == "title" && eregi($searchstr,$title)
    || $searchtype == "isbn" && (eregi($searchstr, $author)
    || $searchtype == "keyword" && (eregi($searchstr, $title) || eregi($searchstr, $description)

Should be something akin to.. (remember to close your ()s)(this is mostly guessing since I don't know the purpose of this code):

if (empty($searchstr)
    || searchtype == "title" && eregi($searchstr,$title)
//    ^ forgot the $ here, unless you have a constant called 'searchtype'
    || $searchtype == "isbn" && (eregi($searchstr, $author))
    || $searchtype == "keyword" && (eregi($searchstr, $title) || eregi($searchstr, $description)))

And finally, right here:

print " ISBN-10: " . $isbn10->item(0)->firstchild-nodevalue . "<br />";
// The C and V need to be upper case and          ^ you forgot the >

With all of those errors fixed, the code works fine for me.

share|improve this answer
You also forget to define a variable you use later on, in another else block. You'll get a notice telling you this, but it doesn't stop your code from working, so I didn't include it. – Daedalus Apr 23 at 23:43
I am not sure why but it seems that despite following the changes that you did, it still tells me that I have a Parse error: parse error, unexpected T_OBJECT_OPERATOR on line 24. – herkles Apr 24 at 0:27
@herkles Delete line 24, and the surrounding lines, re-type from scratch. It is likely a hidden character got copied from where you copied this from. – Daedalus Apr 24 at 0:42

Not the answer you're looking for? Browse other questions tagged or ask your own question.