【问题标题】:Remote image file to sqlite blob in PHP?远程图像文件到 PHP 中的 sqlite blob?
【发布时间】:2011-03-25 00:36:29
【问题描述】:

我有一个存储在远程服务器上的图像文件。我只有对服务器的 HTTP 访问权限,所以我使用 file_get_contents(URL) 获取其内容

我需要将此内容存储在本地 sqlite3 数据库中的“blob”类型字段中。我正在使用 PDO 对象连接到数据库,并且我正在使用

$db->exec("INSERT INTO myTable (myImageBlob) VALUES
           ('".file_get_contents($filePath)."')") 

将数据添加到数据库中。

这行不通。抱歉,如果我犯了一个非常愚蠢的错误。我们都必须以某种方式学习......

由于我不会深入研究的原因,我不可能将图像存储在本地并将 URL 放入数据库中。它/必须/存储在一个 blob 中。

【问题讨论】:

  • 在使用 sqlite 时始终使用参数化查询,三个优点。 1.更快(数据库所需的sql语句解析更少)。 2.没有sql注入。 3.当你的字符串包含'或''时没有问题。

标签: image sqlite blob


【解决方案1】:

不要这样做。每次将二进制数据插入数据库时​​,上帝都会杀死一只小猫。
相反,将该图像存储在文件系统中的某个位置并将 path 保存在您的数据库中。

记得想想小猫!

【讨论】:

  • 我知道它是 file_get_contents(),我是在 iPhone 上从内存中输入的,结果打错了。
  • 在数据库中存储二进制数据有利有弊,有些数据库比其他数据库做得更好。
  • @TTT SQLite 不是其中之一。 “为了在大型表中实现最佳操作,SQLITE 作者建议将行大小保持在 250 字节左右或以下。”
  • @TTT effbot.org/zone/sqlite-blob.htm 我找不到任何官方信息
  • 很多人虔诚地拥护“数据库中没有二进制数据”规则,但这取决于具体情况。它购买了 ACID 合规性,一些二进制 blob 尺寸很小(例如头像/缩略图),将所有内容保存在一个地方。这样做,但只有在您确信您的备份策略已被设计用于处理它时才这样做。这样做的主要问题是数据库有时会非常迅速地增长。权衡原子性 (ACID) 与文件传输/备份的便利性。
【解决方案2】:

在 SQL 语句中连接您无法控制的数据是一个非常糟糕的主意。例如,图像数据可能包含将终止字符串的引号或将被解释为控制字符的反斜杠。最糟糕的是,有人会构建一个伪造的图像来在您的应用程序中注入恶意 SQL 代码。

我建议你改用准备好的语句:

$query = $db->prepare("INSERT INTO myTable (myImageBlob) VALUES (?)");
$query->bindParam(1, fopen($filePath, "rb"), PDO::PARAM_LOB);
$query->execute();

请注意,通过将 PDO::PARAM_LOB 传递给 bindParam(),您可以从流中插入 blob 的数据。这就是为什么我使用 fopen() 而不是 file_get_contents()

【讨论】:

  • 我同意!!它也更快,因为需要更少的不同 sql 语句的解析。它可以快三倍。见stackoverflow.com/questions/904796/…
  • 谢谢!图像在远程服务器上,我只有 http 读取权限,fopen 还能工作吗?我现在无法测试。
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 2014-11-12
  • 2010-11-03
  • 2018-10-29
  • 2017-08-16
  • 2011-08-31
相关资源
最近更新 更多