PHP mysqli查询在连接

时间:2016-03-26 01:34:53

标签: php mysql

我一直试图从php-mysql中提取一些值,并且它返回一个奇怪的结果“1”。它包含一个带有where子句的内部连接,一切正常,但是当我尝试echo ID时,结果奇怪地为“1”,但我确信ID不是1.当我运行时在MySQL CLI上的相同查询,它返回我需要的东西,但在PHP中,它甚至没有说有错误。

有趣的是,只有ID返回“1”,其他所有内容都返回正确的值。 CLI上的ID为 - "V8FBaMJT6bqPbpRutJgkRdc44S3Gz3H8VjW5iu5E4yhBlLA1/D8o+EcGMUY62LZLrxb2SSkaxBoUwaiQXQv+3OsoDTuheYTy4ibPsy91X8JhNGFjOWM2MWQyMWMxMTBmMTU5YjU5NzU2NGM3OTc1YQ==",因此它不可能等于“1”。

$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中使用连接,在过去的2个小时里我一直很头疼,任何帮助都表示赞赏。 谢谢。

2 个答案:

答案 0 :(得分:3)

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

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

来更改SELECT查询
SELECT box.id, box.time_created FROM ...

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

答案 1 :(得分:0)

经过数小时的研究,我已经找到了一个有效的例子,它运作得很好。 其他人可能会在未来遇到同样的问题并犯错误,所以我在这里发布问题的答案:

问题:

  1. 在两个已连接的表格中具有相同的列名称
  2. 第一个问题是表交互与表具有相同的列名id。由于我在交互的内部联接中使用SELECT * FROM box,因此根据交互的第二个id返回结果而不是

    1. 在显示记录数之前不存储结果
    2. 其次,问题是结果没有像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;之前它完美无缺地工作,并且它完美地显示了结果。

      再次感谢你。