Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过PHP运行2个Mysql查询_Php_Variables_Mysqli - Fatal编程技术网

通过PHP运行2个Mysql查询

通过PHP运行2个Mysql查询,php,variables,mysqli,Php,Variables,Mysqli,我试图运行下面的查询,我发现SET语句是SELECT查询的一个单独查询。我已经找到了一些与此相关的答案,但无法在我的代码中使用它们 在phpMyAdmin中一切都很好,但在这个PHP网页中却不行 如何运行这两个查询以获得结果 $queryRank = "SET @rnk=0; SET @rank=0; SET @curscore=0; SELECT rank FROM ( SELECT AA.*,BB.playerId, (@rnk:=@r

我试图运行下面的查询,我发现SET语句是SELECT查询的一个单独查询。我已经找到了一些与此相关的答案,但无法在我的代码中使用它们

在phpMyAdmin中一切都很好,但在这个PHP网页中却不行

如何运行这两个查询以获得结果

  $queryRank = "SET @rnk=0; SET @rank=0; SET @curscore=0;

SELECT rank FROM
        (
         SELECT AA.*,BB.playerId,
        (@rnk:=@rnk+1) rnk,
        (@rank:=IF(@curscore=best3,@rank,@rnk)) rank,
        (@curscore:=best3) newscore
        FROM
          (
           SELECT * FROM
           (SELECT COUNT(1) scorecount,best3
           FROM leaderboard GROUP BY best3
        ) AAA
    ORDER BY best3 DESC
    ) AA LEFT JOIN leaderboard BB USING (best3)) A
    WHERE playerId='$memberID'";



$resultRank = mysqli_query($link, $queryRank);

if (mysqli_num_rows($resultRank) > 0) {

        $rowRank = mysqli_fetch_array($resultRank);

echo "<p class='mt-2 statNumber'>".$rowRank['rank']."</p>";


    } else {

        echo "No events played";


   }

这只是一个想法,但是如果您要生成一个简单的存储过程,那么您在PHP中的查询将更加简单,并且消除了对多个查询的明显需求

DROP PROCEDURE IF EXISTS `spGetRank`;
delimiter //
create procedure `spGetRank`(
    IN `p_player_id` VARCHAR(64)
)

begin
    declare _player_id integer default 0;


    set @_player_id=cast( p_player_id as unsigned );
    set @rnk=0;
    set @rank=0;
    set @curscore=0;

    select rank from
        (
         select aa.*, bb.playerid,
        (@rnk:=@rnk+1) rnk,
        (@rank:=if(@curscore=best3,@rank,@rnk)) rank,
        (@curscore:=best3) newscore
        from
          (
           select * from
           (select count(1) scorecount, best3
               from leaderboard group by best3
            ) aaa
                order by best3 desc
            ) aa 
    left join leaderboard bb using (best3)) a
   where playerid=@_player_id;

end//
delimiter ;
然后,在PHP中

$sql='call `spGetRank`(?)';
$stmt=$link->prepare( $sql );
if( $stmt ){
    $stmt->bind_param('s', $memberID );
    $res=$stmt->execute();



    if( $res ){
        $stmt->store_result();
        $stmt->bind_result( $rank );
        $stmt->fetch();
        $stmt->close();

        echo 'Rank:' . $rank;
    }
}
另一种可能是在实际查询本身中定义变量,而不是将其作为单独的查询来定义——尽管说实话,上面的查询相当复杂。但总体要点如下:

 select ... (@rnk := ifnull( @rnk, 0 ) + 1 ) etc

这只是一个想法,但是如果您要生成一个简单的存储过程,那么您在PHP中的查询将更加简单,并且消除了对多个查询的明显需求

DROP PROCEDURE IF EXISTS `spGetRank`;
delimiter //
create procedure `spGetRank`(
    IN `p_player_id` VARCHAR(64)
)

