По сути, у меня есть два отдельных запроса, которые извлекают данные из базы данных и выводят в виде таблицы HTML. $result
это результат запроса 1 и $result2
это результат запроса 2.
ДЕФЕКТ 1
Это код php, который выводится в HTML-таблицу:
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"}
другая проблема в вашем коде, которую вы еще не знаете (назовите ее дефект 3), выглядит следующим образом
Предположим, ваш result2
(1-й цикл while) получить 10 строк и result
(2-й цикл while) также получает 10 строк.
| result2 | | result |
|-----|-----| |-----|-----|
| a1 | b1 | | c1 | d1 |
| a2 | b2 | | c2 | d2 |
| .. | .. | | .. | .. |
| a10 | b10 | | c10 | d10 |
так что первая итерация вашего 1-го цикла будет производить первую строку, а затем в этой строке вы дамп все 10 строк result
в столбцы в строке 1 result2
затем во второй итерации (вперед) 1-го цикла больше не будет строк из 2-го цикла, так что это будет выглядеть так:
| a1 | b1 | c1 | d1 | c2 | d2 | .. | .. | c10 | d10 |
| a2 | b2 |
| .. | .. |
| a10 | b10 |
Других решений пока нет …