使用AES_ENCRYPT时Mysqli准备语句的问题

时间:2012-01-04 16:57:09

标签: php mysql mysqli prepared-statement sqlbindparameter

我在发帖之前已广泛搜索过。 :)

我正在尝试对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   root@localhost 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正在准备INSERT查询但不捕获$ value的值。当我从$ 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行,这不起作用。任何人有任何想法吗?

1 个答案:

答案 0 :(得分:3)

您在aes版本中使用b(blob)进行绑定,而在非aes版本中使用s(字符串)。在AES版本中尝试s - 在查询中出现参数时无关紧要,只要它不用于字段或表名。