代码之家  ›  专栏  ›  技术社区  ›  JJ Labajo

如果最后一个查询有注释,则我的查询不起作用。

  •  3
  • JJ Labajo  · 技术社区  · 6 年前

    我们一直在努力解决PHP中某些查询不起作用的情况。我们发现,只有在执行的最后一个查询中有注释时,才会出现非工作查询。

    在php中,我们有如下内容:

    $getUsersQuery = "SELECT * from `users` where active = 1; ##DEVELOPER: JOE";
    $getUsersStmt = $con->prepare($getUsersQuery);
    $getUsersStmt->execute();
    $users = $getUsersStmt->fetchAll();
    
    $getProductsQuery = "SELECT * from `products` where active = 1; ##DEVELOPER: JOE";
    $getProductsStmt = $con->prepare($getProductsQuery);
    $getProductsStmt->execute();
    $products = $getProductsStmt->fetchAll();
    

    $users 变量,它包含准确的数据,但是 $products ##DEVELOPER: JOE 在上面。我们删除了第一个查询的注释,第二个查询工作正常。我们已经测试过了,理论也得到了验证。顺便说一句,我们使用的是MySql和php5。

    我们现在知道了它发生的原因。但我们的问题是, 为什么是 它发生了吗?

    如果你有什么想法,请评论一下。那将对我们有很大帮助。谢谢

    1 回复  |  直到 6 年前
        1
  •  4
  •   Álvaro González    6 年前

    罪魁祸首不是评论本身。这是一种 ;

    $stmt = $con->prepare('SELECT CURRENT_DATE; #');
    $stmt->execute();
    var_dump($stmt->fetchAll());
    
    $stmt2 = $con->prepare('SELECT CURRENT_TIME');
    $stmt2->execute();
    var_dump($stmt2->fetchAll());
    
    array(1) {
      [0]=>
      array(2) {
        ["CURRENT_DATE"]=>
        string(10) "2018-11-13"
        [0]=>
        string(10) "2018-11-13"
      }
    }
    array(0) {
    }
    

    可能发生的情况是,PDO认为您正在发出多个语句,因此需要多个结果集。如果覆盖语句,它似乎会自动清除内容,但如果创建新变量,它似乎仍希望第一个语句完成。

    如果你打电话 PDOStatement::nextRowset()

    $stmt = $con->prepare('SELECT CURRENT_DATE; #');
    $stmt->execute();
    var_dump($stmt->fetchAll());
    $stmt->nextRowset(); // <--- Retrieve the "phantom" result-set
    
    $stmt2 = $con->prepare('SELECT CURRENT_TIME');
    $stmt2->execute();
    var_dump($stmt2->fetchAll());
    

    或者,您可以设置 PDO::ATTR_EMULATE_PREPARES => false 所以PDO不会解析SQL并让作业进入MySQL服务器。