有史以来最奇怪的PHP错误

时间:2017-03-20 01:51:51

标签: php phpmyadmin

我有一个脚本,表单可以将字符串上传到我的数据库中。 在上传之前,我想要首字母大写。这个字符串可以包含像éáőú这样的外国字符。我默认使用uft8到处都是,我的脚本运行得很好,每次都没有例外。但是,当我打开phpmyadmin,即使我不做任何事情,不知何故改变我的简单脚本,转换为大写不再工作,

string 'aáeéoő' (length=9) 

成为这个:

string 'A�e�o�' (length=9)

如果我重新启动wamp,它只会再次起作用。

即时通讯使用ucwords,并在字符串上漫步,正如我所说它完美无缺。有可能当我打开phpmyadmin时,它改变了php的字符编码吗?

1 个答案:

答案 0 :(得分:0)

如果问题与数据库交互有关,请参阅下面的原始答案。

如果数据库连接不是导致问题的原因,那么可能phpmyadmin会在Web服务器环境中导致一些全局设置(例如某些共享库正在重新加载新设置或更改路径导致函数在不同的模块中被引用)...当执行phpmyadmin时,Web服务器环境中的某些东西会动态变化。这会对应用程序产生影响。

为了研究这个问题,我建议使用phpinfo来转储/显示/捕获PHP环境设置。暂时将其添加到应用程序中的脚本,然后保存该快照。

启动phpmyadmin,或导致问题的任何原因,...

然后再次在应用程序中运行脚本,并转储/显示/捕获PHP环境设置,并将其与第一个快照中的环境进行比较。

可能会有些不同之处,与角色转换有关,例如:导致iconv被用来代替mbstring,反之亦然,这与characteret转换有关。或者使用冲突/覆盖HTTP标头。

我在之前启动phpmyadmin之后调查HTTP标头以及整个页面源。

另一种可能性是它根本不是服务器,它与客户端网络浏览器的混乱。

我建议您在一个浏览器中运行您的应用,无论您使用哪种浏览器。

然后从完全不同的浏览器启动phpmyadmin。例如,如果您使用Firefox作为应用脚本,请使用Chrome for phpmyadmin。并查看问题是否出现在应用中。

这将有助于缩小服务器(apache)或浏览器的问题范围。

如果数据库导致问题......

原始回答

听起来像启动phpmyadmin导致执行SET GLOBAL character_set_clientSET GLOBAL character_set_session和/或SET GLOBAL character_set_results语句,更改了一些可以动态修改的系统变量。

下次应用程序连接到数据库时,新的MySQL会话将从全局设置继承系统变量的值。

重新启动mysqld可以解决问题,因为全局变量已恢复为原始设置或默认设置。这些值是应用程序所期望的。

更改全局设置后,应用程序不会期望MySQL连接/会话的这些新设置。

为了调查此问题,我会向应用添加一个查询以获取会话变量的设置,例如:

SHOW VARIABLES LIKE 'character%'

并转储/显示/捕获该返回。

使用phpmyadmin执行的操作导致应用程序出现问题,然后再次运行应用程序,并再次转储/显示/捕获SHOW VARIABLES LIKE 'character%'的返回值。

我怀疑当比较那些时,会有差异

如果有差异,那么

  • 找出导致phpmyadmin执行这些语句的原因,并对其进行更改以使其不再执行此操作。

这只是一个部分解决方案,因为该应用仍然容易受到发出SET GLOBAL system_variable语句的任何其他会话的攻击。为了隔离应用程序:

  • 修改应用以专门设置会话的系统变量,例如character_set_clientcharacter_set_connectioncharacter_set_results

这样做的旧学校模式是应用程序在建立连接后立即发出SET NAMES语句。

但请检查您正在使用的接口库,以查看推荐的模式。例如,对于mysqli_,建议使用SET NAMES,而是使用mysqli_set_charset http://php.net/manual/en/mysqli.set-charset.php

这只是猜测。根据所提供的信息,无法做出明确的诊断。

参考:https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html