由于增加了安全性,我刚刚开始转换为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
没有得到未定义的错误,因为它是第一个没有循环的查询。
如果您需要更多信息,或者我没有充分解释,请询问!
答案 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";}
如果有任何这些小改动,请告诉我。