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


How to output blob data (not image) from mysql to php?

我正在尝试以 BLOB 格式输出存储在表中的加密数据,但它不起作用。我使用预准备语句插入了它,当我检查 mysql 命令行客户端时,它显示该条目已被记录,但 blob 字段为空,并且每个其他字段都有一些值。此外,blob字段不得为 null,因为我在创建表时已指定它,因此我认为命令行无法显示 blob 字段数据。

因此,使用 php,我尝试返回 blob 字段的base64_encode值,但没有帮助。它仍然是空的。我该怎么办?

PS:这不是图像,而是使用 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 值确实显示出来。我该如何解决这个问题?我需要加密数据,然后解密网站的明文。

我如何实现这一点?多谢。

PS:我还没有尝试解密,我首先需要加密值,所以建议先解密它不会很有帮助。

表格看起来像这样——

+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| eid         | varchar(255)        | NO   | PRI | NULL    |                |
| ekey        | blob                | NO   |     | NULL    |                |
| ecipher     | blob                | NO   |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

当我将参数更改为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 的方法,我将非常有帮助。谢谢。

指定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();

来源此博客