我正在尝试以BLOB格式输出存储在表中的加密数据,但它无法正常工作。我使用预处理语句插入它,当我检查mysql命令行客户端时,它显示已记录条目,但blob字段为空,并且每个其他字段都有一些值。此外,blob
字段不能为空,因为我在创建表时已指定它,因此我认为命令行无法显示blob字段数据。
所以使用php,我试图返回base64_encode
字段的blob
值,但它没有帮助。它仍然是空的。我该怎么办?
P.S。:它不是图像,是AES-256的加密文本。
$stmt = $conn->prepare("INSERT INTO data_store (eid, ekey, ecipher) VALUES (?, ?, ?)");
if($stmt->bind_param("sbb", $eid, $ekey, $ecipher)) {
echo "Successful";
}
// set parameters and execute
$eid=$postedID;
$ekey=$postedKey;
$ecipher=$postedCipher;
$stmt->execute();
$stmt->close();
$conn->close();
之后我尝试返回编码它的BLOB值,但它什么都不返回,而字符串id的值确实显示出来。我该如何解决这个问题?我需要加密数据,然后为网站解密明文。
我如何实现这一目标? 非常感谢。
P.S。:我还没有尝试解密,我首先需要加密值,所以建议先解密它不会是一个非常有用的。
表格如下所示 -
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| eid | varchar(255) | NO | PRI | NULL | |
| ekey | blob | NO | | NULL | |
| ecipher | blob | NO | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
答案 0 :(得分:3)
当我将参数更改为string
" s"时问题得以解决,这似乎工作正常,因为我将数据保存到的变量是字符串,所以它适合。
所以更正的代码是:
$stmt = $conn->prepare("INSERT INTO data_store (eid, ekey, ecipher) VALUES (?, ?, ?)");
if($stmt->bind_param("sss", $eid, $ekey, $ecipher)) {
echo "Successful";
我并不是说这是一个完美的解决方案,但它现在似乎解决了我的问题,如果有人提出在php中使用blob
代替string
的方法,我将会非常有帮助。谢谢。
答案 1 :(得分:0)
指定b
告诉mysqli将数据以单独的数据包发送到服务器。
但是,文档未详细说明的是如何指定数据包数据。可以假设,与其他类型一样,您应该只设置包含数据的引用变量。事实证明你需要使用send_long_data
使用此功能,您实际上可以控制每个数据块,因此您需要确保不要发送太大的数据包以供服务器处理。
尝试这样的事情
$stmt = $conn->prepare("INSERT INTO data_store (eid, ekey, ecipher) VALUES (?, ?, ?)");
//Initialise variables
$eid = $postedID;
$ekey = NULL;
$ecipher = NULL;
if($stmt->bind_param("sbb", $eid, $ekey, $ecipher)) {
// Send blobs
$ekey_chunks = str_split($postedKey, 8192);
foreach ($ekey_chunks as $chunk) {
$stmt->send_long_data(1, $chunk);
}
$ecipher_chunks = str_split($postedCipher, 8192);
foreach ($ecipher_chunks as $chunk) {
$stmt->send_long_data(2, $chunk);
}
$stmt->execute();
$stmt->close();
}
$conn->close();