2

暗号化ルーチンを 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ステートメントがうまく機能したときに、テーブルのループが機能しなかった理由を知りたいと思っています。

4

1 に答える 1

1

コードに:$row[UID]があり、これは定義されていないため、レコードは更新されません。

に変更$row[UID]$row['UID']ます。

使用する:

$sql="UPDATE testdata SET Str2='".$Encrypted."' WHERE UID=".$row['UID'];
于 2013-05-09T22:02:02.417 に答える