2012-01-12 68 views
0

我收到這個函數內置codeigniter沒有SQL錯誤,但我試圖計算作爲參數傳遞的兩個表單輸入之間的區域差異。任何人都可以看到這個功能的問題?Codeigniter成本函數 - 沒有錯誤,但沒有計算

function stationcost($station1,$station2) 
{ 

    $data = array(); 

    $this->db->select('station_zone.Zone-sz2.Zone AS Zone' , false)->from('station_zone')->join('station_zone AS sz2','sz2.Station', $station2)->where('station_zone.Station',$station1); 
    $Q = $this->db->get(); 


    $this->db->select('Cost')->from('zone_cost')->where('Zone_Diff', $Q->row()->Zone_Diff); 


    $query = $this->db->get(); 

    if ($query->num_rows() > 0) 
    { 
     foreach ($query->result() as $row) 
     { 
      $data = $row->Cost; 
      return $data; 
     } 

    } 
} 

非常感謝,

+0

您可以驗證此語句:$ Q-> row() - > Zone_Diff是否返回內容? – 2012-01-12 20:31:18

回答

2
  1. 確保您的查詢

    $this->db->select('station_zone.Zone-sz2.Zone AS Zone' , false) 
    ->from('station_zone') 
    ->join('station_zone AS sz2','sz2.Station', $station2) 
    ->where('station_zone.Station',$station1); 
    $Q = $this->db->get(); 
    

    實際返回的東西。首先嚐試在phpMyAdmin或類似工具,例如,或者手工打造,並將其傳遞給$this->db->query($sql)方法例如

    而且,你正在構建的join()方法錯了,mightbe:

    join('station_zone As sz2','sz2.Station = '.$station2) 
    

    我想想,不清楚$ station2來自哪裏以及你想要加入哪個表... join()中的第三個參數應該是連接類型,就像「left」一樣。恩。請參閱docs

    即使select()部分看起來很尷尬,我看到有三個點在那裏您是否嘗試運行$this->db->last_query();以查看查詢字符串的外觀?
    我真的不能弄明白爲止......

  2. 在這第二個查詢:

    $this->db->select('Cost') 
    ->from('zone_cost') 
    ->where('Zone_Diff', $Q->row()->Zone_Diff); 
    

    你問一個$Q->row()->Zone_Diff,我看不出哪裏是牽強......不是在前面的查詢,似乎

  3. 最後,在這裏:

    if ($query->num_rows() > 0) 
    { 
        foreach ($query->result() as $row) 
        { 
         $data = $row->Cost; 
         return $data; 
        } 
    
    } 
    

您正在覆蓋循環中的$ data變量...不,您剛剛在第一次通過後返回!你應該做的:

foreach ($query->result() as $row) 
    { 
     $data[] = $row->Cost; 
    } 
    return $data; 

UPDATE:

你說你的查詢在phpMyAdmin的工作,那麼爲什麼不只是在做:

$sql = "SELECT station_zone.Zone-sz2.Zone AS Zone FROM station_zone JOIN station_zone AS sz2 ON sz2.Station=? WHERE station_zone.Station=?"; 
$Q = $this->db->query($sql, array($station1,$station2)); 

,看看是否可行?有時,當您需要開始避免標識符保護等時,AR會使事情更加複雜。像上面這樣的查詢對於注入來說仍然是安全的,因爲使用查詢綁定,並且比使用AR構建容易10倍。

Withouth看到數據庫模式,我stil發現它有霧,理解爲什麼JOIN和爲什麼只能在一個表和本身作爲別名操作...但我在一天的錯誤時間(晚上和今天早上:)回答),所以它可能就是我。哪些是表格,它們是如何構成的?

+0

選擇 station_zone.Zone-sz2.Zone AS 區與station_zone JOIN station_zone AS SZ2 ON sz2.Station =( 'STATION1') WHERE station_zone.Station =( '站2')在phpMyAdmin工作 – Jon 2012-01-12 23:12:53

+0

$ STATION1來自在控制器中形成輸入並作爲變量傳遞。 – Jon 2012-01-12 23:18:00

+0

該選擇是尷尬的,因爲它試圖從$ station2 - $ station1減去區域,同時首先在zone_cost表中找到區域差異... – Jon 2012-01-12 23:18:58

0

你的問題是在你的IF和foreach語句......你需要使用array_push,因爲它被定義爲一個陣列添加到您的$ data變量。此外,你的返回語句打破了功能。意思是你的foreach只運行一次。您需要將您的返回語句移到foreach語句之外,以便只在foreach語句完成後纔等待返回$ data。

if ($query->num_rows() > 0) 
    { 
     foreach ($query->result() as $row) 
     { 
      array_push($data,$row->Cost); 

     } 
     return $data; 

    } 
相關問題