【问题标题】:commands are out of sync.. you cant run this command now in while loop命令不同步..你现在不能在while循环中运行这个命令
【发布时间】:2014-05-12 10:14:42
【问题描述】:
 `$sql = "call geodist(".$_SESSION['This'].",500)";` //get the ids near you

$result=mysqli_query($GLOBALS['link'],$sql) or die(mysqli_error($GLOBALS['link']));

while($row=mysqli_fetch_assoc($result)) // insert them into nerby table
{

$sql = "INSERT INTO `nearby`(`userid`, `strangerid`) VALUES (".$_SESSION['This'].",".$row['id'].")";
mysqli_close($GLOBALS['link']);                                                      
mysqli_query($GLOBALS['link'],$sql) 
    or die("akash".mysqli_error($GLOBALS['link'])); 
}

当我删除“//*”语句时,我会出现不同步错误......保留这两行有助于我运行代码,但代码会变慢,因为每次循环迭代都会关闭并重新打开数据库连接。请给我一个备用电话....我真的很感激你

【问题讨论】:

  • 您可以将过程的结果存储在临时表中,并将此临时表用于单个INSERT 语句。如果这样做,则根本不需要循环。 stackoverflow.com/questions/17944871/… 接受的答案显示了它是如何完成的。
  • 谢谢....我认为它可以工作
  • @VMai 谢谢哥们.. 它奏效了... :-)
  • 您可以回答自己的问题,并展示您是如何用不同的方法解决这个问题的。
  • @VMai 显示我现在无法回答我的问题

标签: php mysql sql mysqli


【解决方案1】:

当您尝试用新数据(循环内的查询)填充 mysql 和 PHP 之间的缓冲区时,会发生什么情况。
你需要做的是

  1. 在将缓冲区用于其他查询之前从缓冲区获取所有数据
  2. 看看你如何设置这个 mysqli 连接来获取无缓冲的数据。

在这里阅读更多 http://dev.mysql.com/doc/apis-php/en/apis-php-mysqlinfo.concepts.buffering.html

【讨论】:

    【解决方案2】:
    DROP TEMPORARY TABLE IF EXISTS near;
    CREATE TEMPORARY TABLE near
    

    我在 geodist() 过程中添加了这两行。 它创建一个名为“near”的临时表并将结果集存储在其中。 现在这个表可以按如下方式使用

    $sql = "call geodist(".$_SESSION['This'].",".$GLOBALS['RADIUS'].")";            // get the ids near you
             $result=mysqli_query($GLOBALS['link'],$sql) or die(mysqli_error($GLOBALS['link']));
    
    
     $sql = "SELECT m.`id`\n"    
            . " FROM `members` m , `already_assigned` a\n"    
            . " WHERE a.`id`=m.`id` and m.`id` <> ".$_SESSION['This']."\n"    
            . " and m.`gender`=".$_SESSION['wants']." and m.`interested_in`=".$_SESSION['gender']." and a.`status`='free'\n"   
            . " and m.`id` IN (SELECT * from `near`)\n"  /*see this line*/    
            . " ORDER BY RAND( ) \n"   
            . " LIMIT 1";
    

    你可以看到现在我已经删除了 while 循环......现在它不需要了

    【讨论】:

      【解决方案3】:

      在你真正完成之前不关闭数据库连接怎么样?

      您应该只与任何给定的数据库服务器建立一个连接(基本上,脚本中只有一个连接,除非您正在使用复杂的多数据库服务器设置)

      【讨论】:

      • 如果我不关闭连接,那么我会收到“OUT OF SYNC ERROR......现在无法运行此命令”错误
      • @user3627904 通常不需要关闭连接,因为非持久打开的链接会在脚本执行结束时自动关闭
      • 我认为你没有明白我的意思....保留这两行有助于我的代码运行..如果删除,显示错误
      猜你喜欢
      • 2016-05-28
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2013-04-08
      • 2016-04-11
      • 2021-10-13
      相关资源
      最近更新 更多