【问题标题】:decode mysql query before returning it to view在返回查看之前解码 mysql 查询
【发布时间】:2010-06-07 18:47:30
【问题描述】:

我正在对返回加密数据的 mysql 进行查询。如果可能的话,我想在将结果发送到视图之前对其进行解码。在控制器(甚至模型)中而不是在视图中处理解码似乎是更好的形式。

不过,我似乎不知道该怎么做。

我在想我可以遍历对象,对其进行解码,然后将其推送到另一个数组,该数组将被发送到视图。问题是我不知道(并且需要保留)查询的索引。

所以查询可能会返回如下内容:

[id] => 742 
[client_id] => 000105 
[last] => dNXcw6mQPaGQ4rXfgIGJMq1pZ1dYAim0 
[first] => dDF7VoO37qdtYoYKfp1ena5mjBXXU0K3dDlcq1ssSvCgpOx75y0A== 
[middle] =>iXy6OWa48kCamViDZFv++K6okIkalC0am3OMPcBwK8sA==
[phone] => eRY3zBhAw2H8tKE

有什么想法吗?


结束了:

function name(){
    $data['e_key']=$this->e_key;
    $clid = $this->uri->segment(3);
    $name = $this->Clients_model->getNameData('*','client_id='.$clid,'');
    $nameArray= array();
    foreach ($name->result() as $row){
        $x = $row;
        $keys = array('id','client_id');
        $unenc = array();
        foreach ($x as $key=>$value){
            if(! in_array($key, $keys)){
                $unenc[$key]=$this->encrypt->decode($value,$this->e_key);
            }else{
                $unenc[$key]=$value;
            }
        }
        array_push($nameArray,$unenc);
     }
    $data['name'] = $nameArray;
    $this->load->view('names/name_view',$data);

}

【问题讨论】:

  • 注意不要将加密与编码混淆(我注意到诸如“需要解码加密数据”之类的短语,以及稍后谈到 base 64 的答案)。它们不是一回事,如果您没有正确保护数据,或者更糟糕的是,您的客户的要求,您可能(例如,如果您正在处理信用卡)违法!
  • @Kurucu:谢谢你的来信。我想我使用了“解码”这个术语,因为这就是 codeigniter 中的方法被称为 (encrypt->encode/encrypt->decode)。我在这篇文章中从技术上讲是加密,而不是编码。

标签: php arrays encryption codeigniter


【解决方案1】:

假设您知道如何解密数据,这只是遍历对象、解密加密字段的问题。

如果$YOUR_OBJECT 是您的对象并且您的解密函数是decode(),那么下面的代码应该可以解决问题。

// The keys corresponding to the encrypted fields
$encoded = array('last', 'first', 'middle', 'phone');

$decoded = array();
foreach($YOUR_OBJECT as $key => $value)
{
    if (in_array($key, $encoded))
    {
        $decoded[$key] = decode($value);
    }
}

【讨论】:

  • 所以我知道钥匙吗?我只是在想,如果有一种方法可以在不知道键的情况下迭代对象,这样它就可以重用了。这可能吗?谢谢!
  • 您的数据有多少是加密的?您需要指定加密的密钥或未加密的密钥。如果您只有几个未加密的字段,使用 `$unencoded = array('id');` 和 if ( ! in_array($key, $unencoded)) 可能会更好。你如何加密数据?根据加密的不同,您可能无需指定字段即可检测要解密的字段。
【解决方案2】:

如果它是一个特定的索引,你可以像这样解码它

$result['last'] = base64_decode($result['last']);

或者在模型中,使用修改器和访问器:

 public function setUp() {
       $this->setTableName('tablename');
        $this->actAs('Timestampable');
        $this->hasMutator('last', '_encode64');
        $this->hasAccessor('last', '_decode64');
   }

 protected function _encode($value) {
     $this->_set('last',base64_encode($value));
 }
protected function _decode($value) { 
     return base64_decode($value); // not sure on this one - might have to
    //  return  $this->set('last', base64_decode($value));
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多