从 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中?

PHPMyAdmin 单点登录身份验证无限重定向循环

无法从 JSON 接收数据 - PHPMyAdmin

php 脚本在 Ubuntu 14.04 服务器上运行,phpmyadmin 没有

sh Bash脚本安装Apache,MySQL和PHP以及PHPMyAdmin和一些调整。对于Debian和Ubuntu。要运行,请将脚本复制到se

数据库选择失败。 phpmyAdmin上的未知数据库错误[关闭]