2012-01-04 7 views
3

나는 게시하기 전에 광범위하게 검색했습니다. :)Ays_ENCRYPT를 사용할 때 Mysqli 준비 문과 관련한 문제

나는 간단한 삽입을 mySQL에 시도하고있다. 준비된 문장을 사용하여 mysqli를 사용하고있다. 아래 코드는 다음과 같습니다.

$sql_query = "UPDATE $table SET $name = AES_ENCRYPT(?,'$key') WHERE $id_name = '$_SESSION[$id_name]'"; 
$stmt = $mysqli->prepare($sql_query); 
$stmt->bind_param('b', $value); 
$stmt->execute(); 

예, 코드의 앞부분에있는 mySQL 데이터베이스 서버에 $ mysqli를 선언하고 있습니다. $ key는 스크립트에서 더 일찍 선언됩니다. 당신이 볼 수 있듯이, MySQL은 삽입 쿼리를 준비하고 있지만 $ 값의 값을 캡처하지 않습니다

120104 10:46:18 359 Connect [email protected] on payday-loan-leads 
        359 Query  SELECT table_location, id_name, encrypt FROM insert_information WHERE required_field_name = 'first_name' 
        359 Prepare UPDATE personal_info SET first_name = AES_ENCRYPT(?,'^&IK8uBo92X04jhAHPUH(Y(8p3)&^ndlkj32') WHERE personal_id = '5282' 
        359 Execute UPDATE personal_info SET first_name = AES_ENCRYPT('','^&IK8uBo92X04jhAHPUH(Y(8p3)&^ndlkj32') WHERE personal_id = '5282' 
        359 Close stmt 
        359 Quit 

: 다음은이 코드가 호출되는 MySQL의 일반적인 로그 파일에 출력됩니다. 나는 $의 sql_query에서 AES_ENCRYPT를 제거하면, 그것은 마법처럼 작동합니다

$stmt = $mysqli->prepare("UPDATE $table SET $name = ? WHERE $id_name = '$_SESSION[$id_name]'"); 
$stmt->bind_param('s', $value); 

그래서 문제가 MySQL을의 AES_ENCRYPT 기능입니다. 함수를 bind_param 행으로 옮겨 보았는데 이것이 작동하지 않았습니다. 누구든지 여기에 아이디어가 있습니까?

답변

3

aes 버전에서는 바인딩에 b (blob)을 사용하지만 비어 있지 않은 버전에서는 s (string)을 사용합니다. AES 버전에서 s을 시도하십시오. 필드 나 테이블 이름으로 사용하지 않는 한 쿼리에 매개 변수가 나타나는 것은 중요하지 않습니다.

+0

예, 데이터를 암호화하기 때문에 데이터를 저장하는 열의 데이터 유형이 varbinary이므로 BLOB을 사용하는 이유가 있습니다. 그러나 나는 이것을 시도하고 다시보고 할 것이다. –

+0

OK, 실제로 문제가 해결되었습니다! AES_ENCRYPT()에 전달 된 첫 번째 매개 변수가 암호화 될 문자열이기 때문에 의미가 있습니다. 나는 AES_ENCRYPT의 결과를 생각하고 있었는데, 그것은 명백히 blob입니다 ... –