2017-04-13 94 views
0

我有一个访问类似这样的伪代码MySQL数据库大约75 PHP现有脚本的其余部分之前更改Mysqli_result:返回结果到应用

$query="SELECT * from table"; 
$result=mysqli_query($conn,$query); 
if (mysqli_num_rows($result)) { 
    while($row=mysqli_fetch_assoc($result)) { 
     //use the rows 
    } 
} 

我最近被迫将所有的数据库字段单独加密,所以现在当这75个php脚本如上所示运行时,所有的$行会返回所有加密的字段,因此无法使用。

因此,而不是改变所有的75个PHP脚本来解码每个字段,我想创建一个函数执行mysqli_query,然后解密所有字段,并返回结果,就好像它是由mysqli_query返回的,但解密。像

function QueryAndDecrypt($conn,$query){ 
    $result=mysqli_query($conn,$query); 
    if (mysqli_num_rows($result)) { 
     while($row=mysqli_fetch_assoc($result)) { 
      $row=decrypt($row); 
     } 
    } 
    return $result; <<----- return result with fields decrypted 
} 

// now all 75 scripts would have to change just one line to call above 

$query="SELECT * from table"; 
$result=QueryAndDecrypt($conn,$query); <<--- change only 1 line 
if (mysqli_num_rows($result)) { 
    while($row=mysqli_fetch_assoc($result)) { 
     //use the rows as normal decrypted 
    } 
} 

事情正如你可以看到我只是想改变这一行中的所有75个脚本,这样它会像以前一样做同样的事情,结果会回来与已解密的所有领域。

我试过编写这个QueryAndDecrypt函数,但是当我如上所示更改mysqli_result $行的结果时,它不会更改,因为mysql的结果是某种不可更改的集合(我被告知)或类似的东西那。

无论如何,通过编写一个可以从执行sql查询的所有脚本中调用的通用函数来执行此操作,并且还可以通过所有其他脚本(如普通的mysql查询结果?

任何人都可以帮助,即时“新鲜的船”,所以我不知道SQL或php,我现在非常绝望,因为所有的脚本都因此而被破坏!

感谢

+0

可能重复[结果集不更新后mySQL查询](http://stackoverflow.com/questions/43381066/result-set-not-updating-after-mysql-query) – Jocelyn

+0

如果您使用msqli在OO风格,你可以创建一个类来伪装返回行数的方法(如果有的话,返回1),并返回一行的数组。但是你有程序风格,所以你将不得不编辑num rows行和fetch line。 –

+0

对其他问题没有解决方案 – Programmer2

回答

1

很抱歉,您不能修改结果行,然后以某种方式“unfetch”它们放回结果再次得到。

但是你可以通过改变一行修复代码:

$query = "SELECT * from table"; 
$result = mysqli_query($conn,$query); 
if (mysqli_num_rows($result)) { 
    while ($row = MyFetchAssocAndDecrypt($result)) { <<--- change only 1 line 
     //use the rows as normal decrypted 
    } 
} 

你不得不写函数是这样的:

function MyDecrypt(&$item, $key) { 
    $item = openssl_decrypt($item, OPENSSL_CIPHER_AES_256_CBC, MY_SECRET_KEY); 
} 

function MyFetchAssocAndDecrypt($conn, $result){ 
    $row = mysqli_fetch_assoc($conn, $result); 
    array_walk($row, 'MyDecrypt'); 
    return $row; <<----- return row with fields decrypted 
} 

PS:你提到AREN”的要求应该通过网络将未加密的数据发送到数据库。这不是我关心的问题,因为您可以使用VPN或通过SSL连接到数据库。

更大的问题是,包含您的明文数据和明文加密密码的查询将写入MySQL服务器上的数据库日志,并且这些日志未加密。

有一些MySQL的可选扩展允许执行全数据库加密,但这些扩展忽略了查询日志。