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查询结果写入JSON文件失败的字符集问题_创想鸟

解决PHP中MySQLi查询结果写入JSON文件失败的字符集问题

解决PHP中MySQLi查询结果写入JSON文件失败的字符集问题

本文探讨PHP中将MySQLi查询结果导出为JSON文件时遇到的常见问题,特别是fwrite无法写入或写入空文件的情况。核心解决方案在于通过$mysqli->set_charset(“utf8”);正确设置数据库连接的字符集,以确保数据编码兼容json_encode,从而实现数据顺利导出。

概述

在web开发中,将数据库查询结果导出为json格式是一种常见需求,常用于api接口响应、数据缓存或文件导出。php结合mysqli扩展提供了强大的功能来实现这一目标。然而,开发者有时会遇到一个看似矛盾的问题:从数据库中获取的数据在php脚本中通过print_r等方式查看是正常的,但当尝试使用json_encode将其转换为json字符串并写入文件时,文件却为空、内容不完整或根本没有变化。这通常与字符编码问题有关。

问题描述与根源分析

设想以下场景:你正在尝试从MySQL数据库中查询数据,并将所有行转换为JSON格式,最终写入一个.json文件。你的代码可能如下所示:

connect_error) {//     die("连接失败: " . $mysqli->connect_error);// }$sth = mysqli_query($mysqli, "SELECT * FROM table");$rows = array();while($r = mysqli_fetch_assoc($sth)) {    $rows[] = $r;}// 打印 $rows 数组,显示数据是正确的print_r($rows);// 尝试将数据编码为JSON并写入文件$fileobj = fopen("takeOutItems.json", 'w');fwrite($fileobj, json_encode($rows));fclose($fileobj);$mysqli->close();?>

在执行上述代码后,你可能会发现print_r($rows)能够正确地显示所有从数据库中取出的数据。然而,takeOutItems.json文件却没有任何内容更新,或者即使文件存在,其内容也是空的[]或包含非预期的乱码。

这个问题的核心根源在于字符编码不匹配。json_encode()函数在处理非UTF-8编码的数据时,如果遇到无效的UTF-8序列,它将无法正确编码,甚至会返回null或空字符串。当MySQL数据库中的数据(尤其是包含中文、特殊符号或其他非ASCII字符时)以某种编码存储,而PHP脚本与MySQLi连接时使用的字符集与数据实际编码不一致,或者与json_encode期望的UTF-8编码不一致时,就会出现这种问题。

解决方案:设置数据库连接字符集

解决此问题的关键在于确保PHP脚本与MySQL数据库之间的通信使用统一且兼容json_encode的字符集,即UTF-8。在执行任何查询之前,通过$mysqli->set_charset(“utf8”);方法明确设置数据库连接的字符集,可以有效解决这个问题。

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

$mysqli->set_charset(“utf8”); 的作用是告诉MySQLi驱动,后续与数据库的交互都将使用UTF-8编码进行。这样,从数据库中读取的数据将被正确地解码为UTF-8,json_encode就能顺利地处理这些数据。

修正后的代码示例

connect_error) {//     die("连接失败: " . $mysqli->connect_error);// }// 关键步骤:设置数据库连接的字符集为UTF-8$mysqli->set_charset("utf8");$sth = mysqli_query($mysqli, "SELECT * FROM table");$rows = array();while($r = mysqli_fetch_assoc($sth)) {    $rows[] = $r;}// 打印 $rows 数组,验证数据是否正确(此时应已是UTF-8编码)print_r($rows);// 将数据编码为JSON并写入文件$json_output = json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); // 添加选项使中文不转码,并美化输出if ($json_output === false) {    echo "JSON编码失败: " . json_last_error_msg();} else {    $fileobj = fopen("takeOutItems.json", 'w');    if ($fileobj) {        fwrite($fileobj, $json_output);        fclose($fileobj);        echo "数据已成功写入 takeOutItems.jsonn";    } else {        echo "无法打开文件 takeOutItems.json 进行写入,请检查文件权限。n";    }}$mysqli->close();?>

代码解释:

$mysqli->set_charset(“utf8”);: 这是解决问题的核心。它确保了从数据库获取的数据以UTF-8编码传输到PHP,为json_encode提供了有效输入。json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);:JSON_UNESCAPED_UNICODE:这个选项非常有用,它会阻止json_encode将多字节Unicode字符(如中文)转义为uXXXX形式,使JSON文件更具可读性。JSON_PRETTY_PRINT:这个选项会格式化输出的JSON字符串,使其带有缩进和换行,便于人工阅读。错误检查: 在写入文件之前,增加了对json_encode返回值的检查。如果json_encode返回false,意味着编码失败,json_last_error_msg()可以提供具体的错误信息,这对于调试非常关键。同时,也增加了文件打开失败的检查。

