我正在进行CI 1.2到CI 3.x的升级。我有3个表,其中11个字段在CI 1.x中使用SHA1编码。 CI 3使用AES-256。实际上,我需要执行一个UPDATE tablex集(fielda = $ this-> encrypt-> encode_from_legacy(fielda)),这是一个无效的SQL。
如何枚举目标表的每一行并使用编码函数的结果更新行?
我想不出使用不同的密码和模式在本机SQL语句中解码和编码的方法。
有什么想法吗?
答案 0 :(得分:0)
这是我提出的将旧的MD5散列数据重新加密为AES-256数据的解决方案。 (不是密码数据)。
function doUpdates ($query = null) {
$this->load->library('encrypt'); //obsolete MD5 (PHP 7.x not supported)
$this->load->library('encryption'); // CIv3 AES-256
$dbobject=array(
'appointments' => array('completion_notes'),
'health_profiles' => array('allergies',
'pregnancy_history',
'medications',
'hospitalizations',
'social_history',
'personal_illness',
'family_illness',
'height',
'weight')
);
foreach($dbobject as $table=>$fields) {
echo "Fix table: ".$table."<br/>";
$query = $this->db->get($table)->result_array();
foreach ($query as $row) {
foreach($fields as $field){
//decrypt from legacy MD5 to AES-256
$after = $this->encryption->encrypt(
$this->encrypt->decode(
$this->encrypt->encode_from_legacy($row[$field])));
$sql_set = $field."= '".$after."',";
} //end foreach field
//remove last comma
$sql_set = substr_replace($sql_set, "", -1);
switch ($table) {
case "appointments":
$primarykey = "appointment_id";
break;
case "health_profiles":
$primarykey = "health_profile_id";
break;
} //end switch
echo "Encrypting data for primary key: ".$row[$primarykey]."<br/>";
$this->db->simple_query('update '.$table. " set ". $sql_set." where ".$primarykey." = '".$row[$primarykey]."'");
} // end for each row
} //end foreach table
} // end createUpdates
} //结束recrypt控制器