Jump to content

Beginning PHP 5.3 problem


RonInNewYork

Recommended Posts

I'm reading through this book which is actually not bad but, on page 286 there's a shopping_cart.php code (which I downloaded from the web site). The code that seems relevant to me is this:

 

 

<?php

$totalPrice = 0;

 

foreach ( $_SESSION["cart"] as $product) {

 

  $totalPrice += $product->getPrice(); //<<<LINE 94

?>

 

The error I get is

 

Fatal error: Call to a member function getPrice() on a non-object in C:\usr\web\shopping_cart.php on line 94

 

Should $product be a cast to the Product object?

 

class Product {

  private $productId;

  private $productName;

  private $price;

 

  public function __construct( $productId, $productName, $price ) {

    $this->productId = $productId;

    $this->productName = $productName;

    $this->price = $price;

  }

 

  public function getPrice() {

    return $this->price;

  }

//etc.

 

}

Link to comment
Share on other sites

I'm reading through this book which is actually not bad but, on page 286 there's a shopping_cart.php code (which I downloaded from the web site). The code that seems relevant to me is this:

 

 

<?php

$totalPrice = 0;

 

foreach ( $_SESSION["cart"] as $product) {

 

  $totalPrice += $product->getPrice(); //<<<LINE 94

?>

 

The error I get is

 

Fatal error: Call to a member function getPrice() on a non-object in C:\usr\web\shopping_cart.php on line 94

 

Should $product be a cast to the Product object?

Yes as long as you have initiated the object

$product = new Product;

Link to comment
Share on other sites

Where are you calling $product->getPrice()? Is it in the same file as when you initiated the product object (when you created the product). Or in a different page?

If its in a different page then variables you define in one page will not be passed on to the next. Variables die when the script finishes.

Link to comment
Share on other sites

Here' s the entire code. It's just from a book as I'm learning PHP (after years in Java and C#/VB.NET):

<?php
session_start();

class Product {
  private $productId;
  private $productName;
  private $price;

  public function __construct( $productId, $productName, $price ) {
	$this->productId = $productId;
	$this->productName = $productName;
	$this->$price = $price;
  }

  public function getId() {
    return $this->productId;
  }

  public function getName() {
    return $this->productName;
  }

  public function getPrice() {
    return $this->price;
  }

}

$products = array(
  1 => new Product( 1, "SuperWidget", 19.99 ),
  2 => new Product( 2, "MegaWidget", 29.99 ),
  3 => new Product( 3, "WonderWidget", 39.99 )
);

if ( !isset( $_SESSION["cart"] ) ) $_SESSION["cart"] = array();

if ( isset( $_GET["action"] ) and $_GET["action"] == "addItem" ) {
  addItem();
} elseif ( isset( $_GET["action"] ) and $_GET["action"] == "removeItem" ) {
  removeItem();
} else {
  displayCart();
}

function addItem() {
  global $products;
  if ( isset( $_GET["productId"] ) and $_GET["productId"] >= 1 and $_GET["productId"] <= 3 ) {
    $productId = (int) $_GET["productId"];

    if ( !isset( $_SESSION["cart"][$productId] ) ) {
      $_SESSION["cart"][$productId] = $products[$productId];
    }
  }

  session_write_close();
  header( "Location: shopping_cart.php" );
}

function removeItem() {
  global $products;
  if ( isset( $_GET["productId"] ) and $_GET["productId"] >= 1 and $_GET["productId"] <= 3 ) {
    $productId = (int) $_GET["productId"];

    if ( isset( $_SESSION["cart"][$productId] ) ) {
      unset( $_SESSION["cart"][$productId] );
    }
  }

  session_write_close();
  header( "Location: shopping_cart.php" );
}

function displayCart() {
  global $products;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>A shopping cart using sessions</title>
    <link rel="stylesheet" type="text/css" href="common.css" />
  </head>
  <body>

    <h1>Your shopping cart</h1>

    <dl>

<?php
$totalPrice = 0;

foreach ( $_SESSION["cart"] as $product) {
  
  $totalPrice += $product->getPrice(); //<<<THIS IS WHERE THE CODE ABENDS
?>
      <dt><?php echo $product->getName() ?></dt>
      <dd>$<?php echo number_format( $product->getPrice(), 2 ) ?>
      <a href="shopping_cart.php?action=removeItem&productId=<?php echo $product->getId() ?>">Remove</a></dd>
<?php } ?>
      <dt>Cart Total:</dt>
      <dd><strong>$<?php echo number_format( $totalPrice, 2 ) ?></strong></dd>
    </dl>

?>
    <h1>Product list</h1>

    <dl>
<?php foreach ( $products as $product ) { ?>
      <dt><?php echo $product->getName() ?></dt>
      <dd>$<?php echo number_format( $product->getPrice(), 2 ) ?>
      <a href="shopping_cart.php?action=addItem&productId=<?php echo $product->getId() ?>">Add Item</a></dd>
<?php } ?>
    </dl>

<?php
}

?>

  </body>
</html>

 

Link to comment
Share on other sites

I'm not sure how to implement that. I can see the problem is getting at the Product objects in the $product array. When I put

if (isset($_SESSION["cart"] {

before the first foreach, then that code doesn't error out. HOWEVER, the second foreach does error

h1>Product List</h1>
<dl>
	<?php foreach ($products as $product) {?>
	<dt><?php echo $product->$getName() ?></dt>
	<dd>$<?php echo number_format($product->getPrice(),2) ?>
	<a href="shopping_cart.php?action=addItem&productId<=<?php echo $product->getId() ?>">Add Item</a></dd>
	<?php } ?>
</dl>

 

errors out with "Undefined variable: getName in...line" and "Method name must be a string."

 

Thanks for your help.

 

RON

Link to comment
Share on other sites

Thanks that was sloppy of me. But now I get:

 

Call to undefined method Product::getName()...

 

If it isn't one thing, it's another, right?

 

 

APOLOGIES: A couple of spelling and other typos. BUT, even when I fixed them the code seems incredibly broken. It will run with no errors, for instance $_SESSION["cart"] is always unset.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.