我有一个编辑个人资料页面,其中有几个字段,其中的值是从数据库设置的(如果它不是NULL)。它看起来像这样:
<div class="form-group f-left p-t-2 p-x-1">
<div class="input-group">
<label for="nationality" class="input-group-addon">
Nationaliteit
</label>
<?php returnInputForm('nationality', 'nationality', $userinfo->nationality, 'Nationaliteit', 'form-control'); ?>
</div>
</div>
<div class="form-group f-left p-t-2 p-x-1">
<div class="input-group">
<label for="phone" class="input-group-addon">
Telefoon
</label>
<?php returnInputForm('phone', 'phone', $userinfo->phone, 'Telefoon / GSM', 'form-control'); ?>
</div>
</div>
然后在我的控制器方法中,我调用了一个我写的辅助函数:
$this->logmanager->createAdminEditVolunteerLog($userinfo, $userdata, $adminuserid, $userid);
$ userinfo是从x执行select *时的数据库的完整行,其中id = $ userid $ userdata是从他所在页面的表单提交的$ _POST数据。 请注意,$ userdata将始终包含比$ userinfo少的字段。
我在helper类中编写的函数如下所示:
public function createAdminEditVolunteerLog($dbrow, $submitted, $adminuserid, $userid)
{
if (!is_array($dbrow)) {
$dbrow = (array) $dbrow;
}
if (!is_array($submitted)) {
$submitted = (array) $submitted;
}
$difference = array_diff($dbrow, $submitted);
//Create a LOG entry
foreach ($difference as $key => $value) {
$entity = new stdClass();
$entity->admin_user_id = $adminuserid;
$entity->user_id = $userid;
$entity->field = $key;
$entity->prev_value = $dbrow[$key];
$entity->new_value = $value;
$entity->edit_date = date('Y-m-d H:i:s');
$this->CI->logAdminEditVolunteers_model->add($entity);
}
}
如果值已更改,则此功能非常完美!意思是,如果已经存在一个值并且它被修改为另一个值!
在以下2个案例中,没有记录任何内容: - $ dbrow中的原始值为空,但在$ submit中则不是 - $ dbrow中有一个值,但在$ submit中它是空的
如何确保记录最后2个案例?
编辑:我执行了以下测试方案:用户填写了电话号码,因此我删除了电话号码中的值并更改了名字,并在bank_account中添加了一个值,该值事先是空的。 $ dbrow看起来像这样:
D:\wamp\www\codeigniter\application\libraries\managers\LogManager.php:71:
array (size=46)
'user_id' => string '1' (length=1)
'national_number' => null
'first_name' => string 'Dennis123' (length=9)
'phone' => string '123' (length=3)
'bank_account' => string '' (length=0)
'bic_code' => string '' (length=0)
'address_line2' => string '123' (length=3)
'volunteer_location' => string 'Gentbrugge' (length=10)
'volunteer_location_lat' => null
'volunteer_location_long' => null
'volunteer_location_max_distance' => string '50' (length=2)
'national_number' => null
并且$ submit看起来像这样:
D:\wamp\www\codeigniter\application\libraries\managers\LogManager.php:72:
array (size=16)
'user_id' => string '1' (length=1)
'first_name' => string 'Dennis12' (length=8)
'phone' => string '' (length=0)
'bank_account' => string '123' (length=3)
'bic_code' => string '' (length=0)
$ difference数组(使用array_diff($ submitted,$ dbrow);)后如下所示:
D:\wamp\www\codeigniter\application\libraries\managers\LogManager.php:73:
array (size=2)
'first_name' => string 'Dennis12' (length=8)
'modified_at' => string '2018-01-02 19:55:27' (length=19)
我希望这个$ difference数组看起来像这样(所以添加了phone和bank_account因为它们被修改了,但是bic_code不是例如):
array (size=4)
'first_name' => string 'Dennis12' (length=8)
'modified_at' => string '2018-01-02 19:55:27' (length=19)
'phone' => string '' (length=0)
'bank_account' => string '123' (length=3)
答案 0 :(得分:0)
这是一个想法。你可以对这两个数组执行此操作,这样你就会有所不同。
将这些想法与其他数组进行比较并添加空白数据。
这样,数组中的键匹配,因此数组差异函数会得到差异。
if (!is_array($dbrow))
{
$dbrow = (array) $dbrow;
}
elseif (is_array($submitted))
{
$dbrow = array();
foreach ($submitted as $key => $value)
{
$dbrow($key) = "";
}
}