MultyQuery 在 phpmyadmin 中工作,在 Mysqli 中不工作,在其他服务器上工作

Posted

技术标签:

【中文标题】MultyQuery 在 phpmyadmin 中工作,在 Mysqli 中不工作,在其他服务器上工作【英文标题】:MultyQuery is working in phpmyadmin, is not working in Mysqli, did work on an other server 【发布时间】:2012-04-20 16:19:17 【问题描述】:

我正在使用 Msqli 进行多重查询,该查询的工作方式与我在 phpmyadmin 中想要的完全一样。

它不再适用于 mysqli。查询在服务器之间没有改变。

下面的查询在以前的 LAMP 安装中有效,但在当前无效。

$SQLquery ='set @type = \'\';
set @num  = 1;
SELECT 
RA.`DATE` as DATES, 
RA.`ADDR` as ADDR,
RA.`QID` as QID, 
RT.`TAGS` as TAG,
Q.`id` AS QUID,
Q.`ADDR` AS QADDR, 
Q.`ORIGINALTEXT` AS QTEXTS, 
Q.`DATE` AS QDATES, 
cs.`id` AS CUID,
cs.`ADDR` AS CADDR, 
cs.`ORIGINALTEXT` AS CTEXTS, 
cs.`DATE` AS CDATES,
sol.`id` AS SUID, 
sol.`ORIGINALTEXT` AS STEXTS,
sol.`ADDR` AS SADDR, 
sol.`DATE` AS SDATES,
prj.`id` AS PUID,  
prj.`ORIGINALTEXT` AS PTEXTS, 
prj.`ADDR` AS PADDR,
prj.`DATE` AS PDATES, 
Max(Q.`DATE` ) AS Q, 
Max(cs.`DATE` ) AS C, 
Max(sol.`DATE` ) AS S, 
Max(prj.`DATE` ) AS P,
#@num as row_number 
@num:= if(@type = RA.`ADDR`, 1+@num, 1)  as v_number,
@type := RA.`ADDR` as dummy
FROM        (SELECT `id`,`TAGS`, `QID`    from `REL_TAG` ) AS RT 
 inner Join (SELECT `DATE`, `ADDR`, `QID` from `REL_ADDR` order by DATE) AS RA ON ( RT.`QID` = RA.`QID`) 
 Left outer Join (SELECT `id`,`DATE`, `ADDR`, `QID`, `ORIGINALTEXT` FROM `QUESTION`) AS Q ON ( RT.`QID` = Q.`QID`) and Q.`ADDR` = RA.`ADDR`
 Left outer Join (SELECT `id`,`DATE`, `ADDR`, `QID`, `ORIGINALTEXT` FROM `CASES` order by `CASES`.`DATE`) AS cs ON ( RT.`QID` = cs.`QID`) and cs.`ADDR` = RA.`ADDR` 
 Left outer Join (SELECT `id`,`DATE`, `ADDR`, `QID`, `ORIGINALTEXT` FROM `SOLUTION` order by `SOLUTION`.`DATE`) AS sol ON ( RT.`QID` = sol.`QID`) and sol.`ADDR` = RA.`ADDR`
 Left outer Join (SELECT `id`,`DATE`, `ADDR`, `QID`, `ORIGINALTEXT` FROM `PROJECT`  order by `PROJECT`.`DATE`) AS prj ON ( RT.`QID` = prj.`QID`) and prj.`ADDR` = RA.`ADDR`
where RT.`QID` = \''.NbOnly($Fetchmodifier).'\' Group by `QID`, addr, v_number LIMIT '.$Anstart.' ,'.$Ansnb.';';

更新 该查询不会在日志中返回任何错误,它只是不返回任何内容(null)。

这是执行 MySQLi 多查询的 PHP 代码

$mysqlin = new mysqli("localhost", "user", "pass", "db");
if (mysqli_error($mysqlin)) 
     outputdataXML(sprintf("Connect Problem : %s\n", mysqli_error($mysqlin)));
     exit();

if ($mysqlin->multi_query($SQLquery)) 
    do 
          if ($result = $mysqlin->store_result()) 
               while ($row = $result->fetch_array(MYSQLI_BOTH)) 
                   if( $Foundrows = $row[0]) //Maybe the problem is here ?
                     $Outputvalue[] = FormatFile($row);
                   
               
               $result->free();
          
          if ($mysqlin->more_results()) 
          
        while ($mysqlin->more_results() && $mysqlin->next_result());

$mysqlin->close(); 

【问题讨论】:

@Jon none,我启用了 mysql 日志检查错误,它只显示我发送的查询,它没有返回任何内容 我认为在 php 端没有正确转义的 where 条件有问题 @raheel shan 在这种情况下不会给我一个错误吗? 条件正确吗? if( $Foundrows = $row[0]) 不会总是返回 true 吗?最后一个 if 子句似乎也是空的。 【参考方案1】:

我发现了问题,一些但不是所有的表是 EMPTY, 如没有任何记录,

我为每个表添加了一个虚拟记录,有些表有记录,但有些没有, 现在即使查询不匹配连接现在仍然正确。

我希望这对很多人有帮助。

当您使用 MySQL "Join" 时,您需要在 每个All 连接的表中有 1 条记录,无论它是否会曾经使用过例如:0、00-00-0000、Null、0、空

只有这样,查询中包含的所有连接表才会起作用。

【讨论】:

以上是关于MultyQuery 在 phpmyadmin 中工作,在 Mysqli 中不工作,在其他服务器上工作的主要内容,如果未能解决你的问题,请参考以下文章

在 localhost/phpmyadmin 中获取目录列表而不是登录菜单

phpMyAdmin 中定义的“内部关系”是啥?

在 phpMyAdmin 中更改 MySQL root 密码

使用 phpMyAdmin 软件在 RDBMS 数据库表中自动复制?

从 phpMyAdmin 中运行 php 脚本

在 phpMyAdmin 中跟踪禁用错误