如何将关联数组从PHP传递给HTML以进行进一步处理

时间:2017-07-14 19:45:47

标签: javascript php jquery html

在我的HTML页面上,我有一个通过PHP发送数据库查询的脚本。 现在我需要将带有结果(关联数组)的数组传递回我的HTML页面以填充一些textareas。

问题(我是PHP新手):

1-数组可以按原样传递,还是需要编码/解码或序列化/反序列化(以及如何)?

2-一旦数组到达HTML脚本,我可以通过循环遍历其元素(我的意思是,是否可以在HTML脚本中创建循环?)

3-如果后者不可能,我怎么能指示PHP在HTML页面上填充给定的textarea?

已编辑(现已使用代码):

//HTML
<script>
    function PopulateTextAreas() 
    {
        var arrayTextAreasNames = ["name","surname","dob"];

        //Now pass this to php
        var xhttp = new XMLHttpRequest();

        var jsonstring = JSON.stringify(arrayTextAreasNames);
        var encoded = encodeURIComponent(jsonstring);

        xhttp.open("GET", "LoadFromDb.php?hId=" + "&arrayTextAreasNames=" + encoded, true);

        xhttp.onreadystatechange = function() 
        {
            if (this.readyState == 4 && this.status == 200) 
            {
                    var decoded = json_decode(this.responseText);
                    console.log(decoded); //Not working

          //A loop would then follow to separate each element of the array and then populate the corresponding textareas is a way similar to below:
           //document.getElementById("name").value = this.responseText; 
           //document.getElementById("surname").value = this.responseText;
           //document.getElementById("dob").value = this.responseText;
            }
        };
        xhttp.send(); 
    }
</script>  




//PHP
    //The associative array is built in a loop like this
    $ArrayDbEntryName_and_itsValue[$i] [$DbItemName] = $DbItemValue;

    //and it looks like the follow one:

array(3) {
  [0]=>
  array(1) {
    ["name"]=>
    string(1) "paul"
  }
  [1]=>
  array(1) {
    ["surname"]=>
    string(2) "green"
  }
  [2]=>
  array(1) {
    ["dob"]=>
    string(8) "1/1/1980"
  }

    //Then the array is echoed back to the HTML page like this
    $ResultStringified = JSON.stringify($ArrayDbEntryName_and_itsValue);
    echo encodeURIComponent($ResultStringified);

4 个答案:

答案 0 :(得分:1)

编辑:以下信息是根据OP(包括海报代码之前)。

  1. PHP中的数组无法传递给HTML。相反,您将该数组转换为更可用的格式,然后可以将其发送到HTML。通常,您使用JSON(Javascript Object Notation)格式。例如,假设您在PHP文件中创建了一个关联数组。

    $info = ["firstname" => "somename", "age" => 25, "address"=>["home"=>"something1","collage"=>"something2"]];
    

    现在您必须将$ info转换为JSON格式。 你使用以下功能来做到这一点。

    $jsoninfo = json_encode($info);
    

    JSON格式只包含名称 - 值对。名称是&#34;名字&#34;它的价值是&#34; somename&#34;。这是第一个名称 - 价值对。等等。 由于您希望在HTML上显示它,因此您回显$ jsoninfo:

    echo $jsoninfo;

    这就是HTML的外观。

    {"firstname":"somename","age":25,"address":{"home":"something1","collage":"something2"}};
    

    但是你说你想用HTML填充这个textarea。因此我使用它代替那个简单的回声。这将创建一个textarea元素,并将整个值$ jsoninfo放在该textarea元素中。

    echo "<textarea>".$jsoninfo."<textarea>"; // this is not a good practice to send value to HTML like this way, since you asked about it I had to write like that. You will need javascript to actually play with the JSON object and then write it to HTML.
    
  2. 与数组不同,从JSON开始,您必须使用名称 - 值对中的名称来获取其关联值。你需要javascript。我在告诉你。

    由于这不是关于javascript的教程,我将直接进行。

    假设您的html页面中也有一个空的段落元素(我们将需要这个),它的ID是&#34; p1&#34;。如下:

    <p id='p1'></p>
    

    现在我们将使用HTML中的以下javascript代码或已经包含在HTML中的外部js文件。在这里,我将其编写为HTML中的内联脚本。

    <script>
    var getfromtextarea = document.getElementsByTagName("textarea")[0].innerHTML; //get the JSON object from textarea and save it into a javascript variable named getfromtextarea
    var get2 = JSON.parse(getfromtextarea); //JSON.parse() function is used to convert JSON object into javascript plain object so that we can get the value associated to its name(remember name-value pair), you will understand this is next line.
    document.getElementById("p1").innerHTML = get2.firstname; //this will write/print "somename"(without quotes) inside the p element that we had created in HTML.
    </script>
    
  3. 很多事情都是可能的,你只需要学习技巧并遵守规则。我希望它可以帮助你理解一些东西。

答案 1 :(得分:0)

1.如果要传递数组,可以使用JSON格式。看看它http://php.net/manual/en/function.json-encode.php

2.HTML是一种标记语言,而不是脚本。要在浏览器中循环浏览数组,可以使用Javascript。或者您可以使用PHP在服务器端生成HTML页面。

3.举个例子:

<?php
/**
 * This is .php file
 *
 * @var array $rows Array of data which you would to show in textarea
 */

?>

<textarea>
    <?php
    foreach ($rows as $key => $value): ?>
        <p id="<?= $key ?>"><?= $value ?></p>
    <?php endforeach; ?>
</textarea>

答案 2 :(得分:0)

我在考虑这样的事情:

在PHP方面:

echo '<div id="my_array" style="display:hidden">' . json_encode($myArray) . '</div>';

在HTML / JavaScript方面:

<script>    
var myArray = JSON.parse(document.getElementById("myArray").innerHTML);

//loop through myArray using JavaScript
var arrayLength = myArray.length;
for (var i = 0; i < arrayLength; i++) {
    alert(myArray[i]);
    //Do something
}
<script>

对于#3,有很多方法。我可能需要查看生成textarea的代码,以建议如何使用文本填充它。

<强>更新

我发现你直接使用var xhttp = new XMLHttpRequest(); ..为什么?

我非常推荐使用jQuery AJAX工具(简单的学习曲线和低初始投资)或类似AngularJS(高学习曲线和初始投资)的AJAX请求。

将减少代码,减少调试的内容

如果json_decode()无效,请尝试JSON.parse(this.responseText);

JSON.parse是JS函数,而json_decode是PHP函数,你试图在JS脚本中使用它。

我还没有进一步查看代码,看看如何将文本放到textarea框中,但是你可以使用AJAX来做这样的事情:

Fill a textbox with jQuery

Jquery to populate input or textarea

答案 3 :(得分:0)

我知道它已经过去了将近两年,但是仅可以使用一种更简单的PHP方法,而无需使用JSjson,如果数据源仅是通过HTML提交的表单。

HTML/PHP下面设置的代码。

示例HTML

<!DOCTYPE html>
<html lang="en">
    <head>
    <meta charset="utf-8" />
    <title>PHP HTML - Pass data around with POST</title>
    <link rel='stylesheet' type="text/css" href="css/style.css" />   
    </head>
    <body>

  <form method="post" name="frmData" action="pass_data_received.php">
    Name:<textarea name="name"></textarea>
    Surname:<textarea name="surname"></textarea>
    Date of birth:<textarea name="dob"></textarea>
    <br />
    <input type="submit" name="submit" value="Submit">
  </form>
  </body>
</html>

示例PHP

<?php

  // Process only if the form was submitted
  if(isset($_POST['submit'])){

    echo '<h3>Data was submitted as shown below.</h3>';
    // init variable data to an empty array
    $data = [];

    // set the data to the post array
    $data = $_POST;

    // get the count of posted by only the name field (any field can do as long as it is a mandatory/required input)
    $dataLength = count($data['name']);

    /* You can use a (foreach) loop or a (for) loop to iterate through the data array as below methods */

    // Method-1: for each loops through each entry in the data array as key->vlue pairs and echo with line break
    // Note: This will not give you index for further referencing
    foreach($data as $key=>$value){
        echo $key.':'.$value.'<br />';
    }

    // Method-2: for loop 
    // Note: This will give you index (i) for reference if required
    for( $i=0; $i > $dataLength; $i++ ){
      $data['name'] = $_POST['name'];
      $data['surname'] = $_POST['surname'];
      $data['dob'] = $_POST['dob'];
    }

    // Print_r the array for debug only
    echo '<pre>'; print_r($data); echo '</pre>';  
?>
    <h3>Data received and processed through POST and PHP only</h3>

<!-- Note:
     You can post the same data even further to any HTML or PHP again if needed 
     using the POST and ACTION
 -->

    <form method="post" name="frmData" action="pass_data_further.php">
      Data of index <?php echo $i; ?> <br />
      <hr />
      Name:<textarea name="name"><?php echo $data['name'] ?></textarea>
      Surname:<textarea name="surname"><?php echo $data['surname'] ?></textarea>
      Date of birth:<textarea name="dob"><?php echo $data['dob'] ?></textarea>
      <br />
      <input type="submit" name="submit" value="Submit">
    </form>
<?php
}
?>