注意事项与最佳实践

数据库和表字符集: 确保你的MySQL数据库、表以及字段本身的字符集也设置为UTF-8(例如utf8mb4是更好的选择,因为它支持更广泛的Unicode字符,包括Emoji)。虽然set_charset(“utf8”)可以处理连接层面的编码转换,但如果底层数据存储编码不一致,仍可能出现问题。创建数据库时:CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;创建表时:CREATE TABLE mytable (id INT, name VARCHAR(255)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;json_last_error() 和 json_last_error_msg(): 在使用json_encode()之后,始终检查其返回值。如果返回false或null,使用这两个函数可以获取详细的错误信息,帮助定位问题。文件写入权限: 确保PHP脚本对目标文件takeOutItems.json所在的目录具有写入权限。如果文件不存在,fopen(‘…’, ‘w’)会尝试创建它,这同样需要目录写入权限。file_put_contents() 简化写入: 对于简单的文件写入操作,file_put_contents()函数可以替代fopen()、fwrite()和fclose()的组合,使代码更简洁:

// ...$json_output = json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);if ($json_output !== false) {    if (file_put_contents("takeOutItems.json", $json_output) !== false) {        echo "数据已成功写入 takeOutItems.jsonn";    } else {        echo "无法写入文件 takeOutItems.json,请检查文件权限。n";    }} else {    echo "JSON编码失败: " . json_last_error_msg();}// ...

大型数据集处理: 对于非常大的数据集,一次性将所有数据加载到内存并编码为JSON可能会消耗大量内存。在这种情况下,可以考虑分批处理数据,或者使用流式JSON库,将数据逐行写入文件,而不是一次性写入整个JSON字符串。

总结

当PHP中mysqli查询结果无法正确写入JSON文件时,最常见且隐蔽的原因是字符编码不匹配。通过在数据库连接建立后立即调用$mysqli->set_charset(“utf8”);,可以有效地解决这个问题,确保数据在PHP和MySQL之间以UTF-8编码正确传输,从而使json_encode能够顺利工作。结合适当的错误处理和文件写入权限检查,可以构建健壮的数据导出功能。

以上就是解决PHP中MySQLi查询结果写入JSON文件失败的字符集问题的详细内容,更多请关注php中文网其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
php推送怎么去做_php实现消息推送的几种方案
上一篇 2025年12月12日 08:53:45
WooCommerce结账页多国家增值税信息动态显示教程
下一篇 2025年12月12日 08:53:57

相关推荐

  • PHP each() 函数的替代方案:自定义实现与常见错误修正

    本文探讨了PHP中已废弃的each()函数的替代方案。针对常见的自定义实现,如myEach(),文章详细指出了其在返回数组结构中常犯的错误,并提供了正确的代码示例,以确保替代函数能够模拟each()的预期行为,帮助开发者编写更健壮、兼容未来的PHP代码。 理解 each() 函数及其废弃背景 在PH…

    2026年9月22日
    000
  • 玩转 Spring Boot 集成篇(定时任务框架Quartz)

    玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)

    在日常项目研发中,定时任务可谓是必不可少的一环,关于 spring boot 如何实现静态定时任务、动态定时任务以及如何开启多线程跑任务,均已在上篇分享过,不再赘述。 虽然 Spring Boot 内置注解方式实现的定时任务,在一定程度上也能解决一定的业务场景问题,但是若做更复杂的动作,例如启停任务…

    2026年9月22日 • 用户投稿
    100
  • 如何用Sublime导出MySQL数据表结构_生成Markdown或HTML格式文档

    要使用 sublime text 导出 mysql 数据表结构并生成 markdown 或 html 文档,需通过以下步骤操作:1. 使用 show create table 命令或 mysqldump 工具获取建表语句;2. 在 sublime 中整理字段信息,按字段名、类型、是否为空、键、默认值…

    2026年9月22日
    000
  • 解决PHP应用中本地文件更新后网页视图不刷新的缓存问题

    本文探讨了PHP应用中,本地JSON或图片文件更新后,网页视图无法实时刷新的常见问题。核心原因在于浏览器缓存机制。文章将提供多种解决方案,包括强制刷新、隐身模式诊断、以及通过URL参数、服务器配置(.htaccess)和文件版本控制来有效管理缓存,确保用户始终获取最新数据。 理解问题:本地文件更新与…

    2026年9月22日
    200
  • windows10如何开启剪贴板历史记录功能_windows10剪贴板历史记录设置方法

    首先启用剪贴板历史功能,通过Win+I进入系统设置,选择“系统”-“剪贴板”,开启“剪贴板历史记录”;或直接按Win+V,根据提示点击“开启”激活功能;若因组策略被禁用,可使用gpedit.msc或注册表修改EnableCdp值为1以启用。 如果您在使用Windows 10时发现复制的新内容会覆盖之…

    2026年9月22日
    100
  • 使用Java Selenium验证表格数据排序:金额列的升序与降序检查

    本教程详细介绍了如何利用Java Selenium WebDriver验证网页表格中金额列的排序功能。文章涵盖了从环境配置、登录应用到数据提取、清洗、数值转换,再到实现表格数据(特别是金额数据)的升序或降序验证的完整流程。通过示例代码,演示了如何获取页面元素、处理文本数据,并使用JUnit进行断言,…

    2026年9月22日
    100
  • MySQL备份数据恢复演练_MySQL数据恢复流程与实战

    MySQL备份数据恢复演练_MySQL数据恢复流程与实战MySQL备份数据恢复演练_MySQL数据恢复流程与实战MySQL备份数据恢复演练_MySQL数据恢复流程与实战MySQL备份数据恢复演练_MySQL数据恢复流程与实战

    mysql备份数据恢复演练是为了验证备份有效性并提升dba恢复能力的必要措施。其核心流程包括:1.准备与生产环境相似的演练环境并明确恢复目标;2.检查备份策略并准备所需全量与增量备份文件;3.模拟数据丢失场景并记录故障时间;4.停止mysql服务、清理数据目录后从全量备份恢复;5.依次应用增量备份并…

    2026年9月22日 • 用户投稿
    100
  • Laravel 8 登录后重定向到仪表盘:完整教程

    本教程详细阐述了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种方法。我们将探讨 Laravel 默认的重定向机制、如何正确配置仪表盘路由及其中间件,并提供通过自定义 LoginController 实现精确重定向的示例代码。通过本文,您将全面掌握 Laravel 认证后的重定向流程,并…

    2026年9月22日
    500
  • MySQL自动化备份如何实现_适合企业级部署吗?

    MySQL自动化备份如何实现_适合企业级部署吗?MySQL自动化备份如何实现_适合企业级部署吗?MySQL自动化备份如何实现_适合企业级部署吗?MySQL自动化备份如何实现_适合企业级部署吗?

    mysql的自动化备份对企业级部署是必要的,且可通过多种方式实现。1. 使用mysqldump+定时任务(crontab)是最基础的方式,操作简单适合中小规模数据库,但备份时可能锁表影响业务;2. 增量备份结合二进制日志(binary log)更高效,适用于频繁变更的数据,支持精确恢复到某时间点;3…

    2026年9月21日 • 用户投稿
    100
  • 360浏览器医生在哪里打开_360浏览器医生功能启动入口介绍

    360浏览器异常时可通过四种方式启动“浏览器医生”:1.点击右下角医疗箱图标;2.按下F1键;3.从菜单栏“帮助”中进入;4.在设置的扩展功能里查找,随后选择修复模式并重启浏览器。 如果您发现360浏览器运行异常,例如网页加载缓慢、频繁弹窗或无法正常打开页面,可以借助“浏览器医生”功能进行检测与修复…

    2026年9月21日
    100
  • Online Config VS Code

    Online Config VS CodeOnline Config VS CodeOnline Config VS CodeOnline Config VS Code

    run vs view Install Code Server Update Code Server Database:It is recommended to create a Docker container for the database. Code Language: JavaScript…

    2026年9月21日 • 用户投稿
    100
  • Java Collections.sort与Collections.reverse的使用区别

    Collections.sort用于排序,基于元素值比较,结果有序,默认升序,可自定义规则;2. Collections.reverse仅反转列表顺序,不比较元素,时间复杂度O(n);3. 两者功能不同,不可替代,按需选择使用。 Java 中 Collections.sort 和 Collectio…

    2026年9月21日
    200
  • 一键PHP环境怎么解决网页空白问题_空白页故障诊断

    答案是开启错误提示并检查文件路径与代码逻辑。先启用PHP错误显示,确认配置正确;再核对网站根目录和入口文件是否存在;接着排查代码致命错误及输出缓冲问题,确保无BOM头且session前无输出。 遇到一键PHP环境安装后出现网页空白或空白页问题,通常不是环境完全失效,而是某些关键环节出了错。这类问题在…

    2026年9月21日
    100
  • Bun 1.3 正式发布

    2025年10月10日,高性能 javascript 运行时 bun 发布了 1.3 版本。这是 bun 项目迄今为止最重大的版本更新,标志着 bun 从单纯的运行时工具演变为一个功能完备的全栈 javascript 开发平台。 从运行时到全栈平台的跨越 Bun 1.3 的核心突破在于将前端开发能力…

    2026年9月21日
    100
  • MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构

    MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构

    要快速补全mysql字段注释,可通过sublime text编写python脚本实现自动化;1. 脚本获取表名,可手动输入或从当前sql文件解析;2. 通过subprocess调用mysql命令行获取show full columns信息;3. 解析输出内容,提取字段名和现有注释;4. 生成alte…

    2026年9月21日 • 用户投稿
    200
  • win11玩游戏时输入法候选框总是在屏幕中间怎么办_win11游戏输入法候选框位置修复方法

    首先关闭全屏应用时的输入法显示,进入设置→时间和语言→输入→高级键盘设置,开启“使用桌面语言栏”并勾选“在使用全屏应用时自动隐藏语言栏”;其次启用兼容性模式,在输入法设置中打开“使用以前版本的微软拼音输入法”;若问题仍存在,可手动拖动候选框至边缘位置;最后可通过注册表编辑器,在HKEY_CURREN…

    2026年9月21日
    100
  • PHP三元运算符HTML输出_PHP三元运算符HTML内容输出

    PHP三元运算符用于在HTML中简洁输出条件内容,基本语法为“条件 ? 值1 : 值2”;2. 常用于动态显示文本、属性或样式,如根据$active输出“启用”或“禁用”;3. 可嵌入HTML标签设置class、disabled等属性,示例中根据登录状态显示不同按钮。 PHP三元运算符用于在HTML…

    2026年9月21日
    200
  • Hibernate Search嵌入式对象索引策略与常见问题解决

    本文探讨了在使用Hibernate Search对关联或嵌入式对象进行索引时遇到的常见问题,特别是@IndexedEmbedded与includePaths属性的结合使用。通过分析HSEARCH000216错误,揭示了嵌入式对象属性需要显式@Field注解才能被主实体索引的机制,并提供了具体的代码示…

    2026年9月21日
    200
  • 在Java中如何实现对象的唯一标识

    答案:Java中实现对象唯一标识主要有四种方式:1. 使用UUID生成全局唯一ID,适用于无数据库或分布式场景;2. 利用数据库自增主键,通过JPA的@Id和@GeneratedValue实现持久化唯一性;3. 重写equals与hashCode方法,基于不可变业务字段保证逻辑唯一;4. 采用Sno…

    2026年9月21日
    100
  • 巧文书AI官网首页官方入口 巧文书AI在线文档编辑官网链接直达

    巧文书AI官网首页官方入口是https://qiaowenshu.cn,该平台提供AI驱动的文档生成、智能解析、语义扩展、在线编辑与保存等功能,支持多场景文案创作和跨设备同步,具备一键润色、风格推荐及模板管理等智能化写作辅助体验。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信