[英]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.