暗号化ルーチンを des からフグにアップグレードしようとしています。私は暗号化/復号化のためにこの機能を持っています:
function NewCryptStr($EncryptOrDecrypt,$Str)
{
$Key='test';
$IVSize=mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);
$IV=mcrypt_create_iv($IVSize,MCRYPT_RAND);
if($EncryptOrDecrypt==='Encrypt')
{
$Str=mcrypt_encrypt(MCRYPT_BLOWFISH,$Key,$Str,MCRYPT_MODE_ECB,$IV);
$Str=mysql_real_escape_string($Str);
}
if($EncryptOrDecrypt==='Decrypt')
$Str=mcrypt_decrypt(MCRYPT_BLOWFISH,$Key,$Str,MCRYPT_MODE_ECB,$IV);
return $Str;
}
これはうまくいきます:
$Str='test string to be encrypted then decrypted';
print "<p>Original $Str</p>\n";
$Str=NewCryptStr('Encrypt',$Str);
print "<p>Encrypted $Str</p>\n";
$Str=NewCryptStr('Decrypt',$Str);
print "<p>Decrypted $Str</p>\n";
次に、メールアドレスのテーブルで次のphpスクリプトを実行して、プレーンテキストの列を変換し、暗号化された結果で別の列を更新します:
$sql="select UID,Str from testdata order by UID";
$result=mysql_query($sql,$Link);
while($row=mysql_fetch_array($result))
{
$Encrypted=NewCryptStr('Encrypt',$row[Str]);
$sql="update testdata set Str2='$Encrypted' where UID=$row[UID]";
print "<p>$row[Str] > $Encrypted</p>\n";
print "<p>$sql</p>\n";
mysql_query($sql,$Link) or die("failed $sql ".mysql_error());
}
エラーなしで実行され、予想どおり暗号化された文字列が大量に出力されますが、テーブルのデータを表示すると、上記のphpによって出力されたのと同じデータで更新されたレコードはありません。代わりに、Str2 のほとんどの値は空白で、1 つまたは 2 つの文字が含まれているものもあります。
印刷されたすべてのSQLステートメントは問題なく表示され、それらを個別に実行すると、レコードが正しく更新されます。
SQL テーブルと mysql 接続は両方とも utf8 エンコーディングを使用しており、Str および Str2 列は varchar データ型です。
テーブルが正しいデータで更新されないのはなぜですか?
編集NewCryptStr 関数の出力/入力のベース エンコーディング/デコーディングを使用して問題を解決しました (スカートをはぎました!)。個別に実行したときにSQLステートメントがうまく機能したときに、テーブルのループが機能しなかった理由を知りたいと思っています。