Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
PHP/MySQLi中BLOB数据写入数据库失败的解决方案_创想鸟

PHP/MySQLi中BLOB数据写入数据库失败的解决方案

PHP/MySQLi中BLOB数据写入数据库失败的解决方案

本文旨在解决PHP使用MySQLi将BLOB类型数据写入数据库时遇到的%ignore_a_1%,即图像或其他二进制数据无法成功存储。我们将探讨两种有效的解决方案:一是利用mysqli_stmt_send_long_data()方法处理大尺寸BLOB数据,二是调整bind_param中的数据类型标识符为字符串(’s’),并提供详细的代码示例和注意事项,帮助开发者正确地将二进制文件存储到MySQL数据库中。

问题背景与分析

在开发web应用时,我们经常需要将图像、文档等二进制文件直接存储到数据库中,通常使用blob(binary large object)数据类型。然而,在使用php的mysqli扩展进行操作时,有时会遇到一个棘手的问题:所有文本或数字类型的数据都能成功写入数据库,唯独blob字段的数据为空或写入失败,即使代码逻辑看起来正确,file_get_contents()函数也已成功读取了文件内容,且数据库字段类型(如mediumblob)足以容纳文件大小,并且没有任何错误或警告信息。

这种情况通常发生在尝试通过预处理语句(prepared statements)的bind_param方法将二进制数据绑定为参数时。问题的根源往往在于MySQL服务器的max_allowed_packet配置限制,或者PHP/MySQLi处理大尺寸二进制数据的方式。当二进制数据量超过max_allowed_packet时,bind_param可能无法一次性处理,导致数据写入失败。

解决方案一:使用 mysqli_stmt_send_long_data() 处理大尺寸BLOB

对于可能超出MySQL max_allowed_packet限制的大尺寸BLOB数据,mysqli_stmt_send_long_data()方法是官方推荐的解决方案。它允许分批发送二进制数据到数据库,从而规避了单次数据包大小的限制。

工作原理:在使用bind_param绑定参数时,对于BLOB类型数据,应将其类型标识符设置为’b’。此时,bind_param并不会直接将完整数据绑定到参数,而是通知MySQLi该参数将接收二进制大对象。随后,通过mysqli_stmt_send_long_data()方法,将实际的二进制数据以流的形式发送给数据库。在send_long_data调用之前,通常会将绑定的变量初始化为NULL。

示例代码:

prepare("REPLACE INTO `images` (id, file) VALUES(?, ?);");    if ($stmt === false) {        die('Prepare failed: ' . htmlspecialchars($conn->error));    }    // 绑定参数:'i' 表示整数,'b' 表示二进制大对象    $stmt->bind_param("ib", $id, $file_content);    // 使用 send_long_data 发送实际的二进制数据    // 第一个参数是参数的索引(从0开始),第二个参数是实际的二进制数据    // file_get_contents() 用于读取上传文件的临时内容    $stmt->send_long_data(1, file_get_contents($_FILES[$post_input_name]['tmp_name']));     // 执行语句    if ($stmt->execute()) {        echo "文件上传并写入数据库成功!";    } else {        echo "文件写入数据库失败: " . htmlspecialchars($stmt->error);    }    $stmt->close();}?>        

注意事项:

立即学习“PHP免费学习笔记(深入)”;

bind_param中的类型标识符’b’是关键,它告诉MySQLi该参数将通过send_long_data处理。send_long_data的第一个参数是参数的索引,从0开始计数。在上面的例子中,id是第一个参数(索引0),file是第二个参数(索引1)。在调用send_long_data之前,无需将完整的二进制数据赋值给bind_param中绑定的变量。

解决方案二:将 bind_param 类型指定为字符串 (‘s’)

在某些情况下,如果BLOB数据的大小并未超过max_allowed_packet限制,或者MySQL服务器和客户端的配置允许较大的数据包传输,将bind_param中的类型标识符从’b’改为’s’(字符串)也能奏效。这是因为PHP在内部处理字符串时,会尝试将二进制数据作为普通字符串发送。

