简体   繁体   中英

Zend DB: null values

I would appreciate it if some one could explain why this query is returning null values. This query works fine when I use the fetchRow() method.

public function getCustomerRowWithAddress($customer_id)
{

    $select = $this->select()->setIntegrityCheck(false);

    $select->from('irh_TV.irh_site_location AS SL', array('name as location_name', 'start_date', 'end_date', 'service_pack_id', 'stb_id'));
    $select->joinLeft('irh_TV.irh_customers AS C', 'C.customer_id = SL.customer_id AND C.active = 1 AND C.site_id = SL.site_id', 
        array('customer_id','surname', 'title', 'site_id', 'first_name', 'company', 'business_no', 'home_no', 'mobile_no', 'email', 'address_id'));
    $select->joinLeft('irh_TV.tv_stb_data AS TV', 'TV.site_id = SL.site_id AND SL.stb_id = TV.id', array('user_id as mac_address'));
    $select->joinLeft('irh_TV.irh_address AS AD', 'C.address_id = AD.id', array('address_line1', 'address_line2', 'town', 'county', 'country', 'postcode'));
    $select->where("SL.customer_id = $customer_id");   
    //if($_REQUEST['d'] == 1) { echo $select; }
    _syslog($select);
    //$_rows = $this->fetchRow($select);
    $_rows = $this->fetchAll($select);

    return $_rows;
}

EDIT:

I try to access the rowset like so:

    $model      = _getModel();
    $table      = $model->getTable("irh_customers");
    $customer_address_row = $table->getCustomerRowWithAddress($id);
    //$customer_address_row = $table->getCustomerRowsWithAddress($id);
    //$this->_row = $customer_address_row ? $customer_address_row : $table->getRowById($id);

    $row_count = count($customer_address_row);
    if($row_count > 0){
        ///$rows = $this->_row->toArray();
        $this->exists = true;
        $this->id = $id;
        if($row_count > 1){

            //$array = $customer_address_row->toArray();
            foreach($customer_address_row->toArray() as $row){

                foreach($row as $k => $v){
                    //if($k != 'stb_id' || $k != 'mac_address'){
                        if(!isset($this->k[$k])){
                            $this->k[$k] = $v;
                        }
                    /*}else if($k == 'stb_id'){
                        $this->k['stb_id'][] = $v;
                    }
                    else if($k == 'mac_address'){
                        $this->k['mac_address'][] = $v;
                    }*/
                }
            }
        }else{
            foreach($customer_address_row->toArray() as $k => $v)
            {
                _syslog($v);
                $this->k[$k] = $v;
            }
        }
   }

fetchRow() returns an object of Zend_Db_Table_Row_Abstract. fetchAll() returns an array.

The Zend_Db_Table_Rowset_Abstract class toArray method, behaves in wierd manner that is not documented. If you haven't iterated through the rows before calling it, it won't behave like expected.

So the solution would be to directly iterate thought the rowset (It can be iterated):

foreach ($customer_address_row as $row) {
    //Do whatever you need with the row here
}

Hope this helps.

I've fixed it guys. Just had to check for an array first and get rid of the second row count check and its else statement.

     if($row_count > 0){
        $rows = $this->_row->toArray();
        $this->exists = true;
        $this->id = $id;
        if(is_array($rows[0]) && isset($rows)){
            foreach($rows as  $i => $row){

                foreach($row as $k => $v){
                    //Whatever
                }
            }

        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM