2011-03-30 154 views
0

我有一些這樣的SQL:MySQL的PHP​​的preg_replace,正則表達式

select o.customer_id, o.reference, o.firstname, o.lastname, os.name as status, o.date_modified, o.total as last_purchase_amount, sum(o.total) as total, count(o.order_id) as number_of_orders, o.currency, o.value from `order` o left join order_status os on o.order_status_id = os.order_status_id where os.language_id = '1' group by customer_id order by date_modified desc 

有使用下面的代碼來計算的頁面索引

function splitQuery($sql, $page = '1', $max_rows = '20') { 
     $count = $this->getRow(preg_replace(array('/select(.*)from /Asi', '/order by (.*)/i'), array('select count(*) as total from ', ''), $sql, 1)); 
     $pages = ceil($count['total']/(int)$max_rows); 

它不工作的功能我SQL,所以我做了一些測試

$sql = "select o.customer_id, o.reference, o.firstname, o.lastname, os.name as status, o.date_modified, o.total as last_purchase_amount, sum(o.total) as total, count(o.order_id) as number_of_orders, o.currency, o.value from `order` o left join order_status os on o.order_status_id = os.order_status_id where os.language_id = '1' group by customer_id order by date_modified desc 
"; 
echo preg_replace(array('/select(.*)from /Asi', '/order by (.*)/i'), array('select count(*) as total from ', ''), $sql, 1); 

它輸出

select count(*) as total from `order` o left join order_status os on o.order_status_id = os.order_status_id where os.language_id = '1' group by customer_id 

似乎「通過CUSTOMER_ID組」是在哪裏造成trouble.please幫我修改

preg_replace(array('/select(.*)from /Asi', '/order by (.*)/i'), array('select count(*) as total from ', ''), $sql, 1) 

或建議的方式來解決它?mysql_num_rows?

整機功能

function splitQuery($sql, $page = '1', $max_rows = '20') { 
    $count = $this->getRow(preg_replace(array('/select(.*)from /Asi', '/order by (.*)/i'), array('select count(*) as total from ', ''), $sql, 1)); 

    $pages = ceil($count['total']/(int)$max_rows); 

    if (!$page) { 
     $page = 1; 
    } 

    $offset = ((int)$max_rows * ($page - 1)); 

    $sql .= " limit " . (int)$offset . ", " . (int)$max_rows; 

    $this->pages = (int)(($pages > 0) ? $pages : '1'); 
    $this->total = (int)$count['total']; 
    $this->from = (int)(($offset > 0 || $count['total'] == 0) ? $offset+1 : '1'); 

    if ($count['total'] < $max_rows) { 
     $this->to = (int)$count['total']; 
    } elseif ($this->pages == $page) { 
     $this->to = (int)($offset + $max_rows - ($offset + $max_rows - $count['total'])); 
    } else { 
     $this->to = (int)($offset + $max_rows); 
    } 

    return $sql; 
} 

我寧願沒有這個功能,外改變任何東西只要有可能..

確定...我決定用我自己的狡猾修復

 //$count = $this->getRow(preg_replace(array('/select(.*)from /Asi', '/order by (.*)/i'), array('select count(*) as total from ', ''), $sql, 1)); 

     $this->result = mysql_query($sql); 
     $count = array(
      'total' => mysql_num_rows($this->result) 
     ); 

回答