【问题标题】:Using codeigniter like query with wildcard使用带通配符的类似查询的 codeigniter
【发布时间】:2015-05-05 20:59:33
【问题描述】:

我正在尝试在 Codeigniter 上使用 like 查询。该函数将我的百分号% 转义为\%

我的查询是:

SELECT *
        FROM (`invoices_rent`)
        WHERE `clerk_name` =  'BEAUTY'
        AND  `date`  LIKE '\%/\%/\%' 

$this->db->like('date', $date, 'none');

如何防止百分号被转义?

我正在尝试使用可以接收数字或通配符的日期进行过滤。所以我想要的是以一种我可以获得用户想要的月份、年份或日期的方式加入这些数据。所以我会传递给查询“%/02/2015”或“%/%/2015”以返回我需要的数据范围。但是我对函数的转义有问题。 我想我需要创建整个查询而不是使用这个 CodeIgniter 函数来完成它。遵循实际模型功能。

$date = "%/03/2015";

public function getallinvoices($type = false, $date = false, $clerk = false)
{
    if($type == "m")
        $table = "invoice_month";
    else
        $table = "invoices_rent";

    if($date != false)
        $this->db->like('date', $date, 'none');

    if($clerk != false && $clerk != "all")
        $this->db->where('clerk_name', $clerk);

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

    $this->output->enable_profiler(TRUE);
    print_r($query);

    return $query->result_array();
}

我希望查询返回如下:

SELECT *
FROM (`invoices_rent`)
WHERE `clerk_name` =  'BEAUTY'
AND  `date`  LIKE '%/03/2015'

【问题讨论】:

  • 只是为了理解你在说什么。你使用$this->db->like('date', $date);,你的结果是SELECT * FROM (invoices_rent) WHERE clerk_name = 'BEAUTY' AND date LIKE '\%/\%/\%' 你的预期结果应该是什么?
  • 您能提供整个 CI 查询吗?您能否提供$date 变量的确切内容?
  • 删除 none 作为第三个参数。来自文档:If you do not want to use the wildcard (%) you can pass to the optional third argument the option 'none'.
  • 按照@ParagTyagi的建议做,如果需要格式化当前日期,可以使用$now = date('Y-m-d', strtotime("now"))
  • 嗨,抱歉耽搁了,我提供了更多信息以提供帮助。谢谢和问候

标签: php codeigniter sql-like


【解决方案1】:

我不确定您到底想在这里做什么。
将第三个参数添加为none 不会在值周围添加通配符(%)(或者在您的情况下可能是escape)。

来自docs

如果您不想使用通配符 (%),您可以将选项“none”传递给可选的第三个参数。

$this->db->like('title', 'match', 'none');
// 产生:WHERE title LIKE 'match'

因此,如果您想使用通配符,只需删除第三个参数即可。


(仅供参考)
假设表,

`invoices_rent`

id    rent    invoice_number    clerk_name     date
1     150        INV001           BEAUTY     2015-03-04
2     250        INV002           BEAUTY01   2015-02-05
3     350        INV003           BEAUTY     2015-03-04

查询,

$date = '2015-03-04';
$this->db->like('date', $date);
$this->db->where('clerk_name');
$query = $this->db->get('invoices_rent');

return $query->result();

/**
* Result will give id: 1 & 3 as output
*/


编辑:

根据您更新的问题,基本上您想要 2015 年 3 月的所有行。当涉及日期范围时,您正在尝试的绝对不是查询的正确方法。您可以做的是获取月初(例如 2014-03-01)和月底(2014-03-31)并使用 between clause 这将为您提供本月的所有行三月
以下将是您的查询。

$month_start = date('Y-m-01', 'March');   # Month's start
$month_end = date('Y-m-t', 'March');      # Month's end

$this->db->where('date >=', $month_start);
$this->db->where('date <=', $month_end);
$this->db->where('clerk_name');
$query = $this->db->get('invoices_rent');

return $query->result();

/**
* Result will give id: 1 & 3 as output
*/

【讨论】:

  • 我也不知道 OP 试图用第三个参数实现什么,但这写得很好。
  • 感谢您的回答,我正在尝试使用可以接收数字或此通配符的日期进行过滤。所以我想要的是以一种我可以获得用户想要的月份、年份或日期的方式加入这些数据。所以我会传递给查询“%/02/2015”或“%/%/2015”以返回我需要的数据范围。但是我遇到了函数转义的问题。
  • @ParagTyagi 我正在尝试按照您解释的方式重新进行查询,但获取月初和月底的函数返回: date() 期望参数 2 很长,给定字符串.谢谢你的回答。
  • 请分享您用于月初和月底的确切代码。
  • @ParagTyagi 我设法手动创建了日期,现在它可以正常工作了。非常感谢朋友
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
相关资源
最近更新 更多