繁体   English   中英

PHP mysqli查询在联接上返回结果“ 1”

[英]PHP mysqli query returning result “1” on joins

我一直在尝试从php-mysql中提取一些值,并且它返回一个奇怪的结果“ 1”。 它由一个带有where子句的内部联接组成,一切正常,但是当我尝试echo显ID时,结果奇怪的是“ 1”,但是我确信ID不是1。 MySQL CLI,它完全返回我需要的内容,但是在php中,它甚至没有说出错误。

有趣的是,只有ID返回“ 1”,其他所有返回正确的值。 CLI上的ID是- "V8FBaMJT6bqPbpRutJgkRdc44S3Gz3H8VjW5iu5E4yhBlLA1/D8o+EcGMUY62LZLrxb2SSkaxBoUwaiQXQv+3OsoDTuheYTy4ibPsy91X8JhNGFjOWM2MWQyMWMxMTBmMTU5YjU5NzU2NGM3OTc1YQ=="

$showPosts = "SELECT * FROM box 
              INNER JOIN interactions 
              ON box.u_id=interactions.actorid 
              WHERE interactions.actorid=? 
                AND interactions.type IN ('1','5') 
              ORDER BY box.time_created";

if ($stmt = $conn->prepare($showPosts)) {
    /* bind parameters for markers */
    $b = "V8FBaMJT6bqPbpRutJgkRdc44S3Gz3H8VjW5iu5E4yhBlLA1/D8o+EcGMUY62LZLrxb2SSkaxBoUwaiQXQv+3OsoDTuheYTy4ibPsy91X8JhNGFjOWM2MWQyMWMxMTBmMTU5YjU5NzU2NGM3OTc1YQ==";
    $stmt->bind_param("s", $b);


    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $metaResults = $stmt->result_metadata();
    $fields = $metaResults->fetch_fields();
    $statementParams = '';

    //build the bind_results statement dynamically so I can get the results in an array
    foreach($fields as $field){
        if(empty($statementParams)){
            $statementParams .= "\$post['".$field->name."']";
        } else {
            $statementParams .= ", \$post['".$field->name."']";
        }
    }

    $statment = "\$stmt->bind_result($statementParams);";
    eval($statment);

    while($stmt->fetch()){
        echo $post['id'];
        echo $post['time_created'];
    }
}

现在,结果是-第一个是奇怪的“ 1”,第二个是时间戳。 另外,如果我删除INNER连接部分,并执行一个简单的SELECT * FROM box ,它会完美地返回ID。 而且我也尝试过做一个stmt->num_rows ,它返回'0'。 也许我缺少明显的东西。

我是在php mysql中使用Joins的新手,在过去的2个小时中,这一直让我头疼不已,感谢您的帮助。 谢谢。

问题是您使用SELECT * FROM ...会返回您正在使用的任何表中的每一列。 这不是您想要的。 始终编写要从查询中读取的列。

在这种情况下,您的结果集中有多个Id列,一个Id列来自表box ,另一个来自表interactions $post['id']的值将包含interactions表的值。 因此,通过编写以下命令来更改SELECT查询:

SELECT box.id, box.time_created FROM ...

另外, 永远不要使用eval()函数。 您可能希望切换到具有更清晰API的PDOPDOStatement :: fetch函数将下一行作为数组返回)

经过数小时的研究,我得出了一个可行的例子,它很好用。 将来其他人可能会遇到相同的问题并犯错,因此我在这里发布了该问题的答案:


问题:

  1. 在两个联接表中具有相同的列名

第一个问题是表交互具有与表相同的列名id 由于我沿着带有交互作用的内部SELECT * FROM box使用SELECT * FROM box ,因此它基于第二个id交互作用而不是box)返回结果。

  1. 在显示记录数之前不存储结果

其次,问题是结果没有像http://php.net/manual/en/mysqli-stmt.num-rows.php那样存储,这是一个愚蠢的错误。


解决方案:

  • 解决列重复

因此,首先我决定将表交互的列名更改为id ,然后将其更改为inter_id以避免进一步的冲突。 尽管这不是一个非常明智的步骤,但它将避免将来出现此类愚蠢的错误。 然后,如前一个答案所指出的,我必须指定要输出的结果的列名,而不是使用SELECT * ,因此将其更改为

              SELECT box.id, box.time_created FROM box 
              INNER JOIN interactions 
              ON box.u_id=interactions.actorid 
              WHERE interactions.actorid=? 
              AND interactions.type IN ('1','5') 
              ORDER BY box.time_created";

这几乎解决了第一个问题。

  • 计算结果数

第二个只是添加$stmt->store_result(); 代码,并且在我执行echo $stmt->num_rows;之前,它可以完美地工作echo $stmt->num_rows; 它完美地显示了结果。

再次感谢你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM