mysql预处理语句使用AES_ENCRYPT时的问题


Issue With Mysqli Prepared Statement When Using AES_ENCRYPT

我试图做一个简单的插入到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();

是的,我在前面的代码中声明$mysqli与mySQL数据库服务器的连接。$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行,但这不起作用。有人有什么想法吗?

在aes版本中使用b (blob)进行绑定,而在非aes版本中使用s (string)。尝试s在AES版本-它不应该在查询中出现一个参数,只要它不用于字段或表名。