从 phpmyadmin(好)和 PHP 脚本(坏)执行 sql 查询的不同结果
Posted
技术标签:
【中文标题】从 phpmyadmin(好)和 PHP 脚本(坏)执行 sql 查询的不同结果【英文标题】:different result executing an sql query from phpmyadmin(good) and from PHP script(bad) 【发布时间】:2015-12-04 18:50:33 【问题描述】:我有一个非常奇怪的问题,在 mysql 数据库上执行查询:
来自 phpmyadmin:查询执行并返回良好结果
来自我的 PHP 脚本:查询执行,没有错误,行数不错,但表中显示的值有近 50% 错误!
使用的SQL查询完全一样,比较长(250行),在phpmyadmin中执行需要26秒,效果很好。
在我的 PHP 脚本中,查询是使用 mysqli_query()
执行的,这是我想说的典型方式:
if ($res=mysqli_query($mysqli,$q, MYSQLI_USE_RESULT))
$data = array();
while ($row=mysqli_fetch_assoc($res))
$data[] = $row;
mysqli_free_result($res);
var_dump($data);
在查询中,我将 backtite:(`) 替换为单引号:(')。
知道为什么它与 phpmyadmin 一起工作,而不是与 mysqli_query()
函数的 PHP 一起工作吗?顺便说一句 phpmyadmin 不使用mysqli_query()
函数?
没有抛出错误,我真的迷路了,如果有人有提示,将不胜感激:)
谢谢:)
【问题讨论】:
请提供查询本身。 working demo 会更有帮助。你为什么用引号代替反引号?phpMyAdmin
有一个功能,您可以单击标记为 create PHP Code 的链接,它将根据您成功的语句创建 PHP 代码,然后您可以像往常一样替换值。您是否尝试过使用它来最大程度地减少拼写错误?
@showdev 对不起,我无法提供查询本身,它太长了。我试图删除 backtites,以防它被 php 误解。我必须从 PHP 查询中删除任何字符吗?
mysql 中是否有查询缓存或表缓存或类似的东西,phpmyadmin 在执行查询之前取消激活?一个子查询从 mysqli 返回错误的行数,与 tto phpmyadmin 相比,返回的结果中有 25% 的行行缺失。
【参考方案1】:
最可能的答案是查询之间有所不同。因为您无法轻易追踪 250 行中的差异。使用 MySQL 查询日志记录 MySQL 看到的两个查询,然后比较差异:
要禁用或启用通用查询日志或在运行时更改日志文件名,请使用全局 general_log 和 general_log_file 系统变量。将 general_log 设置为 0(或 OFF)以禁用日志或设置为 1(或 ON)以启用它。设置 general_log_file 以指定日志文件的名称。如果日志文件已打开,则将其关闭并打开新文件。
类似的东西:
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file= 'querylog.log';
.. run queries
SET GLOBAL general_log = 'OFF';
请注意,这是一个全局设置,启用日志时,服务器将记录来自所有客户端的查询。您的 MySQL 还需要超级权限才能更改此设置。或者,您可以更改 my.cnf 配置文件并重新启动 MySQL。
一旦您有了这两个查询,比较应该会告诉您差异在哪里,并指导您进行修复。
【讨论】:
谢谢你的回答,我会试试这个。我必须在本地 MAMP 服务器上运行,因为现在我使用 1and1 的共享主机并且我不确定日志功能是否可用。实际上我从文本编辑器复制了我的查询并将其粘贴到我的 PHP 文件和 phpmyadmin 中,复制的不可见字符是否可能被 php 误解? 这应该在 MAMP 主机上工作,日志记录是 MySQL 的一项功能。 PHP 可能会误解文本中的“特殊”字符。您可以尝试 `$res=mysqli_query($mysqli,mysql_real_escape_string($mysqli,$q), MYSQLI_USE_RESULT) 这将解决一些潜在的问题。【参考方案2】:是的,在几次头痛之后,我偶然解开了这个谜团,虽然我真的不知道为什么,但现在它工作得很好。
以下是我为使其正常工作所做的一些小改动:
-
将 PHP 文件编码从 UTF8 更改为 ISO-Latin1
重新输入所有非字母字符以确保它们正常
在我的 SQL 查询中,我在 where 子句中检查了一个字符串,所以我尝试了这个..
问题是我在同一台服务器上有许多 PHP 文件,以 UTF8 编码,并且文本带有完美的重音符号。
这里唯一的区别是重音在我的 SQL 查询中,可能是托管我网站的服务器没有正确处理 UTF8 字符并且系统编码配置不正确..
为了确定,我有一个终端访问服务器,我怎么能看到系统编码?
但是问题解决了,一切都好!
【讨论】:
以上是关于从 phpmyadmin(好)和 PHP 脚本(坏)执行 sql 查询的不同结果的主要内容,如果未能解决你的问题,请参考以下文章
Mysql从php脚本插入空白字段,但不在phpmyadmin中?
php 脚本在 Ubuntu 14.04 服务器上运行,phpmyadmin 没有
sh Bash脚本安装Apache,MySQL和PHP以及PHPMyAdmin和一些调整。对于Debian和Ubuntu。要运行,请将脚本复制到se