Функция Codeigniter Cost - без ошибок, но без расчета - PullRequest
0 голосов
/ 13 января 2012

Я не получаю ошибок 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;
        }

    } 
}

Большое спасибо,

Ответы [ 2 ]

2 голосов
/ 13 января 2012
  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 (), может быть:

    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. Last, здесь:

    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;

ОБНОВЛЕНИЕ:

Вы говорите, что ваш запрос работает в 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 усложняет ситуацию, когда вам нужно начать избегать защиты идентификаторов и так далее.Подобный выше запрос по-прежнему безопасен от внедрения, поскольку использует привязки запросов и в 10 раз проще, чем сборка с AR.

Не видя схему БД, я все еще не могу понять, почему JOIN и почему он работаеттолько на столе и сам как псевдоним ... но я отвечал в неправильное время дня (ночью и этим утром :)), так что это может быть только я.Какие таблицы и как они структурированы?

0 голосов
/ 13 января 2012

Ваша проблема в операторе IF и Foreach ... Вам нужно использовать array_push для добавления в переменную $ data, поскольку она определена как массив. Кроме того, ваш оператор возврата выходит из функции. Это означает, что ваш foreach запускается только один раз. Вы должны переместить свой возвратный оператор за пределы оператора foreach, чтобы он ожидал возврата $ data только после завершения foreach.

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

        } 
         return $data;

    }  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...