Codeigniter成本函数 - 没有错误,但没有计算

问题描述:

我收到这个函数内置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

  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

你的问题是在你的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; 

    }