begin
    declare _player_id integer default 0;


    set @_player_id=cast( p_player_id as unsigned );
    set @rnk=0;
    set @rank=0;
    set @curscore=0;

    select rank from
        (
         select aa.*, bb.playerid,
        (@rnk:=@rnk+1) rnk,
        (@rank:=if(@curscore=best3,@rank,@rnk)) rank,
        (@curscore:=best3) newscore
        from
          (
           select * from
           (select count(1) scorecount, best3
               from leaderboard group by best3
            ) aaa
                order by best3 desc
            ) aa 
    left join leaderboard bb using (best3)) a
   where playerid=@_player_id;

end//
delimiter ;
然后,在PHP中

$sql='call `spGetRank`(?)';
$stmt=$link->prepare( $sql );
if( $stmt ){
    $stmt->bind_param('s', $memberID );
    $res=$stmt->execute();



    if( $res ){
        $stmt->store_result();
        $stmt->bind_result( $rank );
        $stmt->fetch();
        $stmt->close();

        echo 'Rank:' . $rank;
    }
}
另一种可能是在实际查询本身中定义变量,而不是将其作为单独的查询来定义——尽管说实话,上面的查询相当复杂。但总体要点如下:

 select ... (@rnk := ifnull( @rnk, 0 ) + 1 ) etc

使用mysqli_查询,一次调用只能运行一个查询。还有一个@KIKOSoftware供您参考,这个函数是一个复杂而危险的工具,使用起来非常复杂。因此,默认情况下不建议使用该选项。更不用说mysqli_query和mysqli_multi_query都不应该与查询中的php变量一起使用。我建议您创建一个存储过程来实现您的目标,这样就不需要在php代码中进行多个查询,只需要一个简单的调用proc类型query。使用mysqli_query,您只能在一个调用中运行一个查询。还有一个@KIKOSoftware供您参考,这个函数是一个复杂而危险的工具,使用起来非常复杂。因此,默认情况下不建议使用该选项。更不用说mysqli_query和mysqli_multi_query都不应该与查询中的php变量一起使用。我建议您创建一个存储过程来实现您的目标,这样就不需要在php代码中进行多次查询,只留下一个简单的调用过程类型query存储过程看起来是一个很好的解决方法,我已经尝试过使用,但是只要保持等级为“0”,mysql db就会对变量做一些奇怪的事情。在运行上述操作之前,请尝试在mysql客户端应用程序gui或cmdline中将这些变量设置为null。然后尝试从gui或cmd运行存储过程。上面的代码没有经过测试,但本质上与您最初使用的代码完全相同-遗憾的是,我没有办法进行测试。我尝试在phpMyAdmin中运行该过程,请求参数,但仍然给出0。请原谅,我完全不知道以下内容,但传入的memberID变量是一个介于1和30之间的数字,这与任何变量声明有什么区别吗?您可以随时修改它以匹配其他整数-我只是在varcharOK猜测-为最初给出的错误过程道歉。我根据我在原始查询中可以确定的列模拟了一个简单的表,并对上面的存储过程进行了一些修改-现在似乎可以工作了??存储过程看起来是一个很好的解决方法,我尝试过使用它,但只要保持“0”的秩,mysql db就会对变量做一些奇怪的事情。在运行上述操作之前,请尝试在mysql客户端应用程序gui或cmdline中将这些变量设置为null。然后尝试从gui或cmd运行存储过程。上面的代码没有经过测试,但本质上与您最初使用的代码完全相同-遗憾的是,我没有办法进行测试。我尝试在phpMyAdmin中运行该过程,请求参数,但仍然给出0。请原谅,我完全不知道以下内容,但传入的memberID变量是一个介于1和30之间的数字,这与任何变量声明有什么区别吗?您可以随时修改它以匹配其他整数-我只是在varcharOK猜测-为最初给出的错误过程道歉。我根据我在原始查询中可以确定的列模拟了一个简单的表,并对上面的存储过程进行了一些修改-现在似乎可以工作了??