使用mysqli_multi_query设置数据变量

时间:2013-06-08 13:04:18

标签: php mysqli

由于增加了安全性,我刚刚开始转换为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_ID$G_ID未定义。 $T_ID没有得到未定义的错误,因为它是第一个没有循环的查询。

如果您需要更多信息,或者我没有充分解释,请询问!

2 个答案:

答案 0 :(得分:1)

前段时间我遇到了同样的问题,也是出于同样的原因我已经从mysql迁移到了mysqli。 可悲的是,对于很多情况来说,它并不是最好的解决方案,因为我已经意识到了这一点。 在使用mysqli和多查询实现的时候,我仍然遇到了一些与mysql有关的问题。

我建议的解决方案是使用复杂查询的视图。 它使您的编码和查询远没那么复杂。

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

答案 1 :(得分:0)

到目前为止,每次使用mysqli_multi_query时,我的do-while条件是:

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";}

如果有任何这些小改动,请告诉我。