显示SELECT COUNT个结果-错误:需要字符串,给定对象

时间:2019-04-17 19:15:11

标签: php postgresql codeigniter

在我的项目中(Codeigniter-MVC。数据库:Postgres),我需要在视图中显示查询结果。但它返回错误:

遇到PHP错误 严重程度:警告 消息:preg_match()期望参数2为字符串,给定对象 文件名:database / DB_driver.php 行号:622

我的观点:

$date1 = date('Y-m-d');
$date2 = date('Y-m-d', strtotime($date1. ' +30 day'));  
$total_days = $this->sac->holidays($date1,$date2);
echo $total_days;

我的模特:

public function holidays($date1,$date2)
  {
    $query = $this->db->query("SELECT COUNT (*) FROM table_holidays WHERE date_row between '".$date1."' AND  '".$date2."';");
    $return = $this->db->query($query);
    $result = $return->result();
     return json_encode($return->result()); 
   }

DB_driver.php

620 function is_write_type($sql)
621 {
622     if ( ! preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql))
623     {
624         return FALSE;
625     }
626     return TRUE;
627 }

有人可以帮助我吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

要编写可防止SQL注入的查询,请使用查询绑定,如此处所示,并说明HERE。通过将用于COUNT的列限制为一(而不是所有列,即*),这也优化了查询,并且还可以确保检查空结果集并在这种情况下返回零计数。

public function holidays($date1,$date2)
{
    $sql = "SELECT COUNT(startdate) as count FROM events WHERE startdate between ? AND ?";
    $query = $this->db->query($sql, [$date1, $date2]);
    $row = $query->row();

    $count = ! empty($row) ? $row->count : 0; //$count=$row->count if $row is not empty, else $count=0 
    return json_encode($count);
}

答案 1 :(得分:0)

您可以尝试:

型号:

public function holidays($date1,$date2)
  {
    $query = $this->db->query("SELECT COUNT (*) FROM table_holidays WHERE date_row between '".$date1."' AND  '".$date2."';");
    echo $query->num_fields(); 
   }

查看:

$date1 = date('Y-m-d');
$date2 = date('Y-m-d', strtotime($date1. ' +30 day'));  
$this->sac->holidays($date1,$date2);

但是正如Dharman所说,您可以进行SQL注入。您应该使用参数化的准备好的语句。