簡體   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