[英]How to merge two arrays
我有一个表格,并用它来更新用户个人资料。 问题是我不想强制所有字段,因此如果用户留下空白字段,那么已经存储在数据库中的值将更新为空白或空值。 因此,我决定查询数据库并获取一个已存储的值数组,然后从用户表单中获取一个值数组。 我需要以一种方式合并两个数组,以便在表单中插入新值时可以更新数据库字段,而在表单字段为空时保留旧数据库值。
我知道我可以使用数组做以下withut的操作,但是在这种情况下我不知道如何使用预处理语句
if(!empty($user_last))
$update_values[] = "user_last='".$user_last."'";
$update_values_imploded = implode(', ', $update_values);
if( !empty($update_values) ){
$q = "UPDATE users SET $update_values_imploded WHERE user_id='$userid' ";
$r = mysqli_query($conn,$q);
if($r){
$_SESSION['success_msg'] = 'profile updated!';
header("location: ../client_profile.php");
exit();
}
}
我尝试过的数组方法如下,但是它实际上不能正常工作。
$merged_array = array_unique(array_merge($database_rows, $form_data));
你还有其他建议吗? 非常感谢
这是带有from数组模拟的完整代码
$km_user_id= 2;
// this array comes from the form
$from_array = array(
'km_user_first_name' => 'Antonio',
'km_user_last_name' => 'Acri',
'km_user_address' => 'via pola',
'km_user_city' => 'roma',
'km_user_city_prov' => '',
'km_user_postcode' => '',
'km_user_email' => '',
'km_user_website' => 'url',
'km_user_telephone' => '123456',
'km_user_mobile' => '',
'km_user_fiscalcode' => '',
'km_user_document' => '',
'km_user_document_number' => '',
'km_user_document_exp' => '',
'km_user_birth_place' => '',
'km_user_birth_date' => ''
);
// select vakues from database
$query= "SELECT km_user_first_name, km_user_last_name, km_user_address, km_user_city, km_user_city_prov, km_user_postcode, km_user_email, km_user_website, km_user_telephone, km_user_mobile, km_user_fiscalcode, km_user_document, km_user_document_number, km_user_document_exp, km_user_birth_place, km_user_birth_date FROM km_users WHERE km_user_id= ?";
$stmt = mysqli_prepare($db_user_conn, $query);
mysqli_stmt_bind_param($stmt, 'i', $km_user_id);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
print_r($row);
?>
<br>
<br>
<?php
print_r($from_array);
?>
<br>
<br>
<?php
$result = array_merge($from_array, $row);
print_r($result);
您可以[km_user_address] => via pola
合并数组中的[km_user_address] => via pola
[km_user_address] => via roma 11
看到[km_user_address] => via roma 11
的值,应该是[km_user_address] => via pola
。
希望我能意识到您的问题(如果没有,请发表评论)。
如果希望将表单数组作为主要值,并且仅当其为空时才使用第二个数组中的值,则可以在array_filter
和array_merge
上使用组合。
考虑以下示例:
$form = array("km_user_first_name" => "Alice", "km_user_address" => "");
$row = array("km_user_first_name" => "Boby", "km_user_address" => "via pola");
$res = array_merge($row, array_filter($form));
这将输出:
Array
(
[km_user_first_name] => Alice
[km_user_address] => via pola
)
我知道我使用了PHP文档中所说的第二个form
数组(感谢@Nick):
如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个
希望有帮助!
您应该依靠准备好的语句。
仅将白名单用作动态SQL来构建列名。 过滤掉空字符串''
。 插入匿名准备语句参数?
并生成一个类型说明符字符串。 然后将值作为绑定参数传递。
这个应该可以工作(尚不能测试)。
<?php
declare (strict_types=1);
$km_user_id = 2;
// this array comes from the form
$form_array =
[
'km_user_first_name' => 'Antonio',
'km_user_last_name' => 'Acri',
'km_user_address' => 'via pola',
'km_user_city' => 'roma',
'km_user_city_prov' => '',
'km_user_postcode' => '',
'km_user_email' => '',
'km_user_website' => 'url',
'km_user_telephone' => '123456',
'km_user_mobile' => '',
'km_user_fiscalcode' => '',
'km_user_document' => '',
'km_user_document_number' => '',
'km_user_document_exp' => '',
'km_user_birth_place' => '',
'km_user_birth_date' => '',
];
$white_list =
[
'DEBUGkm_user_first_name' => true, // DEBUG TEST filter
'km_user_last_name' => true,
'km_user_address' => true,
'km_user_city' => true,
'km_user_city_prov' => true,
'km_user_postcode' => true,
'km_user_email' => true,
'km_user_website' => true,
'km_user_telephone' => true,
'km_user_mobile' => true,
'km_user_fiscalcode' => true,
'km_user_document' => true,
'km_user_document_number' => true,
'km_user_document_exp' => true,
'km_user_birth_place' => true,
'km_user_birth_date' => true,
];
// filter by whitelist and remove '' but NOT '0'
$non_empty = array_intersect_key(array_filter($form_array, function($v){return $v !== '';}), $white_list);
if(!empty($non_empty))
{
$cols = '`' . implode('` = ?, `', array_keys($non_empty)) . ' = ?';
$query = "UPDATE `users` SET $cols WHERE `user_id` = ?";
$values = array_values($non_empty);
array_push($values, $km_user_id);
$stmt = mysqli_prepare($db_user_conn, $query);
mysqli_stmt_bind_param($stmt, str_repeat('s', count($non_empty)).'i', ...$values);
mysqli_stmt_execute($stmt);
// TODO: error handling
}
km_user_first_name
不在白名单中,因此不应更新。 在测试时删除前缀DEBUG
。
我想用完全不同的方法提供第二个答案。
可能最好,最安全的方法是执行一个简单的静态预准备语句,并让空参数的处理达到SQL:
$sql_update = <<<_SQL_
UPDATE
`users`
SET
`km_user_first_name` = COALESCE(NULLIF(?, ''), `km_user_first_name` ),
`km_user_last_name` = COALESCE(NULLIF(?, ''), `km_user_last_name` ),
`km_user_address` = COALESCE(NULLIF(?, ''), `km_user_address` ),
`km_user_city` = COALESCE(NULLIF(?, ''), `km_user_city` ),
`km_user_city_prov` = COALESCE(NULLIF(?, ''), `km_user_city_prov` ),
`km_user_postcode` = COALESCE(NULLIF(?, ''), `km_user_postcode` ),
`km_user_email` = COALESCE(NULLIF(?, ''), `km_user_email` ),
`km_user_website` = COALESCE(NULLIF(?, ''), `km_user_website` ),
`km_user_telephone` = COALESCE(NULLIF(?, ''), `km_user_telephone` ),
`km_user_mobile` = COALESCE(NULLIF(?, ''), `km_user_mobile` ),
`km_user_fiscalcode` = COALESCE(NULLIF(?, ''), `km_user_fiscalcode` ),
`km_user_document` = COALESCE(NULLIF(?, ''), `km_user_document` ),
`km_user_document_number` = COALESCE(NULLIF(?, ''), `km_user_document_number` ),
`km_user_document_exp` = COALESCE(NULLIF(?, ''), `km_user_document_exp` ),
`km_user_birth_place` = COALESCE(NULLIF(?, ''), `km_user_birth_place` ),
`km_user_birth_date` = COALESCE(NULLIF(?, ''), `km_user_birth_date` )
WHERE
`user_id` = ?
;
_SQL_;
$stmt = $db_user_conn->prepare($sql_update);
mysqli_stmt_bind_param
(
$stmt, 'ssssssssssssssssi',
$form_data['km_user_first_name'],
$form_data['km_user_last_name'],
$form_data['km_user_address'],
$form_data['km_user_city'],
$form_data['km_user_city_prov'],
$form_data['km_user_postcode'],
$form_data['km_user_email'],
$form_data['km_user_website'],
$form_data['km_user_telephone'],
$form_data['km_user_mobile'],
$form_data['km_user_fiscalcode'],
$form_data['km_user_document'],
$form_data['km_user_document_number'],
$form_data['km_user_document_exp'],
$form_data['km_user_birth_place'],
$form_data['km_user_birth_date'],
$km_user_id
);
mysqli_stmt_execute($stmt);
为什么要创建另一个数组? 您可以真正编辑已经拥有的阵列。 例如:从数据库中获取索引数组。用值填充表单,以便用户可以看到旧信息。 当用户进行编辑时,说出他的名字myArray ['name'] = $_POST ['name']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.