Показать результат SELECT COUNT - Ошибка: ожидается строка, заданный объект - PullRequest
0 голосов
/ 17 апреля 2019

В моем проекте (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 ]

1 голос
/ 18 апреля 2019

Чтобы написать безопасный запрос от SQL-инъекции, используйте привязку запроса, как показано здесь и объяснено ЗДЕСЬ .Это также немного оптимизирует запрос, ограничивая количество столбцов, используемых для 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);
}
0 голосов
/ 18 апреля 2019

Вы можете попробовать:

Модель:

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);

Но, как сказал Дхарман, вы открыты для внедрения SQL.Вы должны использовать параметризованные подготовленные операторы.

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