工作原理:当使用’s’类型绑定二进制数据时,PHP会将file_get_contents()读取到的二进制字符串作为一个完整的字符串参数发送给MySQL。如果这个字符串的长度在max_allowed_packet允许的范围内,并且数据库字段是BLOB类型,MySQL通常能够正确地接收和存储它。

示例代码:

prepare("REPLACE INTO `images` (id, file) VALUES(?, ?);");    if ($stmt === false) {        die('Prepare failed: ' . htmlspecialchars($conn->error));    }    // 绑定参数:'i' 表示整数,'s' 表示字符串    $stmt->bind_param("is", $id, $file_content);    // 执行语句    if ($stmt->execute()) {        echo "文件上传并写入数据库成功!";    } else {        echo "文件写入数据库失败: " . htmlspecialchars($stmt->error);    }    $stmt->close();}?>        

注意事项:

立即学习“PHP免费学习笔记(深入)”;

这种方法对于较小的BLOB数据通常有效,但对于大尺寸文件,仍可能因max_allowed_packet限制而失败。如果遇到写入失败且没有明确错误的情况,建议优先考虑使用send_long_data方法。

重要注意事项

MySQL max_allowed_packet 配置: 这是最常见的导致BLOB写入失败的服务器端限制。它定义了MySQL服务器接收的最大数据包大小。如果你的BLOB数据大于此值,即使使用’s’绑定也可能失败。你可以通过修改my.cnf或my.ini配置文件来增加此值,例如:

[mysqld]max_allowed_packet = 64M ; 根据需要设置,例如64MB

修改后需要重启MySQL服务。

PHP 文件上传配置: 确保PHP的php.ini文件中upload_max_filesize和post_max_size设置足够大,以允许上传大文件。

upload_max_filesize = 64Mpost_max_size = 64M

修改后需要重启Web服务器(如Apache/Nginx)。

HTML 表单 enctype 属性: 确保文件上传表单的enctype属性设置为multipart/form-data,这是上传文件所必需的。

    

错误处理: 尽管原始问题中未出现错误,但在实际开发中,务必添加详细的错误检查。使用$conn->error和$stmt->error可以捕获数据库操作中的错误。

if ($stmt === false) {    die('Prepare failed: ' . htmlspecialchars($conn->error));}// ...if (!$stmt->execute()) {    echo "Error: " . htmlspecialchars($stmt->error);}

数据库字段类型选择: 根据文件大小选择合适的BLOB类型:TINYBLOB:最大 255 字节BLOB:最大 65,535 字节MEDIUMBLOB:最大 16,777,215 字节 (16MB)LONGBLOB:最大 4,294,967,295 字节 (4GB)确保所选类型能够容纳你计划存储的最大文件。

总结

当PHP/MySQLi在写入BLOB数据时遇到困难,尤其是在没有明显错误提示的情况下,通常需要考虑max_allowed_packet限制以及PHP处理二进制数据的方式。对于大尺寸BLOB数据,推荐使用mysqli_stmt_send_long_data()方法配合bind_param的’b’类型标识符,这是最健壮和可靠的解决方案。如果文件尺寸较小,或者在特定配置下,将bind_param类型指定为’s’(字符串)也可能有效。在实施任何解决方案之前,请务必检查并配置好MySQL服务器的max_allowed_packet和PHP的文件上传相关设置,并始终加入完善的错误处理机制。

以上就是PHP/MySQLi中BLOB数据写入数据库失败的解决方案的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1322568.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Laravel Eloquent:如何通过非ID字段检索数据
上一篇 2025年12月12日 08:42:39
利用PayPal Payouts自动化订阅佣金支付
下一篇 2025年12月12日 08:42:52

