【问题标题】:Retrieving image from MySQL db using php使用 php 从 MySQL 数据库中检索图像
【发布时间】:2014-04-12 06:12:57
【问题描述】:

大家好。

我已经搜索了几个小时,以了解 php 的行为方式,但我无济于事.. 任何帮助将不胜感激。

我正在创建一个简单的应用程序,客户将在平板电脑上签名,并且需要将签名与其他订单详细信息一起存储在数据库中作为交付证明。

图像字段数据类型为 BLOB。

虽然将图像存储在数据库中并不是最好的方法,但它是需求的一部分,因此无法绕过它。签名正确存储在数据库中,使用 MySQL 工作台查看器检索的数据实际上显示了 Base64 图像字符串,当它被复制并放置在 <img> 标记中时,它会正确显示。

当我尝试查询数据库以检索图像时,我收到“警告:为 foreach() 提供的参数无效”,这意味着我在 sql 语句中有错误。当我在 phpMyAdmin 或 MySQL Workbench 中使用相同的查询时,我会得到结果。

我使用的查询如下:

$order_details_stmt =   $db->query("SELECT *
                                FROM dms_dl_delivery_details
                                WHERE `way_bill_number` = '$waybill_no'");



            foreach($order_details_stmt as $row3){

                        $signature      =   $row3['reciepient_signature'];
                        $invoice_book   =   $row3['reciept_book'];
                        $invoice_no     =   $row3['reciept_no'];
                        $recieved_by    =   $row3['recieved_by'];
            }

为了回显我使用<img src="<?php echo $signature; ?>"> 的签名,但我什至没有到达那里。如果我这样做 var_dump($order_details_stmt); 我得到布尔值 false,但是,我从查询中获得的所有其他变量都可以正常工作:$invoice_book、$invoice_no 和 $recieved_by 在输出页面中正确回显。

建表语句如下:

CREATE TABLE `dms_dl_delivery_details` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `way_bill_number` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `sender_customer_id` varchar(16) COLLATE utf8_unicode_ci NOT NULL,
  `way_bill_date_time` datetime NOT NULL,
  `pick_up_address_id` varchar(13) COLLATE utf8_unicode_ci NOT NULL,
  `reciepient_signature` blob NOT NULL,
  `reciept_book` char(4) COLLATE utf8_unicode_ci NOT NULL,
  `reciept_no` char(4) COLLATE utf8_unicode_ci NOT NULL,
  `recieved_by` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `way_bill_number_UNIQUE` (`way_bill_number`)
  ) 
  ENGINE=InnoDB 
  DEFAULT CHARSET=utf8 
  COLLATE=utf8_unicode_ci;

我正在使用 PHP 5.4.12 和 MySQL 5.6.12

对我在这里做错了什么有什么想法吗?

谢谢!

【问题讨论】:

  • @showdev:是的。它是 PDO。查询本身返回 false,这很奇怪。我可以正确获取和显示的其他行。
  • PDO 是否配置为显示错误消息/抛出异常?
  • 对不起,我删除了我的评论。如果查询返回 false,您可能能够从 PDO 的errorInfo() 检索错误:print_r($db->errorInfo());
  • @showdev:我得到以下信息:当其他无缓冲查询处于活动状态时,无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。
  • @greg0ire:谢谢。你居然给我指出了某个地方!

标签: php mysql blob


【解决方案1】:

应该是这样的

$result = $db->query("SELECT *
                      FROM dms_dl_delivery_details
                      WHERE `way_bill_number` = '$waybill_no'");

$order_details_stmt = $result->fetchAll();

【讨论】:

  • 嗨。它什么也不返回。
  • $order_details_stmt 中是一个空数组或者您仍然收到错误?
  • 如果是空数组则需要检查$waybill_no的值
  • 嗨雅各布。谢谢你的帮助。 Strawberry 的代码有效。
【解决方案2】:

如果你使用 prepare-execute 方法会发生什么...

$stm = $dbh->prepare($sql);
$stm->execute();
$result = $stm->fetchAll();

foreach (

【讨论】:

  • 当我这样做时它返回“空”
  • 使用while($row = $stm->fetch())会更节省内存
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多