codeigniter добавить N в sql-запрос ВСТАВИТЬ текст в юникоде

#php #sql-server #codeigniter

#php #sql-сервер #codeigniter #юникод

Вопрос:

Я работаю с codeigniter / SQL. Где я хочу вставить строку Юникода с префиксом ‘N’ для вставки. Как я могу добиться этого при обычной вставке.

Обычный код:

 $data = array(
   'title' => 'My title' ,
   'name' => 'My Name' ,
   'data' => 'My data'
);

$this->db->insert('mytable', $data); 
  

ВСТАВИТЬ пытается достичь:

 INSERT INTO mytable (title, name, data)
VALUES ('My title','My Name',N'My data');
  

Есть ли какой-либо способ выполнить вышеуказанную вставку вместо ручной записи запроса.?

Комментарии:

1. Вы должны переопределить system DB_driver.php _insert() метод и создайте свой собственный, который проверяет каждое значение и использует его как преобразованный в префикс N, где это необходимо. Проверьте строки 1396-1399 .

Ответ №1:

У меня были проблемы с Юникодом с использованием Codeignter 3, драйвера sqlsrv, и мне удалось заставить его работать, изменив System/database/DB_Driver.php . Возможно, есть лучшее решение, оно не красиво, но оно работает, просто измените функции _insert и _update .

 protected function _insert($table, $keys, $values)
{
    foreach($values as $key => $value)
    {
        if(substr($value,0,1) == "'")
        {
            $values[$key] = "N". $value;
        }
    }

    return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
}




protected function _update($table, $values)
{

        foreach($values as $key => $value)
        {
            if(substr($value,0,1) == "'")
            {
                $values[$key] = "N". $value;
            }
        }

        foreach ($values as $key => $val)
        {
            $valstr[] = $key.' = '.$val;
        }



        return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
            .$this->_compile_wh('qb_where')
            .$this->_compile_order_by()
            .($this->qb_limit ? ' LIMIT '.$this->qb_limit : '');
}
  

Комментарии:

1. Решение ur не будет хорошим, если мы используем две разные базы данных одновременно.. используется N для запросов SQL.. можно использовать и в MySQL, поэтому, если мы изменим основной файл, это повлияет на это.

2. Мне нравится это решение — если вы сделаете его зависимым от dbdriver, if ($this->dbdriver == 'sqlsrv') это не повлияет на другие подключения к БД.

Ответ №2:

Это самый простой способ сделать это.

 $data = array(
   'title' => 'My title' ,
   'name' => 'My Name' ,
   'data' => 'N'.'My data' 
);

$this->db->insert('mytable', $data); 
  

Или, если префикс должен быть более динамичным, сделайте это

 $pre = foo(bar);
$data = array(
   'title' => 'My title' ,
   'name' => 'My Name' ,
   'data' => $pre.'My data' 
);

$this->db->insert('mytable', $data); 
  

Ответ №3:

Спасибо Эгги и Леандро за их предложение. Я использую CI 3.1.9, и вот мое решение:

 public function escape($str)
{
    ...
    elseif (is_string($str) OR (is_object($str) amp;amp; method_exists($str, '__toString')))
    {
        if ($this->dbdriver == 'sqlsrv')
        {
            return "N'".$this->escape_str($str)."'";
        }
        return "'".$this->escape_str($str)."'";
    }
    ...
}