从phpmyadmin(好)和从PHP脚本(坏)执行sql查询的结果不同


different result executing an sql query from phpmyadmin(good) and from PHP script(bad)

我有一个非常奇怪的问题,在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()函数吗?

没有任何错误,我真的迷失在这里,如果有人有提示,我将不胜感激:)

Thx:)

最有可能的答案是查询之间存在差异。因为你无法轻易地在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。

一旦您有了这两个查询,比较应该会显示差异所在,并引导您找到解决方案。

YAY在经历了几次头痛之后,我偶然解开了这个谜团,但我真的不知道为什么,但现在它工作得很好。

以下是我为使其发挥作用所做的一些小更改:

  1. 将PHP文件编码从UTF8更改为ISO-Latin1
  2. 重新键入所有非alphha字符以确保它们正常

在我的SQL查询中,我在where子句中签入的字符串上有重音,所以我尝试了这个。。

问题是,我在同一台服务器上有许多PHP文件,用UTF8编码,文本带有重音符号,效果非常好。

这里唯一的区别是,重音在我的SQL查询中,可能托管我网站的服务器没有正确处理UTF8字符,并且系统编码配置不好。。

可以肯定的是,我有一个终端访问服务器,我如何才能看到系统编码?

但问题解决了,一切都好!