我有多个可能的用户通过AJAX从表单发布到我的PHP脚本。
在该脚本中,我有以下代码:
parse_str($_POST['users'], $useroutput);
foreach($useroutput as $key => $user){
// If both fields are filled in:
if(!empty($user['username']) OR !empty($user['password'])){
$userstring .= $user['username'].' '.$user['password'].'<br>';
}else{
echo 'Empty';
}
}
但是,上面的循环总是向我显示"空"。
虽然这是我的阵列打印时的样子:
[username] => Array
(
[0] => username
[1] => anotherusername
)
[password] => Array
(
[0] => password
[1] => anotherpassword
)
)
如何将我的数组更改为如下所示?
Array(
[0] => Array
(
[username] = myusername
[password] = mypassword
)
[1] => Array
(
[username] = anotherusername
[password] = anotherpassword
)
)
我已经尝试了不同的方法来发布数据,但直到现在还没有任何东西为我需要的数组提供它。
这是我如何将表单数据发布到我的 PHP 脚本中:
// Add/edit users script
$( "#companywrap" ).on("click", "#saveuser", function( event ) {
// Stop normal form behaviour
event.preventDefault();
var $form = $("#userform"),
postBody = $form.serialize(),
url = $form.attr( "action" );
var posting = $.post( url, {users: postBody});
// Show result in a div
posting.done(function( data ) {
$( ".resultmessageuser" ).empty().slideDown('fast').append( data );
});
});
我的表单标记符合要求:
<form id="userform" action="includes/userscript.php" method="post" enctype="multipart/form-data">
<div class="card m-b-20">
<div class="card-body">
<div class="form-group fieldGroup">
<div class="form-group row">
<label for="example-text-input" class="col-sm-4 col-form-label">Gebruikersnaam</label>
<div class="col-sm-8">
<input class="form-control" name="username[]" value="<?PHP echo $getcompany['username']; ?>" type="text" required>
</div>
</div>
<div class="form-group row">
<label for="example-text-input" class="col-sm-4 col-form-label">Wachtwoord</label>
<div class="col-sm-8">
<input class="form-control" name="password[]" placeholder="<?PHP echo $editpass; ?>" value='' type="text" required>
</div>
</div>
<div class="input-group-addon">
<a href="javascript:void(0)" class="btn btn-success addMore"><span class="glyphicon glyphicon glyphicon-plus" aria-hidden="true"></span> Extra gebruiker</a>
</div>
</div>
<!-- copy of input fields group -->
<div class="form-group fieldGroupCopy" style="display: none;">
<div class="form-group row">
<label for="example-text-input" class="col-sm-4 col-form-label">Gebruikersnaam</label>
<div class="col-sm-8">
<input class="form-control" name="username[]" value="" type="text" id="example-text-input">
</div>
</div>
<div class="form-group row">
<label for="example-text-input" class="col-sm-4 col-form-label">Wachtwoord</label>
<div class="col-sm-8">
<input class="form-control" name="password[]" placeholder="<?PHP echo $editpass; ?>" value='' type="text" id="example-text-input">
</div>
</div>
<div class="input-group-addon">
<a href="javascript:void(0)" class="btn btn-danger remove"><span class="glyphicon glyphicon glyphicon-remove" aria-hidden="true"></span> Verwijder velden</a>
</div>
</div>
</div>
</div>
</form>
我认为你应该从修改HTML的呈现方式开始。目前,您的form
按以下方式呈现:
<form>
<input type="text" name="username[]">
<input type="text" name="password[]">
<input type="text" name="username[]">
<input type="text" name="password[]">
<button type="submit">Submit</button>
</form>
当它被发送到PHP时,POST请求将像这样读取:
[
"username" => [
0 => "john"
1 => "jane"
]
"password" => [
0 => "pw1"
1 => "pw2"
]
]
但是,如果您将 HTML 更改为按如下格式设置:
<form>
<input type="text" name="credentials[0][username]">
<input type="text" name="credentials[0][password]">
<input type="text" name="credentials[1][password]">
<input type="text" name="credentials[1][password]">
<button type="submit">Submit</button>
</form>
那么 PHP 将看到这样的 POST 请求:
[
"credentials" => [
0 => [
"username" => "john"
"password" => "pw1"
]
1 => [
"username" => "jane"
"password" => "pw2"
]
]
]
修复 HTML 后,您只需进行细微的调整:
- 将
$.post( url, {users: postBody});
更改为$.post( url, postBody);
现在你可以使用你最初想要的 PHP 迭代,如下所示:
foreach($_POST['credentials'] as $credential){ if(!empty($credential['username']) || !empty($credential['password'])){ $userstring .= $credential['username'].' '.$credential['password'].'<br>'; }else{ echo 'Empty'; } }
你循环错误。
当您循环foreach($useroutput as $key => $user){
您将获得以下内容:
(
[0] => username
[1] => anotherusername
)
在这一点上,你没有任何$user['username']
你有$user[0]
和[1]
如果你这样做:
foreach($useroutput['username'] as $key => $val){
$users[] = array_combine(['username','password'],array_column($useroutput, $key));
}
Var_dump($users);
您的$users数组将在该阵列中工作,并将按预期对用户进行分组。
如果两个索引相遇,那么您可以尝试:
$new_array = [];
for($i = 0; $i < count($useroutput); $i++){
$new_array[] = ['username'=>$useroutput['username'][$i], 'password'=>$useroutput['password'][$i]];
}
$new_array
看起来像:
Array(
[0] => Array
(
[username] = myusername
[password] = mypassword
)
[1] => Array
(
[username] = anotherusername
[password] = anotherpassword
)
)
你们想太多了。输入错误,输出错误。您没有在 html 中命名键,这会导致枚举数组而不是关联数组。你不需要做复杂的php循环技巧来解释布局糟糕的表单标记,你只需要更正表单标记以按照你想要的方式嵌套。
这:
<input class="form-control" name="username[]" value="<?PHP echo $getcompany['username']; ?>" type="text" required>
需要这个:
<input class="form-control" name="users[]['username']" value="<?PHP echo $getcompany['username']; ?>" type="text" required>
而这个:
<input class="form-control" name="password[]" placeholder="<?PHP echo $editpass; ?>" value='' type="text" required>
需要这个:
<input class="form-control" name="users[]['password']" placeholder="<?PHP echo $editpass; ?>" value='' type="text" required>
这将在后端生成如下所示的数组:
print_r($_POST['users'];
array(
[0] => array(
'username' => 'some_username',
'password' => 'some_password'
)
);
不要聪明。保持简单。