【问题标题】:sorting data error codeigniter排序数据错误代码点火器
【发布时间】:2015-05-13 17:06:14
【问题描述】:

当我尝试将距离输入到 5 时,我在排序数据时遇到了一些问题,我遇到了这个错误:

 Unknown column 'dystans' in 'having clause'

 SELECT COUNT(*) AS `numrows` FROM `meet` JOIN `category` ON `category`.`id` = `meet`.`category_id` HAVING `dystans` <= '5' ORDER BY `when` ASC

Filename:    C:/xamppNew/htdocs/dzielimypasje/application/controllers/Meetings.php

Line Number: 177

我正在使用 codeigniter。第177行是这个

$data['count'] = $count = $this->db->count_all_results();

我的控制器:

$lat = $this->session->userdata('lat');
$lng = $this->session->userdata('lng');

        // To pagination
$this->load->library('pagination');
$limit = 10;
$offset = $this->uri->segment(4);

$this->db->start_cache();

    $this->db->select('*, meet.id, 
        (6731 * acos( cos( radians( '.$lat.')) * cos( radians( meet.lat)) *
   cos( radians( meet.lng) - radians( '.$lng.')) + sin( radians( '.$lat.')) *
   sin( radians( meet.lat)))) AS dystans');

         //data from search engine
    $level = $this->input->post('level');
    $cat = $this->input->post('category');
    $dystans = $this->input->post('dystans');
    $when = $this->input->post('when');

    if ($level) {
    $this->db->where('level', $level); 
    }
    if ($cat) {
    $this->db->where('category_id', $cat); 
    }
    if ($when) {
    $this->db->where('when <=', $when); 
    }
    if ($dystans) {
    $this->db->having('dystans <=', $dystans); 
    }
    $this->db->order_by('when', 'ASC');
    $this->db->from('meet');
    $this->db->join('category', 'category.id = meet.category_id');

$this->db->stop_cache();

        // count for pagination
    $data['count'] = $count = $this->db->count_all_results();

        // to pagination
    $this->db->limit($limit, $offset);

    $data['meetings'] = $this->db->get();
    $this->db->flush_cache();

    $config = some config for pagination ...

    $this->pagination->initialize($config); 

    $data['pagination'] = $this->pagination->create_links();


    $this->load->view( 'site/meetings/index' , $data );

查看:

   <select type="text" name="dystans" placeholder="distance">
           <option value="">Odległość</option>
           <option value="1">Do 1 km</option>
           <option value="2">Do 2km</option>
           <option value="5">Do 5km</option>
           <option value="10">Do 10km</option>
   </select>

知道如何解决这个问题吗?可能它有缓存但我不确定,我是新的。

【问题讨论】:

  • dystans 列在哪个表中? when 在哪个表中?告诉我,我会解决您的问题。
  • dystans 在这里创建:$this->db->select('*, meet.id, (6731 * acos( cos( radians( '.$lat.')) * cos( radians ( meet.lat)) * cos( 弧度( meet.lng) - 弧度('.$lng.')) + sin( 弧度('.$lat.')) * sin( 弧度( meet.lat))) ) 作为反抗者');何时、级别、表中的 category_id 相遇
  • 您是否希望字段级别、category_id、when、dystans 是可过滤的,这意味着用户可以输入其中的任何一个,并且查询将根据他们列出的数量进行过滤?如果是这种情况,这些字段中的任何一个是否总是通过邮件传递?还是只会通过这些字段中的一个?例如,如果用户发布了关卡,他们何时无法发布?
  • 是的,我想成为可过滤的,并且类别和级别工作正常。现在它们通过邮寄方式传递,用户可以同时按几个字段排序。但后来我必须弄清楚一些事情,因为你看到我有分页,所以如果用户从帖子转到下一页数据将会消失,所以它不会正常工作。但现在的主要问题是我不知道为什么我不能按dystans 排序
  • 我正在努力重构它。我以前做过这一切。我在这里有一个帖子,解释了过滤器的分页,我也会链接到你。

标签: codeigniter sorting caching


【解决方案1】:

好的。我深入研究并修复了我能找到的所有东西。我放弃了使用 query() 函数直接访问数据库的活动记录,因为......嗯......我从不喜欢活动记录,并且个人认为在管理工具中编写查询并将其复制到模型中要干净得多。这使您可以访问 mysql 的所有功能,而无需跳过障碍(更不用说,如果您将来使用不同的代码库,您已经有了查询并且不必重新挖掘所有活动记录代码)。

您在dystans 块中中断的主要原因是您试图在where 子句中使用动态生成的列。 where 子句只知道您已加入的表中存在的列。因此,要执行您需要的操作,您必须重新执行您的公式。

我还打破了这一点,以便所有过滤器都可以相互配合使用。用户现在可以在使用过滤器反斯坦时使用过滤器,并且将相应地构建查询。

我没有测试过这段代码,因为很明显我没有你的数据库,但这与我编写所有应用程序的方式相同。如果您有麻烦,请告诉我。

您还应该真正考虑将您的业务逻辑或至少数据库交互分解为一个 codeigniter 模型。控制器只能充当模型和视图之间的路由器。

The link to my post on codeigniter pagination

<?php

$lat = $this->session->userdata('lat');
$lng = $this->session->userdata('lng');

// To pagination
$this->load->library('pagination');
$limit = 10;
$offset = (isset($this->uri->segment(4)) && is_numeric($this->uri->segment(4))) ? $this->uri->segment(4) : 0;

$bindArray = array();

$query = "SELECT *,"
        . " (6731 * acos(cos( radians(?)) * cos( radians( meet.lat))"
        . " * cos( radians( meet.lng) - radians(?)) + sin( radians(?))"
        . " * sin( radians( meet.lat)))) AS dystans";

$bindArray[] = $lat;
$bindArray[] = $lng;
$bindArray[] = $lat;


$query .= " FROM meet JOIN category ON category.id = meet.category_id"
        . " WHERE TRUE = TRUE";

//data from search engine
$level = $this->input->post('level');
$cat = $this->input->post('category');
$dystans = $this->input->post('dystans');
$when = $this->input->post('when');

if($level){
    $query .= " AND meet.level = ?";
    $bindArray[] = $level;
}
if($cat){
    $query .= " AND meet.category_id = ?";
    $bindArray[] = $cat;
}
if($when){
    $query .= " AND meet.when <= ?";
    $bindArray[] = $when;
}
if($dystans){
    $query .= " AND (6731 * acos(cos( radians(?)) * cos( radians( meet.lat))"
            . " * cos( radians( meet.lng) - radians(?)) + sin( radians(?))"
            . " * sin( radians( meet.lat)))) <= ?";
    $bindArray[] = $dystans;
}

$query .= "LIMIT ?,?";
$bindArray[] = $offset;
$bindArray[] = $limit;

$query_result = $this->db->query($query, $bindArray);

$data['count'] = $query_result->num_rows();
$data['meetings'] = $query_result->result();

$config = 'YOUR PAGINATION CONFIGURATION';

$this->pagination->initialize($config); 

$data['pagination'] = $this->pagination->create_links();


$this->load->view( 'site/meetings/index' , $data );

【讨论】:

  • 感谢您的帮助。我现在有这个错误: 错误号:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行 SELECT *, (6731 * acos(cos( 弧度(50.070215)) * cos( 弧度( meet.lat)) 附近的 'NULL,10' 附近使用正确的语法* cos( 弧度( meet.lng) - 弧度(20.045192)) + sin( 弧度(50.070215)) * sin( 弧度( meet.lat)))) AS dystans FROM meet JOIN category ON category.id = meet.category_id WHERE TRUE = TRUE LIMIT NULL,10 文件名:C:/xamppNew/htdocs/dzielimypasje/application/controllers/Meetings.php 行号:79
  • 看起来您没有定义默认偏移值。您可以更改行: $offset = $this->uri->segment(4); TO $offset = (isset($this->uri->segment(4)) && is_numeric($this->uri->segment(4))) ? $this->uri->segment(4) : 0;我也会用代码更新上面的内容。
  • 我有一些问题,当我使用你的代码时,我的其他功能崩溃:(
猜你喜欢
  • 2016-03-15
  • 2011-09-27
  • 2016-01-13
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多