【问题标题】:codeigniter add N in sql Query INSERT unicode textcodeigniter add N in sql Query INSERT unicode text
【发布时间】:2016-01-16 20:07:36
【问题描述】:

我正在使用 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');

有没有办法实现上述插入而不是手动编写查询。

【问题讨论】:

  • 您应该覆盖系统 DB_driver.php _insert() 方法并自己创建检查每个值并在需要时将其转换为 N 前缀。 Check lines 1396 - 1399.

标签: php sql-server codeigniter unicode


【解决方案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); 

【讨论】:

    【解决方案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 : '');
    }
    

    【讨论】:

    • 当我们同时使用两个不同的数据库时,你的解决方案不会很好。N用于SQL查询。在MySQL中也可以使用它,所以如果我们改变核心文件,那么这将受到影响。
    • 我喜欢这个解决方案 - 如果你让它依赖于 dbdriver if ($this->dbdriver == 'sqlsrv') 它不会影响其他数据库连接。
    【解决方案3】:

    感谢 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)."'";
        }
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 2022-12-14
      • 2018-12-21
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      相关资源
      最近更新 更多