0

I am new to PHP and Zend Framework. I met the error:

Notice: Undefined index: itemid in C:\xampp\htdocs\blogshop\application\views\scripts\item\tops.phtml on line 58

I don't get why this error shows up.

public function topsAction() //tops action
{
    //$tops = new Application_Model_DbTable_Item();
    //$tops->getTops();
    $item = new Application_Model_DbTable_Item(); //create new Item object
    $this->view->item = $item->getTops();  //$this->view->item  is pass to index.phtml
}   

This is my controller code.

public function getTops()
{
    $row = $this->fetchAll('itemtype = "Tops"'); //find Row based on 'Tops'
    if (!$row) { //if row can't be found
        throw new Exception("Could not find Tops!"); //Catch exception where itemid is not found
    }
    return $row->toArray();
}

This is my getTops action in Model to get the rows with category 'Tops' in my database.

<?php foreach($this->item as $item) : ?>
    <?php echo $this->escape($this->item['itemid']);?> // This is where the error happens
    <img src="<?php echo $this->escape($item->image);?>" width="82" height="100">
    <?php echo $this->escape($this->item['itemname']);?>
    <?php echo $this->escape($this->item['description']);?>
    <?php echo $this->escape($this->item['itemtype']);?>
<?php endforeach; ?>

This is my code to display all the rows I have in my database.

Whisperity
  • 3,012
  • 1
  • 19
  • 36
Swap Test
  • 131
  • 1
  • 2
  • 9

1 Answers1

2

There is no index named itemid in your $this->item array, this is why you get the error.

Also, your code here seems to be a bit wrong:

<?php foreach($this->item as $item) : ?>
    <?php echo $this->escape($this->item['itemid']);?>
    <img src="<?php echo $this->escape($item->image);?>" width="82" height="100">
    <?php echo $this->escape($this->item['itemname']);?>
    <?php echo $this->escape($this->item['description']);?>
    <?php echo $this->escape($this->item['itemtype']);?>
<?php endforeach; ?>

Every $this->item inside the foreach statement should be replaced with $item for the iteration to work. So it will be $item['itemid'], $item['itemname'], etc. You are missing to get a level deeper into the array, rendering the iteration foreach useless.

I guess $this->item looks something like this:

array (
  1 => 
  array (
    'itemid' => 1,
    'itemname' => 'foobar',
  ),
  2 => 
  array (
    'itemid' => 2,
    'itemname' => 'bazqux',
  ),
)

This is why $this->item['itemid'] returns nothing, as it does not exist. $this->item[1]['itemid'] however does. What the foreach cycle helps you to do is that it walks (iterates) the whole $this->item array with each value represented as $item inside the cycle. In the first run, $item is $this->item[1], in the second, $item is $this->item[2], and so on, and so forth.

So, change $this->item to $item inside the foreach construct.

Whisperity
  • 3,012
  • 1
  • 19
  • 36
  • @SwapTest Happy to be able to help. But please, take your time to understand what you are using and doing. (Related manual page for [foreach](http://php.net/manual/en/control-structures.foreach.php)) It's good that I told you what to do and that you merged my _fix_ into your files, but if you don't understand why it works, there is production value in doing it. Also, if this was the good answer, mark it as the answer with the transparent _tick_ next to it so further readers will see that this answer did work. – Whisperity Aug 08 '12 at 12:24