而mysqli_fetch_assoc工作时,而theres列而不是行

时间:2015-01-18 00:35:53

标签: php mysql

抱歉,我不知道如何在标题中理解这一点。

基本上我有一个有两行的表。

enter image description here

现在我想在我的页面上显示引用,然后显示所有文档列。

但是你可以看到我对两行有相同的引用。如果用户使用相同的参考文件上传文档,我希望能够在参考文献下显示所有文档。

例如,我想在页面上看起来像这样:

11111111
word.jpg
a17.gif
Matthew Smart CV.docx
word.jpg
a17.png
Matthew Smart CV.docx

这是我到目前为止所做的并且卡住了

PHP / MYSQL:

    <?php

    $query  = "SELECT * ";
    $query .= "FROM customers ";
    $query .= "WHERE reference = 11111111";
    $results = mysqli_query($connection, $query);

    $cnt = 0;
    $customer_doc = array();
    while($customer_details = mysqli_fetch_assoc($results)) {
        $customer_ref = $customer_details["reference"];
        $cnt ++;
        $customer_doc[] = $customer_details['doc' . $cnt];
    }
    echo $customer_ref;


    ?>
    <pre>
        <?php
        print_r($customer_doc);
        ?>
    </pre>

我不知道该怎么做。

任何人都可以帮助我,以便我可以从中吸取教训吗?

2 个答案:

答案 0 :(得分:2)

假设您最终会在结果集中查询多个reference值,那么CBroe在主要注释线程中提到的技术涉及在每次迭代时存储reference的最后一个值。 while循环。如果值已从上一个值更改,则打印输出。如果它是相同的,则不需要在该循环中打印它,而只需打印其他列。

选项1将变量与上次迭代的值进行比较:

注意:我在这里使用非常原始的输出执行此操作,仅使用换行符echo

// Start with an empty value for the "last one"
$last = null;
while ($customer_details = mysqli_fetch_assoc($results)) {
  // Check if the newly fetched row differs from the previous value
  if ($customer_details['reference'] != $last) {
    // It is different! Print it out
    echo $customer_details['reference']  . "\n";
  }
  // Store this current one into the $last var for 
  // comparison on the next round
  $last = $customer_details['reference'];

  // Print the other columns...
  echo $customer_details['doc1'] . "\n";
  echo $customer_details['doc2'] . "\n";
  echo $customer_details['doc3'] . "\n";
}

选项2 - 索引数组存储(可能是最佳选择,当然是我将使用的那个)

现在,假设您要将这些存储到数组中。这将非常方便,因为您可以使用reference列建立索引,并为其他列创建子数组。这更容易,您无需检查值是否更改。您只需要在每个while次迭代中附加一个子数组。

// Array to hold all results:
$all = array();
while ($customer_details = mysqli_fetch_assoc($results)) {
  // Append a new sub-array of the 3 other cols to
  // the main array's key by reference using the []
  // array append syntax
  $all[$customer_details['reference']][] = array(
    'doc1' => $customer_details['doc1'],
    'doc2' => $customer_details['doc2'],
    'doc3' => $customer_details['doc3']
  );
}

阵列现在看起来像

Array (
  '1111111' => Array (
     Array (
       'doc1' => 'word.jpg'
       'doc2' => 'a17.gif',
       'doc3' => 'Matthew Smart CV.docx'
     ),
     Array (
       'doc1' => 'word.jpg'
       'doc2' => 'a17.gif',
       'doc3' => 'Matthew Smart CV.docx'
     )
  ),
  '222222' => Array (
     Array (
       'doc1' => 'xyz.jpg'
       'doc2' => 'z17.gif',
       'doc3' => 'Matthew Smart CV.pdf'
     ),
     Array (
       'doc1' => 'xyz.jpg'
       'doc2' => 'z17.gif',
       'doc3' => 'Matthew Smart CV.pdf'
     ),
)

所以你可以使用嵌套的foreach循环它。外部获取reference,内部获取其他值:

foreach ($all as $reference => $rows) {
  // Write out the reference, which was the array key
  echo $reference . "\n";
  // Then in a loop, write out the others
  foreach ($rows as $row) {
    echo $row['doc1'] . "\n";
    echo $row['doc2'] . "\n";
    echo $row['doc3'] . "\n";
  }
}

选项3 - 查询hack:

最后一个是您可以在查询中使用的GROUP BY黑客。我不是完全推荐它,但想表明它是可能的。如果您将GROUP_CONCAT()与普通CONCAT_WS()一起使用,则可以在一行行中生成reference,然后生成所有其他文档,例如{ {1}}。在PHP中,您只需要一个循环并在分隔符||explode()

||

这将生成字面结构如下的行:

$query = "SELECT reference, GROUP_CONCAT(CONCAT_WS('||', doc1, doc2, doc3) SEPARATOR '||') AS docs FROM customers GROUP BY reference";

即列中的1111111, word.jpg||a17.gif||Matthew Smart CV.docx||word.jpg||a17.gif||Matthew Smart CV.docx ,然后是reference作为名为||的列加入的所有其他字符串。

docs

同样,我不建议实际使用它,但可以这样做。

答案 1 :(得分:1)

您需要&#34;按参考分组&#34;在数组中:

$customer_docs = [];
while($customer_details = mysqli_fetch_assoc($results)) 
    $customer_doc[$customer_details["reference"]][] = $customer_details;


foreach($customer_docs as $reference=>$docs){
    echo $reference;

    foreach($docs as $doc){
        echo $doc['doc1'];
        //...
    }  
    // "breakline"     
}

或&#34;经典方式&#34;:在while循环之前为当前引用添加临时变量,并且每次迭代都将先前的引用与当前引用进行比较。