PHP / Javascript - 发布具有唯一ID的数据

时间:2016-01-29 16:16:19

标签: javascript php jquery

我有一个带有add more按钮的动态表单,它创建了一个可用于导入数据的XML文件。

用户填写表单,可以单击更多以添加任意数量的表单。然后写入数据以通过fwrite创建文件。

问题是我使用了唯一的ID,我需要获取值才能创建文件。

这是javascript https://jsfiddle.net/jdarville/mbfjmd02/6/

$(document).ready(function() {

    Number.prototype.pad = function(size) {
      var s = String(this);
      while (s.length < (size || 0)) {s = "0" + s;}
      return s;
    }

    var max_fields      = 10; //maximum input boxes allowed
    var wrapper         = $(".input_fields_wrap"); //Fields wrapper
    var add_button      = $(".add_field_button"); //Add button ID

    var x = 1; //initlal text box count
    var c = 9;

    $(add_button).click(function(e){ //on add input button click
        e.preventDefault();
        if(x < max_fields){ //max input box allowed
            x++; //text box increment
            c++;
            $(wrapper).append('<div><label><span>Template Id :</span><input   type="text" name="templateid'+x+'" id="templateid'+x+'"></label><label><span>UNC Path :</span><input type="text" name="uncpath'+x+'" id="uncpath'+x+'"></label><label><span>Username :</span><input type="text" name="username'+x+'" id="username'+x+'"></label><label><span>Password :</span><input type="text" name="password'+x+'" id="password'+x+'"></label><label><span>Name :</span><input type="text" name="scantoname'+x+'" id="scantoname'+x+'"></label><a href="#" class="remove_field btn btn-primary">Remove</a></div>'); //add input box

            <!--add input value to "how many" field-->
            $.each($('input[name="howmany[]"]'), function() {
                $(this).val(x);
            });

            <!--add input value to "templateid" field-->
            $('input[name="templateid'+x+'"]').each(function() {
                $(this).val((x).pad(3,0));
            }); 
        }
    });

    $(wrapper).on("click",".remove_field", function(e){ //user click on remove text
        e.preventDefault(); $(this).parent('div').remove(); x--;
    })
});

