2017-04-13 50 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的可選擴展允許執行全數據庫加密,但這些擴展忽略了查詢日誌。