codeigniter 在 sql 查询中添加 N INSERT unicode 文本

问题描述 投票:0回答:4

我正在使用 codeigniter / SQL。我想在其中插入带有 'N' 前缀的 unicode 字符串。我怎样才能在常规插入中实现它。

常规代码:

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

有什么方法可以实现上述插入而不是手动编写查询?

php sql-server codeigniter unicode
4个回答
2
投票

我在使用 Codeignter 3、驱动程序 sqlsrv 时遇到了 Unicode 问题,我设法通过修改 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
投票

这是最简单的方法。

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

1
投票

感谢 Eggy 和 Leandro 的建议。我使用 CI 3.1.9,这是我的解决方案:

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

0
投票

只需在每个函数的第一行添加以下代码 _insert($table, $keys, $values) abd _update($table, $values) 即可。

  if ($this->dbdriver == 'sqlsrv')
    {
        foreach($values as $key => $value)
        {
            if(substr($value,0,1) == "'")
            {
                $values[$key] = "N". $value;
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.