如何在PHP中发布数据?我尝试了一堆东西,但它不起作用。 :(

$templateid = @$_POST["templateid'+x+'"];
$uncpath = @$_POST["uncpath'+x+'"];
$username = @$_POST["username'+x+'"];
$password = @$_POST["password'+x+'"];
$scantoname = @$_POST["scantoname'+x+'"];


$f_data= '<?xml version="1.0" encoding="UTF-8"?>
<JobTemplates>
<GroupList>
<Group gid="000">
<MetaData>
<groupName>Public Template Group</groupName>
<userName />
<isPasswordProtected>false</isPasswordProtected>
<ownerName>Admin</ownerName>
<notificationEmail />
<TemplateCount>'.$templateid.'</TemplateCount>
<TemplateCount>'.$uncpath.'</TemplateCount>
<TemplateCount>'.$username.'</TemplateCount>
<TemplateCount>'.$password.'</TemplateCount>
<TemplateCount>'.$scantoname.'</TemplateCount>';

最终目标是获取一个如下所示的文件:

<JobTemplates>
<GroupList>
<Group gid="000">
<MetaData>
<groupName>Public Template Group</groupName>
<userName />
<isPasswordProtected>false</isPasswordProtected>
<ownerName>Admin</ownerName>
<notificationEmail />
<TemplateCount>001</TemplateCount>
<TemplateCount>\\test\test</TemplateCount>
<TemplateCount>bill</TemplateCount>
<TemplateCount>pass</TemplateCount>
<TemplateCount>bill crab</TemplateCount>
<JobTemplates>
<GroupList>
<Group gid="000">
<MetaData>
<groupName>Public Template Group</groupName>
<userName />
<isPasswordProtected>false</isPasswordProtected>
<ownerName>Admin</ownerName>
<notificationEmail />
<TemplateCount>002</TemplateCount>
<TemplateCount>\\test\test2</TemplateCount>
<TemplateCount>Mike</TemplateCount>
<TemplateCount>pass</TemplateCount>
<TemplateCount>Mike crab</TemplateCount>';

3 个答案:

答案 0 :(得分:0)

嗯,您的HTML代码中没有表单标记,那么我认为您的PHP代码没有收到任何内容的问题。

创建一个表单标记,封装所有字段然后它应该有效。

我建议你删除那些&#34; @&#34;从您的POST阵列中,您可以看到您的表单提交给PHP的内容,或者即使正在提交某些内容。

<强>更新 就像enhzflep所说,你试图访问不存在的POST阵列上的密钥。 你为什么用:

@$_POST["templateid'+x+'"];

POST中使用的密钥应该与您的表单的输入名称完全相同。 如果您不确定名称是什么,请尝试使用

print_r($_POST); 

print_r($_GET); 

这样做,你会更好地了解正在发生的事情。

答案 1 :(得分:0)

这是一个完整的例子,扩展了我在评论中提到的内容。首先,请注意我在用户要求时创建一组新输入的非常不同的方式 - 我将它们全部添加为元素,而不是文本字符串。其次,我在数组中定义了我想要的字段 - 这使得添加或更改这些字段变得更快,更容易并且更不容易出错。

接下来,您可以查看是否检查了生成的html,输入只有名称,在这种情况下只需要给它们ID。

最后,您可以看到PHP只回显$ _POST数组的内容。

<强> blank.html

<!DOCTYPE html>
<html>
<head>
<script>
"use strict";
function byId(id){return document.getElementById(id);}
function newEl(tag){return document.createElement(tag);}
function newTxt(txt){return document.createTextNode(txt);}
window.addEventListener('load', onDocLoaded, false);

var nextIdToUseGlobal = 0;

function onDocLoaded()
{
    addFormElems( byId('fieldContainer'), nextIdToUseGlobal++ );
}

function addFormElems(fieldContainer, idToUse)
{
    var formItems = [
                        {type: 'input', name: 'ids[]', label: 'Template Id:'},
                        {type: 'input', name: 'uncs[]', label: 'Unc Path:'},
                        {type: 'input', name: 'usernames[]', label: 'Username:'},
                        {type: 'input', name: 'passwords[]', label: 'Password:'},
                    ];

    formItems.forEach( formElemForEachFunc );
    fieldContainer.appendChild( newEl('hr') );

    function formElemForEachFunc(elem, index, list)
    {
        var curField = newEl( elem.type );
        curField.setAttribute('name', elem.name);
        if (index == 0)                             // 0 since this is the index of the id field in the above array
            curField.value = idToUse;
        fieldContainer.appendChild( newTxt(elem.label) );
        fieldContainer.appendChild( curField );
        fieldContainer.appendChild( newEl('br') );
    }
}
</script>
<style>
</style>
</head>
<body>
    <button onclick='addFormElems(byId("fieldContainer"),nextIdToUseGlobal++)'>Add new Scan Item</button><br>
    <form id='myForm' action='outputTest.php' method='post'>
        <div id='fieldContainer'></div>
        <input type='submit' value='Submit values'/>
    </form>
</body>
</html>

<强> outputTest.php

<?php
    var_dump( $_POST );

    $numItems = count( $_POST["ids"] );     // get number of items in the ids array
    $ids = $_POST["ids"];
    $uncs = $_POST["uncs"];
    $users = $_POST["usernames"];
    $passwords = $_POST["passwords"];

    echo("<hr>");
    echo("You submitted $numItems items for scanning" . "<hr>");

    for ($i=0; $i<$numItems; $i++)
    {
        echo "ID: $ids[$i]" . "<br>";
        echo "UNC: $uncs[$i]" . "<br>";
        echo "username: $users[$i]" . "<br>";
        echo "password: $passwords[$i]" . "<br>";
        echo "<hr>";
    }
?>

答案 2 :(得分:0)

这是一种不同的方法,而不是使用javascript来生成数字值(+ x +),让我们只使用php来实现它,所以没有问题:

<?php

if(isset($_POST['submit'])){
foreach($_POST['howmany'] as $item_number){
  $item_number = $item_number;
}   

for($x=1;$x<=$item_number;$x++){
    echo $_POST["templateid".$x]; 
     echo '<br>';
}


 for($x=1;$x<=$item_number;$x++){
  echo $_POST["templateid".$x];  
  echo '<br>';
  echo $_POST["uncpath".$x]; 
   echo '<br>';
  echo $_POST["username".$x]; 
   echo '<br>';
  echo $_POST["password".$x]; 
   echo '<br>';
  echo $_POST["scantoname".$x]; 
   echo '<br>';
 }
}
?>