簡體   English   中英

運行json_encode時,如何在同一個變量中引入多行(mysql)結果?

[英]How to bring more than one row (mysql) result inside the same variable when running a json_encode?

我正在運行POST + json代碼以從數據庫收集數據,所有結果都僅帶有一個值(這是正確的),但是只有一列應該顯示多個值,但僅顯示第一個值。 我需要更改代碼以獲取此列表而不是第一行結果嗎?

我已經運行了一個MYSQL查詢,將三個共享相同ID id的數據庫鏈接PCRNo ,前兩個數據庫tPCRtcomplement應該只有一個結果,而第三個數據庫應該收到更多的結果,因為我們可以有更多具有相同id的行。

這是我的JavaScript

<script> 

  $(document).ready(function(){
        $('#table').on('click', '.fetch_data', function(){
          var pcr_number = $(this).attr('id');

          $.ajax({
            url:'fetch.php',
            method:'post',
            data:{pcr_number:pcr_number},
            dataType:"json",
            success:function(data){

              $('#PCR').val(data.PCRNo);
              $('#PCC').val(data.PCC);
              $('#PCR_Creation').val(data.Creation_Date);
              $('#PCR_Status').val(data.Stage);
              $('#Required_Completion').val(data.Required_Completion);
              $('#description').val(data.Name);
              $('#Comments').val(data.Comments);
              $('#originator').val(data.Creator);
              $('#change_type').val(data.Category);
              $('#product_type').val(data.Product);
              $('#req_dept').val(data.Department);
              $('#flow').val(data.Flow_Start_Date);
              $('#own').val(data.Owning_Site);
              $('#impacted').val(data.Impacted_Site);
              $('#approval').val(data.Meeting_Status);
              $('#review').val(data.Review_Date);
              $('#cat').val(data.Cat);
              $('#cost').val(data.Cost);
              $('#labor').val(data.Labour);
              $('#volume').val(data.Volume);
              $('#request').val(data.Request);
              $('#justification').val(data.Justification);
              $('#PCNlist').val(data.PCNNo);
              $('#monitor').val(data.Monitor);
              $('#env').val(data.Environment);
              $('#trial').val(data.Trial);
              $('#resp').val(data.Responsible);
              $('#deadline').val(data.Deadline);      
              $('#dataModal').modal('show');

            }
          });
        });

        $(document).on('click', '#update', function(){  
        var pcr_number = document.getElementById("PCR").value;  
        var Comments= document.getElementById("Comments").value; 
        var approval= document.getElementById("approval").value;
        var review= document.getElementById("review").value;
        var cat= document.getElementById("cat").value;
        var monitor= document.getElementById("monitor").value;
        var env= document.getElementById("env").value;
        var trial= document.getElementById("trial").value;
        var resp= document.getElementById("resp").value; 
        var deadline= document.getElementById("deadline").value;
        var PCC = document.getElementById("PCC").value;


        $.ajax({  
            url:"edit.php",  
            method:"POST",  
            data:{pcr_number:pcr_number, Comments:Comments, PCC:PCC, approval:approval, review:review, cat:cat, monitor:monitor, env:env, trial:trial, resp:resp, deadline:deadline},  
            dataType:"text",
            success:function(data)  
            {  
                alert('PCR Information Updated');  

            }

        });  
        });
  }); 
 </script> 

這是我的fetch.php

<?php
$SelectedPCRNo = $_POST['pcr_number'];
if(isset($_POST['pcr_number']))
{
  $output = '';
  $hostname = "localhost";
  $username = "root";
  $password = "";

  $databaseName = "change_management";

  $dbConnected = @mysqli_connect($hostname, $username, $password);
  $dbSelected = @mysqli_select_db($databaseName,$dbConnected);

  $dbSuccess = true;
  if ($dbConnected) {
    if ($dbSelected) {
      echo "DB connection FAILED<br /><br />";
      $dbSuccess = false;
    }       
  } else {
    echo "MySQL connection FAILED<br /><br />";
    $dbSuccess = false;
  }

  $sql = mysqli_query($dbConnected, "SELECT *   FROM change_management.tPCR INNER JOIN change_management.tcomplement ON change_management.tPCR.PCRNo = change_management.tcomplement.PCRNo INNER JOIN change_management.tPCN ON change_management.tPCR.PCRNo = change_management.tPCN.PCRNo WHERE tPCR.PCRNo = '".$_POST['pcr_number']."'");  

  $row = mysqli_fetch_array($sql);     
  echo json_encode($row); 
}  
 ?>

我的結果沒有問題,並且表已填充好,只有#PCNlist應該填充與它相關的所有行的值,現在只是一個值,僅第一行。 有什么辦法可以使整個PCNlist僅在fetch.php上更改一些代碼?

如果我理解正確,則表tPCN可以包含與每個PCR編號關聯的多行。 您想獲取所有這些行並以JSON返回它們。

如果要實現這一點,但還要確保其他兩個表僅返回一行,那么我認為您應該在第一個查詢中刪除JOIN到tPCN ,然后創建第二個查詢以專門獲取tPCN行。

$output = [];
$stmt = $dbConnected->prepare("SELECT * FROM change_management.tPCR INNER JOIN change_management.tcomplement ON change_management.tPCR.PCRNo = change_management.tcomplement.PCRNo WHERE tPCR.PCRNo = ?");
$stmt->bind_param('s', $_POST['pcr_number']);
$stmt->execute();
$result = $stmt->get_result();

//select a single row from the result and assign it as the output variable
if ($row = $result->fetch_assoc()) {
    $output = $row;
}

$stmt2 = $dbConnected->prepare("SELECT * FROM change_management.tPCN WHERE PCRNo = ?");
$stmt2->bind_param('s', $_POST['pcr_number']);
$stmt2->execute();
$result2 = $stmt2->get_result();
$output["tPCN"] = array(); //create a new property to put the tPCN rows in

//loop through all the tPCN rows and append them to the output
while ($row2 = $result2->fetch_assoc()) {
    $output["tPCN"][] = $row2;
}

echo json_encode($output);

這將產生具有這種結構的JSON:

{
  "PCRNo": "ABC",
  "CreationDate": "2019-08-07",
  "Name": "A N Other",
  //...and all your other properties, until the new one:
  "tPCN": [
    {
      "SomeProperty": "SomeValue",
      "SomeOtherProperty": "SomeOtherValue",
    },
    {
      "SomeProperty": "SomeSecondValue",
      "SomeOtherProperty": "SomeOtherSecondValue",
    }
  ]
}

然后,您將需要修改JavaScript代碼以能夠處理新結構。 由於我不知道確切的字段來自tPCN表,因此我無法為您提供示例,但是希望您很清楚,您將需要遍歷數組並為找到的每個條目輸出相同的HTML。


注意:如您所見,我重新編寫了查詢代碼以使用准備好的語句和參數化查詢,因此您可以看到將來如何以安全的方式編寫代碼。


PS:在“成功”功能中,您有很多代碼可以用來設置各個字段的值。 您可能需要考慮使用一個簡單的JS模板引擎,以使其不再那么冗長和繁瑣,並使用正確添加到其中的值生成所需的HTML。 但這是一個單獨的問題,僅出於代碼的可維護性

我已將此代碼添加到我的ajax函數中,以僅攜帶我需要的內容,並且可以正常工作+ @ADyson發布的內容。

var PCN = data.tPCN;
var i;
var PCNList = '';

for (i = 0; i < PCN.length; i++){
  var PCNList = PCNList + PCN[i]['PCNNo'] + ' - ' + PCN[i]['Stage']; 
}
$('#PCNlist').val(PCNList);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM