如何从mysql输出blob数据(不是图像)到php?

时间:2016-03-21 19:25:46

标签: php mysql encryption blob

我正在尝试以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    |                |
+-------------+---------------------+------+-----+---------+----------------+

2 个答案:

答案 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将数据以单独的数据包发送到服务器。

Documentation here

但是,文档未详细说明的是如何指定数据包数据。可以假设,与其他类型一样,您应该只设置包含数据的引用变量。事实证明你需要使用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();

来源this blog