繁体   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