CodeIgniter db error: real_scape_string () для логического значения - PullRequest
0 голосов
/ 29 мая 2018

Я сталкиваюсь с этой ошибкой в ​​моей функции модели:

An uncaught Exception was encountered

Type:        Error
Message:     Call to a member function real_escape_string() on boolean
Filename:    /var/www/html/project/system/database/drivers/mysqli/mysqli_driver.php
Line Number: 391

Backtrace:
    File: /var/www/html/project/application/models/FeedCompanies.php
    Line: 125
    Function: where

Это функция:

public function getCompanyMessages($idCompany)
{
    $usersModel     = $this->modelslibrary->getModelUsers();
    $companiesModel = $this->modelslibrary->getModelCompanies();

    $where = array(
        $usersModel->table_name.'.id_company' => $idCompany,
        $this->table_name.'.deleted'          => 'N'
    );

    $this->db->select(
        $this->table_name.'.'.$this->primary_key.', '.
        $this->table_name.'.token, '.
        $usersModel->table_name.'.id_company, '.
        $usersModel->table_name.'.slug, '.
        $this->table_name.'.id_user, '.
        $this->table_name.'.message, '.
        $this->table_name.'.posted_as_company, '.
        $this->table_name.'.likes, '.
        $this->table_name.'.created_at, 
        getUserName('.$usersModel->table_name.'.name, '.$usersModel->table_name.'.last_name) as name,
        getProfilePhotoURL('.$usersModel->table_name.'.profile_photo) as profile_photo,
        getCompanyLogo('.$companiesModel->table_name.'.logo) as company_logo, '.
        $companiesModel->table_name.'.name as company_name'
    );

    $this->db->join($usersModel->table_name, $usersModel->table_name.'.'.$usersModel->primary_key.' = '.$this->table_name.'.id_user');
    $this->db->join($companiesModel->table_name, $companiesModel->table_name.'.'.$companiesModel->primary_key.' = '.$usersModel->table_name.'.id_company');
    $this->db->where($where);
    $this->db->order_by($this->table_name.'.created_at ASC');

    $queryResult = $this->db->get($this->table_name);

    if (!$queryResult) return null;

    $messages = $queryResult->result_array();

    if (!$messages) return null;

    return $messages;
}

Линия 125 равна $this->db->where($where);поэтому я написал echo(var_export($where, true)); перед этим, чтобы получить содержимое массива $, где , а содержимое выглядит так:

array (
   'users.id_company' => 2,
   'feed_companies.deleted' => 'N',
)

Почему у меня возникает эта ошибка и какрешить это?

Моя среда:

  • CodeIgniter 3.0.4
  • PHP 7.2.5
  • Ubuntu 16.04
  • MySQL Server 5.7.22
  • Apache 2.4.18

А вот мой config/database.php:

$active_group = 'default';
$query_builder = TRUE;

$db['default'] = array(
    'dsn'   => '',
    'hostname' => '127.0.0.1',
    'username' => '{{user}}',
    'password' => '{{password}}',
    'database' => '{{database}}',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'autoinit' => TRUE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

--- EDIT --

Как и просили, вот содержимое моей модели FeedCompanies.php :

<?php
namespace Application\Models;

use MY_Model;

defined('BASEPATH') OR exit('No direct script access allowed');

require_once (APPPATH.'/libraries/traits/Log.php');


class FeedCompanies extends MY_Model
{
    use \Log;

    public $table_name  = 'feed_companies'; // set the name of the table for this model.
    public $primary_key = 'id'; // set the primary key

    private $db;

    public function __construct()
    {
        parent::__construct();

        $ci =& get_instance();

        $this->db = $ci->db;

        $this->load->library('modelslibrary');
    }

    public function storeMessage($insertFields)
    {
        $insertFields['created_at'] = date("Y-m-d H:i:s");

        $this->db->insert($this->table_name, $insertFields);

        return $this->db->insert_id();
    }

    public function getMessage($where)
    {
        $usersModel     = $this->modelslibrary->getModelUsers();
        $companiesModel = $this->modelslibrary->getModelCompanies();

        // sending only id
        if (is_numeric($where)) {
            $where = array($this->table_name.'.'.$this->primary_key => $where);
        } else {
            // setting table name as prefix of each field in where clause to avoid conflict
            foreach ($where as $key => $value) {
                unset($where[$key]);

                $where[$this->table_name . '.' . $key] = $value;
            }
        }

        $where[$this->table_name.'.deleted'] = 'N';

        $this->db->select(
            $this->table_name.'.'.$this->primary_key.', '.
            $this->table_name.'.token, '.
            $usersModel->table_name.'.id_company, '.
            $usersModel->table_name.'.slug, '.
            $this->table_name.'.id_user, '.
            $this->table_name.'.message, '.
            $this->table_name.'.posted_as_company, '.
            $this->table_name.'.likes, '.
            $this->table_name.'.created_at,
            getUserName('.$usersModel->table_name.'.name, '.$usersModel->table_name.'.last_name) as name,
            getProfilePhotoURL('.$usersModel->table_name.'.profile_photo) as profile_photo,
            getCompanyLogo('.$companiesModel->table_name.'.logo) as company_logo, '.
            $companiesModel->table_name.'.name as company_name'
        );

        $this->db->join($usersModel->table_name, $usersModel->table_name.'.'.$usersModel->primary_key.' = '.$this->table_name.'.id_user');
        $this->db->join($companiesModel->table_name, $companiesModel->table_name.'.'.$companiesModel->primary_key.' = '.$usersModel->table_name.'.id_company');
        $this->db->where($where);

        $queryResult = $this->db->get($this->table_name);

        if (!$queryResult) return null;

        $message = $queryResult->result_array();

        if (!$message) return null;

        return $message[0];
    }

    public function getCompanyMessages($idCompany)
    {
        $usersModel     = $this->modelslibrary->getModelUsers();
        $companiesModel = $this->modelslibrary->getModelCompanies();

        $where = array(
            $usersModel->table_name.'.id_company' => $idCompany,
            $this->table_name.'.deleted'          => 'N'
        );

        $this->db->select(
            $this->table_name.'.'.$this->primary_key.', '.
            $this->table_name.'.token, '.
            $usersModel->table_name.'.id_company, '.
            $usersModel->table_name.'.slug, '.
            $this->table_name.'.id_user, '.
            $this->table_name.'.message, '.
            $this->table_name.'.posted_as_company, '.
            $this->table_name.'.likes, '.
            $this->table_name.'.created_at, 
            getUserName('.$usersModel->table_name.'.name, '.$usersModel->table_name.'.last_name) as name,
            getProfilePhotoURL('.$usersModel->table_name.'.profile_photo) as profile_photo,
            getCompanyLogo('.$companiesModel->table_name.'.logo) as company_logo, '.
            $companiesModel->table_name.'.name as company_name'
        );

        $this->db->join($usersModel->table_name, $usersModel->table_name.'.'.$usersModel->primary_key.' = '.$this->table_name.'.id_user');
        $this->db->join($companiesModel->table_name, $companiesModel->table_name.'.'.$companiesModel->primary_key.' = '.$usersModel->table_name.'.id_company');
        $this->db->where($where);
        $this->db->order_by($this->table_name.'.created_at ASC');

        $queryResult = $this->db->get($this->table_name);

        if (!$queryResult) return null;

        $messages = $queryResult->result_array();

        if (!$messages) return null;

        return $messages;
    }

    public function updateMessage($idMessage, $updateFields)
    {
        $updateFields['updated_at'] = date("Y-m-d H:i:s");

        $this->db->where($this->primary_key, $idMessage);

        return $this->db->update($this->table_name, $updateFields);
    }

    public function destroyMessage($idMessage)
    {
        $updateFields['deleted'] = 'Y';

        return $this->updateMessage($idMessage, $updateFields);
    }
}

1 Ответ

0 голосов
/ 02 июня 2018

Ну, я не понял ни проблемы, ни решения.Итак, чтобы обойти это, я построил полный запрос ранее и запустил его с методом query().

Таким образом:

$query = $this->db->get_compiled_select();

$queryResult = $this->db->query($query);

И теперь он работает.

...