相关推荐

  • 豆包AI如何调用外部API 实现AI与第三方服务联动的方法

    本文旨在探讨豆包AI如何通过调用外部API,从而实现与第三方服务的智能联动。我们将详细介绍实现这一功能的核心原理以及具体的操作步骤。通过理解API调用的机制并在豆包AI中进行相应的配置,用户可以赋予豆包AI连接互联网世界、获取实时信息、执行特定任务的能力,极大地扩展了AI的应用场景和智能化水平。文章…

    2026年9月25日
    000
  • 这台五万元的相机,哈苏想卖给「普通人」

    这台五万元的相机,哈苏想卖给「普通人」这台五万元的相机,哈苏想卖给「普通人」这台五万元的相机,哈苏想卖给「普通人」这台五万元的相机,哈苏想卖给「普通人」

    拍照,可能是这个时代门槛最低的创作行为了。 我们每天都在生产和消费着海量的图片,记录变得前所未有地容易,但容易,就等于好吗? 过去,哈苏的答案是倾向于「好」,但代价是「难」——你需要理解光圈、快门,要背着沉重的三脚架,甚至要在特定的拍摄环境中,才能驾驭这份极致的画质。 在推出了备受瞩目的 X2D 1…

    2026年9月25日 • 用户投稿
    200
  • 豆包是否可以本地部署 自主可控环境下运行豆包的技术路径说明

    本文旨在解答关于豆包是否可以在本地环境下进行部署并实现自主可控运行的问题。目前,豆包主要以云服务形式提供,用户通过网络访问其功能。要在自主可控的环境下运行类似的大型语言模型能力,通常需要采用不同的技术路径,即在本地计算资源上部署可用的AI模型。本文将概述实现本地自主可控AI运行的通用技术路线和关键步…

    2026年9月25日
    300
  • Debian Hadoop数据安全性如何提升

    Debian Hadoop数据安全性如何提升Debian Hadoop数据安全性如何提升Debian Hadoop数据安全性如何提升Debian Hadoop数据安全性如何提升

    增强Debian Hadoop集群的数据安全性,需要多方面协同努力,涵盖系统维护、用户权限管理、数据加密、访问控制、日志审计和安全策略制定等关键环节。以下是一些具体的实施步骤: 一、系统安全维护 及时更新: 定期执行apt update和apt upgrade命令,确保系统补丁及时更新,抵御已知漏洞…

    2026年9月25日 • 用户投稿
    000
  • 荣耀 300 系列系统升级,后续多款新机待发

    荣耀 300 系列系统升级,后续多款新机待发荣耀 300 系列系统升级,后续多款新机待发荣耀 300 系列系统升级,后续多款新机待发荣耀 300 系列系统升级,后续多款新机待发

    日前,荣耀 300 系列手机迎来 magicos 9.0.0.187 版本升级,此次更新带来了清理建议、ai 通话等多项新功能,系统升级将以分批推送的形式逐步覆盖用户。 本次更新的主要亮点如下: 图库方面新增“清理建议”功能,可智能识别重复照片、相似图片及超大视频,帮助用户更高效地管理存储空间; 通…

    2026年9月25日 • 用户投稿
    500
  • PHP加密算法有哪些_PHP数据加密解密常用函数

    推荐使用password_hash()存储密码,openssl_encrypt()加密数据,RSA实现安全通信,根据场景选择合适加密方式保障信息安全。 在PHP开发中,数据加密和解密是保障信息安全的重要手段。根据使用场景的不同,可以选择不同的加密方式。常见的需求包括密码存储、敏感数据传输、配置文件加…

    2026年9月25日
    000
  • PHP文件引入时参数传递机制详解与最佳实践

    在php中,直接通过url查询字符串方式向`require`或`include`引入的文件传递参数是无效的,这会导致“未定义变量”错误。本文将深入探讨php文件引入的原理,并提供三种正确的参数传递方法:利用作用域共享、手动填充`$_get`数组,以及推荐的通过函数或类进行封装,旨在帮助开发者构建更健…

    2026年9月25日
    000
  • sublime怎么设置字体和字号 _sublime字体与字号调整方法

    sublime怎么设置字体和字号 _sublime字体与字号调整方法sublime怎么设置字体和字号 _sublime字体与字号调整方法sublime怎么设置字体和字号 _sublime字体与字号调整方法sublime怎么设置字体和字号 _sublime字体与字号调整方法

    先修改用户设置文件以调整字体和字号,打开Preferences → Settings,在右侧User配置中添加”font_face”和”font_size”选项,如{“font_face”: “Fira Code&#…

    2026年9月25日 • 用户投稿
    000
  • Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式

    Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式

    首先启用Safari开发菜单,然后通过菜单命令或快捷键Option+Command+U查看完整HTML源代码;也可右键选择检查元素,使用Web检查器查看特定区域的DOM结构与样式信息。 如果您在浏览网页时需要检查页面的结构或调试内容,查看网页源代码是一个常用的方法。Safari浏览器提供了多种方式来…

    2026年9月25日 • 用户投稿
    000
  • Java 8 使用 Stream API 扁平化嵌套 Map 并提取首个元素

    Java 8 使用 Stream API 扁平化嵌套 Map 并提取首个元素Java 8 使用 Stream API 扁平化嵌套 Map 并提取首个元素Java 8 使用 Stream API 扁平化嵌套 Map 并提取首个元素Java 8 使用 Stream API 扁平化嵌套 Map 并提取首个元素

    本文将详细介绍如何使用 Java 8 的 Stream API 将一个嵌套的 Map 结构进行扁平化处理,并从中提取所需的数据。 具体来说,我们将把 Map<Integer, Map<String, List>> 转换为 Map,其中新 Map 的键是原内部 Map 的键,值…

    2026年9月25日 • 用户投稿
    1200
  • MySQL与SQL Server功能对比:哪个更适合您的业务需求?

    MySQL与SQL Server功能对比:哪个更适合您的业务需求?MySQL与SQL Server功能对比:哪个更适合您的业务需求?MySQL与SQL Server功能对比:哪个更适合您的业务需求?MySQL与SQL Server功能对比:哪个更适合您的业务需求?

    MySQL与SQL Server功能对比:哪个更适合您的业务需求? 在当今数字化时代,数据库技术扮演着至关重要的角色,其中MySQL和SQL Server是两个备受关注的关系型数据库管理系统。无论是中小型企业还是大型企业,选择适合自身业务需求的数据库管理系统至关重要。本文将对MySQL和SQL Se…

    2026年9月25日 • 用户投稿
    200
  • 首个对话式音乐创作 Agent“Tunee”正式公测

    首个对话式音乐创作 Agent“Tunee”正式公测首个对话式音乐创作 Agent“Tunee”正式公测首个对话式音乐创作 Agent“Tunee”正式公测首个对话式音乐创作 Agent“Tunee”正式公测

    趣丸科技旗下天谱乐团队自主研发的国内首款对话式音乐创作agent“tunee”近日正式启动全球公测,全面向公众开放使用。 据悉,用户只需通过自然语言描述自己的音乐设想,即便表达模糊,Tunee也能自动完成需求解析、方案设计到实际作曲的完整流程,最终输出契合用户意图的原创音乐作品。 Tunee采用先进…

    2026年9月25日 • 用户投稿
    500
  • Debian syslog如何定制报警机制

    Debian syslog如何定制报警机制Debian syslog如何定制报警机制Debian syslog如何定制报警机制Debian syslog如何定制报警机制

    本文介绍如何在Debian系统中定制syslog报警机制,利用rsyslog实现更灵活的日志监控和告警。 首先,确保已安装rsyslog: sudo apt-get updatesudo apt-get install rsyslog 接下来,修改rsyslog配置文件,/etc/rsyslog.c…

    2026年9月25日 • 用户投稿
    100
  • 对话逐际动力张巍:造机器人很容易,关键是用起来

    对话逐际动力张巍:造机器人很容易,关键是用起来对话逐际动力张巍:造机器人很容易,关键是用起来对话逐际动力张巍:造机器人很容易,关键是用起来对话逐际动力张巍:造机器人很容易,关键是用起来

    “让天下没有难落地的机器人。” 在这样向量子位表达定位和使命后,逐际动力”解释了”为何会成为阿里投资的第一家具身智能机器人公司。 在这样解释定位和使命后,量子位大概感受到了逐际动力被投资的原因—— 至少是成为阿里第一个具身智能投资项目的原因。 实际上,…

    2026年9月25日 • 用户投稿
    500
  • Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程

    Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程

    可通过设置阻止Chrome自动加载媒体。①针对特定网站:点击地址栏锁形图标→网站设置→将“自动播放”设为不允许;②全局禁用:进入chrome://settings/content→自动播放→设为默认不允许;③使用扩展如uBlock Origin拦截媒体加载;④启用Lite模式以节省数据并延迟媒体加载…

    2026年9月25日 • 用户投稿
    300
  • 修改 Android KeyStore 中 KeyPair 的用途

    修改 Android KeyStore 中 KeyPair 的用途修改 Android KeyStore 中 KeyPair 的用途修改 Android KeyStore 中 KeyPair 的用途修改 Android KeyStore 中 KeyPair 的用途

    本文档介绍了如何在 Android KeyStore 中修改现有 KeyPair 的用途,使其支持密钥协商 (Key Agreement) 操作。通过示例代码展示了如何利用 KeyStore.setEntry 方法在 Android 13 (API 33) 及以上版本中导入 KeyPair 并设置所…

    2026年9月25日 • 用户投稿
    600
  • 专业横评便携微单:佳能R50V凭6K超采样+精准快速追焦 成 8000 元内全能首选

    专业横评便携微单:佳能R50V凭6K超采样+精准快速追焦  成 8000 元内全能首选专业横评便携微单:佳能R50V凭6K超采样+精准快速追焦  成 8000 元内全能首选专业横评便携微单:佳能R50V凭6K超采样+精准快速追焦  成 8000 元内全能首选专业横评便携微单:佳能R50V凭6K超采样+精准快速追焦  成 8000 元内全能首选

    随着旅行摄影与短视频创作的需求激增,便携微单已成为多数用户的核心影像工具。面对 8000元以下微单市场的繁杂选择,专业影像评测团队通过150小时实测(涵盖画质解析力、防抖稳定性、低光对焦等 15 项核心指标),结合近万份用户口碑反馈,筛选出 3 款高潜力机型。其中佳能 R50V 凭借“画质无短板、便…

    2026年9月25日 • 用户投稿
    200
  • sublime怎么查看和安装主题_Sublime主题安装与切换美化教程

    sublime怎么查看和安装主题_Sublime主题安装与切换美化教程sublime怎么查看和安装主题_Sublime主题安装与切换美化教程sublime怎么查看和安装主题_Sublime主题安装与切换美化教程sublime怎么查看和安装主题_Sublime主题安装与切换美化教程

    在Sublime Text中更换和安装主题能显著提升编码体验,让界面更美观、更符合个人习惯。下面详细介绍如何查看、安装以及切换主题。 查看当前使用的主题 要确认当前Sublime Text正在使用哪个主题,可以打开命令面板: 按下 Ctrl+Shift+P(Windows/Linux)或 Cmd+S…

    2026年9月25日 • 用户投稿
    600
  • AI Overviews是否具备个性化推荐机制 个性推荐背后的逻辑与调整方法

    AI Overviews是否具备个性化推荐机制 个性推荐背后的逻辑与调整方法AI Overviews是否具备个性化推荐机制 个性推荐背后的逻辑与调整方法AI Overviews是否具备个性化推荐机制 个性推荐背后的逻辑与调整方法AI Overviews是否具备个性化推荐机制 个性推荐背后的逻辑与调整方法

    AI Overviews在提供信息摘要时,确实融入了个性化推荐机制。本文将深入探讨这一机制的原理、其背后的逻辑以及用户可能影响或理解其个性化倾向的一些方法。我们将分步骤解析这一过程,帮助用户更好地理解和利用AI Overviews的功能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无…

    2026年9月25日 • 用户投稿
    000
  • 并发处理共享列表并收集结果的方案

    并发处理共享列表并收集结果的方案并发处理共享列表并收集结果的方案并发处理共享列表并收集结果的方案并发处理共享列表并收集结果的方案

    本文旨在介绍如何利用 Java 并行流高效地处理大型列表,尤其是在每个元素的处理过程耗时较长的情况下。并行流能够将列表分割成多个子任务,并在多个线程上并发执行,从而显著提升处理速度。但同时,并发编程也带来了共享资源同步的问题,需要谨慎处理。 使用并行流并发处理列表 假设我们有一个 Foo 类,其 p…

    2026年9月25日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信