【问题标题】:What is the defect in this PHP foreach and JS code这个 PHP foreach 和 JS 代码有什么缺陷
【发布时间】:2018-05-29 06:44:39
【问题描述】:

基本上,我有两个单独的查询,它们从数据库中获取数据并在 HTML 表中输出。 $result 是查询 1 的输出,$result2 是查询 2 的输出。

缺陷 1

这是输出到 html 表的 php 代码:

echo "<table id='table'>";
while($row=pg_fetch_assoc($result2)){echo "<tr>";
echo "<td align='left' width='200'>" . $row['message_date'] . "</td>";
echo "<td align='left' width='200'>" . $row['message_text'] . "</td>";
echo "<td align='left' width='200'>" . $row['message_by'] . "</td>";
while($row2=pg_fetch_assoc($result)){
  foreach($row2 as $rslt){
    echo "<td align='left' width='200'>" . $rslt['recipient_name'] . "</td>";
    echo "<td' align='left' width='200'>" . 0 . $rslt['phone_number'] . "</td>";
  }
}
echo "</tr>";}
echo "</table>"

缺陷在于,例如有 20 个收件人,表示 20 个姓名和 20 个电话号码,所有行在表中输出 3 到 5 次。例如:

|some-date|some-text|some-sender|John-Doe|12345|John-Doe|12345|John-Doe|12345|...

我可以确认表格中的任何名称都没有多个条目。这是为什么呢?

缺陷 2 如果页面从上表中获取所有数据并基本上将其转换为对象然后字符串化,则底部有 JS。只有在上面有问题的收件人字段(姓名和电话号码)中,它才有效,它只需要第一个名字和电话,我希望重复的收件人数据也在那里。这是代码:

var table = document.getElementById('table');
  var jsonArr = [];
  for(var i =0,row;row = table.rows[i];i++){
       var col = row.cells;
       var jsonObj = {
           message_by : col[2].innerHTML,
           message_date : col[0].innerHTML,
           message_recipients: [{
             phone_number : col[4].innerHTML,
             recipient_name : col[3].innerHTML,
           }],
           message_text : col[1].innerHTML,
           subscriber_name: "myName"


         }
         console.log(jsonObj);

      jsonArr.push(jsonObj);
  }

  var sendString = JSON.stringify(jsonObj);
  console.log(sendString);

我在表格的 php 输出中做错了什么,为什么 JS 没有从表格中提取所有收件人数据?

编辑 - 更多信息

对于缺陷 1,这是我所期望的:

|message date| sender | recipient-1 name | recipient-1 phone | recipient-x name | recipient-x phone | message | subscriber-name |
|------------|--------|------------------|-------------------|------------------|-------------------|---------|-----------------|

这就是我得到的(注意重复的收件人条目,但现在所有收件人都是这样。有些是 3 倍,有些是 5 倍):

|message date| sender | recipient-1 name | recipient-1 phone | recipient-1 name | recipient-1 phone | recipient-2 name | recipient-2 phone | message | subscriber-name |
|------------|--------|------------------|-------------------|------------------|-------------------|------------------|-------------------|---------|-----------------|
| some date  | Peter  |    John Doe      |    0700100100     |    John Doe      |    0700100100     |    Person 2      |    0700200200     |some text|     my name     |

对于缺陷 2,这是我所期望的:

{
"message_by":"Senders Name",
"message_date":"2017-12-14 13:54:28.876",
"message_recipients":[
{
"phone_number":"0700100100",
"recipient_name":"Person One"
},
{
"phone_number":"0700200200",
"recipient_name":"Person Two"
},
{
"phone_number":"0700300300",
"recipient_name":"Person Three"
}
],
"message_text":"Sample text",
"subscriber_name":"myName"
}

这就是我得到的:

{
"message_by":"Senders Name",
"message_date":"2017-12-14 13:54:28.876",
"message_recipients":[
{
"phone_number":"0700100100",
"recipient_name":"Only The First Person"
}
],
"message_text":"Sample text",
"subscriber_name":"myName"
}

【问题讨论】:

  • 嵌套$row= 看起来很危险。
  • 不要在第二个 while 循环中使用相同的变量
  • it takes only the very first name and phone - 因为您只添加了第一个名字和电话,第 3 列和第 4 列...第二个名字和电话将在第 5 列和第 6 列中,第三个将在第 7 列和第 8 列中 - 大概
  • 你能把DEFECT 1的实际结果和你想要的预期输出的例子也贴出来
  • @Clint_A - 所以你为什么抱怨你只得到 col 3/4 而你所做的只是阅读 col 3/4

标签: javascript php json foreach stringify


【解决方案1】:

您的代码中的另一个您还不知道的问题(称为缺陷 3)是这样的

假设您的 result2(第一个 while 循环)获得 10 行,而result(第二个 while 循环)也获得 10 行。

|  result2  |      |  result   |
|-----|-----|      |-----|-----|
|  a1 |  b1 |      |  c1 |  d1 |
|  a2 |  b2 |      |  c2 |  d2 |
|  .. |  .. |      |  .. |  .. |
| a10 | b10 |      | c10 | d10 |

所以您的第一个循环的第一次迭代将产生第一行,然后在该行中,您将 result 的所有 10 行转储到 result2 的第 1 行的列中

然后在第一个循环的第二次迭代(向前)中,第二个循环将不再有行,因此它看起来像这样:

|  a1 |  b1 |  c1 |  d1 |  c2 |  d2 |  .. |  .. | c10 | d10 |
|  a2 |  b2 |
|  .. |  .. |
| a10 | b10 |

【讨论】:

  • 我已经编辑了问题以便在桌面上进行更多说明
  • 如果你像这样循环它仍然会导致类似的布局,为什么不加入 postgre 查询的结果呢?
  • 我看到了 HTML 表格的问题。您可能对我如何填充一列上的名称和另一列上的数字而不是每个列上的新列有一个想法。
  • 我试过了,但是表格有不同的数据类型和不同的列数。我遇到了各种各样的问题
  • 难道你没有共同点来链接这两个结果吗?如果没有,你希望如何将result2 的第二行与result 的行配对?,必须有成为一个共同的链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2011-07-07
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多