0

由于增加了安全优势,我刚刚开始转换为 mysqli。转换为 mysqli 的主要原因是mysqli_multi_query功能。我有几个长而复杂的查询,其中包含很多 JOINS,当我发现这个函数时,我想我可以通过将所有内容分解为单独的查询来使其更简单。

但是,我无法让查询按我的意愿工作,而且 PHP 手册对我没有帮助。

这是我到目前为止所拥有的;

$qry = "SELECT T.T_ID, T.name, T.pic, T.timestamp AS T_ts,
                        (SELECT COUNT(*) FROM track_plays WHERE T_ID = T.T_ID) AS plays,
                        (SELECT COUNT(*) FROM track_downloads WHERE T.T_ID = T_ID) AS downloads
                        FROM tracks T WHERE ID = '$ID';
                        ";
$qry .= "SELECT S_ID, status, timestamp AS S_ts FROM status WHERE ID = '$ID';";
$qry .= "SELECT G_ID, gig_name, date_time, lineup, price, ticket, venue, G_pic, timestamp AS G_ts FROM gigs WHERE ID = '$ID'"; 

// Execute multi query
if (mysqli_multi_query($con,$qry)){
    do {
        // Store first result set
        if ($result=mysqli_store_result($con)){
            while ($row=mysqli_fetch_array($result)){
                print_r($row);
            }
        }
    }
    while (mysqli_next_result($con));
}

这工作正常,数组按预期打印。但是,我想设置很多变量以供以后使用。我不会列出所有变量,但我有一些这样的;

$S_ID = htmlspecialchars($row['S_ID']);
$T_ID = htmlspecialchars($row['T_ID']);
$G_ID = htmlspecialchars($row['G_ID']);

变量被检索,但由于函数的循环性质,PHP 错误也给出了$S_IDor$G_ID未定义。$T_ID不会得到未定义的错误,因为它是第一个查询,因为它没有循环。

如果您需要更多信息或者我解释得不够清楚,请询问!

4

2 回答 2

1

不久前,我遇到了同样的问题,并且出于同样的原因,我从 mysql 迁移到了 mysqli。可悲的是,正如我在路上所意识到的那样,对于许多情况来说,这并不是最好的解决方案。在使用 mysqli 和多查询实现内容时,我仍然遇到了一些使用 mysql 的问题。

我推荐的解决方案是对您的复杂查询使用视图。它使您的编码和查询变得不那么复杂。

我知道这不是您一直在寻找的答案,但请考虑一下。

于 2013-06-08T13:12:56.067 回答
0

到目前为止,每次我使用 mysqli_multi_query 时,我的执行条件都是:

while(mysqli_more_results($connection) && mysqli_next_result($connection));

您可能想替换您的 while 语句,看看是否有帮助。

如果没有,您在分配这些 $S_ID、$G_ID 变量时是否区分每个后续查询?您是否无意中用空的 $row[] 值覆盖了变量?

我也没有在您的代码中看到 mysqli_free_result($result) 。

我什至会提供一些错误检查作为装饰。

preg_match_all("/(?:SELECT\s(.*?),\s.*?(?:;|$))/",$qry,$first_columnname);
if (mysqli_multi_query($con,$qry)){
    do {
        if ($result=mysqli_store_result($con)){
            $query_identifier=array_shift($first_columnname[1]);
            while ($row=mysqli_fetch_array($result)){
                if($query_identifier)=="T.T_ID"){
                    //do something...
                }elseif($query_identifier)=="S_ID"){
                    //do something...
                }elseif($query_identifier)=="G_ID"){
                    //do something...
                }
            }
            mysqli_free_result($result);
        }
    }
    while(mysqli_more_results($con) && mysqli_next_result($con));
}
if($error_mess=mysqli_error($con)){echo "Error = $error_mess";}

让我知道这些小改动中是否有任何效果。

于 2014-03-18T15:26:25.887 回答