#php #postgresql #codeigniter
#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 }
Кто-нибудь может мне помочь, пожалуйста?
Спасибо!
Комментарии:
1. Вы возвращаете результаты запроса в
$query
, затем пытаетесь выполнить запрос по результатам. Это не сработает.2. Предупреждение: вы широко открыты для SQL-инъекций и должны действительно использовать параметризованные подготовленные операторы вместо ручного построения ваших запросов. Они предоставляются PDO или MySQLi . Никогда не доверяйте никаким входным данным, особенно тем, которые поступают со стороны клиента. Даже если ваши запросы выполняются только доверенными пользователями, вы все равно рискуете повредить свои данные .
3. Если вы используете CodeIgniter, то почему вы неправильно подготавливаете операторы SQL в виде строки? Какова цель наличия фреймворка, если вы его не используете?
Ответ №1:
Чтобы написать запрос, защищенный от 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);
}
Ответ №2:
Вы можете попробовать:
Модель:
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-инъекции. Вы должны использовать параметризованные подготовленные операторы.