PDO で関数 AES_ENCRYPT を使用すると問題が発生します。バインドされたパラメーターとして :pass および :key を使用して以下の SQL ステートメントを使用すると、データベースから一致が得られません。ただし、それらを取り出して SELECT ステートメントに直接配置すると、正しい COUNT の 1 という結果が得られます。
これらをステートメントに間違って埋め込んでいますか、それとも選択関数を AES_ENCRYPT 関数で適切に動作させる別の方法はありますか?
この関数は、 SELECT * FROM users WHERE name=:name AND email=:emailなどのストレート パラメータで正しく機能します。
$query[] = "SELECT COUNT(1) FROM users WHERE active=1 AND username=:username AND password=AES_ENCRYPT(:pass,:key);";
$query[] = array(
'username' => $username,
'pass' => $pass,
'key' => $key );
list($exists) = select( $query, true );
function select( array &$query, $one=FALSE ) {
try {
$stmt = $this->PDO->prepare( $this->named_queries( $query[0] ) );
foreach( $query[1] as $k=>$v ) {
$stmt->bindParam( ":$k", $v );
}
$stmt->execute();
$query = array(); # If the query is from a loop this prevents only the first loop's SELECT from being used.
if( $one ) {
$return = $stmt->fetch();
}else{
$return = $stmt->fetchAll();
}
return $return;
}catch( PDOException $e ) {
if( $this->test )
self::print_error( __METHOD__, $e->getMessage() );
return false;
}
}