2013-05-09 3 views
2

des에서 blowfish로 암호화 루틴을 업그레이드하려고합니다. 이 잘 작동암호화 된 데이터가 mysql 테이블에 삽입되지 않음

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 스크립트를 실행하는거야 내가 EN/암호 해독에이 기능이 나는 w를 제외한 예상대로 & 인쇄 출력을 오류없이 암호화 된 문자열의 부하를

$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 문이 개별적으로 실행될 때 행복하게 작동 할 때 테이블을 통한 루프가 작동하지 않는 이유가 궁금합니다.

+2

mysql_로의 *가되지 않습니다, 나는 강하게 당신이 PDO 또는 mysqli로 전환 좋을 것. 또한'$ EncryptOrDecrypt' 변수가 부울 대신 대소 문자를 구분하는 문자열입니까? 예상대로 표시되지 않는 데이터는 어디에서 볼 수 있습니까? PHP는 현재 테이블에있는 데이터를 가져옵니다. PHP가 올바른 데이터를 찾으면 올바른 데이터가있는 것입니다. – Thorbear

+0

mysql 업그레이드는 todo 목록에 있습니다. $ EncryptOrDecrypt 변수는 저의 가독성을위한 것입니다. phpmyadmin에서 데이터를보고 있습니다. PHP가 정확한 데이터를 찾지 못했습니다. 암호화 된 데이터가'print "줄에 인쇄되어 있습니다.

$ row [Str]> $ Encrypted

\ n"; "은 테이블에서 끝나는 것이 아닙니다. – Orinoco

답변

1

코드에 $row[UID]이 있는데, 이는 정의되지 않았으므로 레코드가 업데이트되지 않습니다.

변경 $row[UID]에서 $row['UID']으로 변경;

사용 :

$sql="UPDATE testdata SET Str2='".$Encrypted."' WHERE UID=".$row['UID']; 
+1

사실, $ row [ 'UID']'가 따옴표 밖의 변수를 유지하는 것뿐만 아니라 최선입니다. – Thorbear

+0

$ row [UID] & $ row [ 'UID']의 모든 조합을 따옴표의 안과 밖에서 모두 사용하면 동일한 결과가 생성됩니다. – Orinoco

+0

매우 이상합니다. 인쇄 된 $ sql-s 중 하나를 여기에 붙여주십시오. –

관련 문제