簡體   English   中英

可選表單字段和CodeIgniter中的更新

[英]Optional form fields and updating in CodeIgniter

我有一個編輯用戶信息表格,用戶可以在其中更改其電子郵件地址,電話號碼或密碼。 問題是這些更改中的一些應該是可選的。 假設用戶只想更改他/她的電子郵件,並將新密碼字段留空。 提交后,它只會影響並更新他/她的電子郵件,但現在它還會影響密碼字段並將其更新為空字段。

到目前為止,這是我所做的。

視圖:

<?php $this->load->helper('form'); ?>
<?php $attributes = array(
        'id' => 'update_user_form'
    );
?>

<?php echo form_open('users/edit_profile', $attributes); ?>

    <div class="loading_spinner" id="loading_spinner_add_user" style="display:none;"></div>
    <div class="login_error" id="new_user_error" style="display:none">
    <span class="close_error">&times;</span>
    </div>
    <div class="front_success" id="new_user_success" style="display:none"></div>

    <div class="rowi">

        <div class="rowi1">
        <label for="email">Sähköpostiosoite</label>
        <input type="email" name="email" value="<?=$userinfo['email']?>" />
        </div>

        <div class="rowi2">
        <label for="phone_number">Puhelinnumero</label>
        <input type="text" name="phone_number" value="<?=$userinfo['phone_number']?>"/>            
        </div>
    </div>

    <div class="rowi">
        <div class="rowi1">
        <label for="password">Uusi salasana</label>
        <input type="password" name="new_password" />
        </div>

        <div class="rowi2">
        <label for="new_password_again">Uusi salasana uudelleen</label>
        <input type="password" name="new_password_again" />
        </div>
    </div>

    <div class="rowi">
        <p>Vahvista mahdolliset muutokset kirjoittamalla salasanasi allolevaan tekstikenttään.</p>

       <div class="rowi1">
       <input type="password" name="password_to_confirm" placeholder="Salasana" />
       </div>

       <div class="rowi2">
       <input type="submit" name="update_info" value="Muokkaa tietojani" class="login_submit">
       </div>
    </div>

<?php echo form_close(); ?>

模型:

public function edit_user($data, $user_id) 
{
    $data = array(
        'email' => $data['email'],
        'phone_number' => $data['phone_number'],
        'password' => $data['new_password']
        );

        $this->db->where('id', $user_id);
        $this->db->update('users', $data);
}

控制器:

public function edit_profile()
{

   if(!$_POST)
   {
       return false;
   }

   $password_to_confirm = $this->input->post('password_to_confirm');
   $db_password = $this->user_model->password_db_check($this->session>userdata('user_id'));

        if(!$this->phpass->check($password_to_confirm, $db_password['password']))
        {

            $this->output->set_content_type('application_json');
            $this->output->set_output(json_encode(array('result'=>0, 'error' => 'Antamasi salasana ei täsmännyt käyttäjätunnuksesi salasanaan')));
            return false;
        }   

        $this->form_validation->set_rules('email', 'Sähköpostiosoite', 'valid_email|required');
        $this->form_validation->set_rules('phone_number', 'Puhelinnumero', 'min_length[7]|max_length[10]');
        $this->form_validation->set_rules('new_password', 'Salasana', 'matches[new_password_again]|min_length[8]');
        $this->form_validation->set_rules('new_password_again', 'Salasana', 'min_length[8]');

        $this->form_validation->set_message('min_length', '%s - kentässä on liian vähän merkkejä');
        $this->form_validation->set_message('matches', 'Uudet salasanat eivät täsmää');
        $this->form_validation->set_message('required', '%s - kenttä on pakollinen');
        $this->form_validation->set_message('is_unique', '%s on jo rekisteröity');

        if($this->form_validation->run() == FALSE)
        {
            $this->output->set_content_type('application_json');
            $this->output->set_output(json_encode(array('result'=>0, 'error' => $this->form_validation->error_array())));
            return false;

        }

        $edit_data = array();

           if($this->input->post('email')) 
                $edit_data['email'] = $this->input->post('email');

            if($this->input->post('phone_number'))
                $edit_data['phone_number'] = $this->input->post('phone_number');

            if($this->input->post('new_password'))
                $edit_data['new_password'] = $this->phpass->hash($this->input->post('new_password'));

        $edit_info = $this->user_model->edit_user($edit_data, $this->session->userdata('user_id'));


        if($edit_info)
        {

            $this->output->set_content_type('application_json');
            $this->output->set_output(json_encode(array('result'=>1, 'success' => 'Uusi käyttäjä lisätty')));

        } else {

            $this->output->set_content_type('application_json');
            $this->output->set_output(json_encode(array('result'=>0, 'error' => 'Tietojen päivittäminen epäonnistui')));
        }

 }

是否可以使用三元運算符或其他方法檢查字段是否為空,如果是,則更新部分應忽略空白字段。

編輯

實際上在寫上下文中未獲得該回報的唯一方法是:

if($this->input->post('email') != "")
{
    $update_data['email'] = $this->input->post('email');
}

if($this->input->post('phone_number') != "")
{
    $update_data['phone_number'] = $this->input->post('phone_number');
}
if($this->input->post('new_password') != "")
{
    $update_data['password'] = $this->input->post('new_password');
}

但是它仍然會更新所有字段,包括那些為空的字段。

答案是否定的。在這種情況下,您不能使用三元運算符。 如果使用三元運算符,請檢查以下代碼:

$edit_data['email'] = ($this->input->post('email') && !empty($this->input->post('email'))) ? $this->input->post('email') : NULL;

$edit_data['phone_number'] = ($this->input->post('phone_number') && !empty($this->input->post('phone_number'))) ? $this->input->post('phone_number') : NULL;

$edit_data['new_password'] = ($this->input->post('new_password') && !empty($this->input->post('new_password'))) ? $this->input->post('new_password') : NULL;


說明:

如果使用三元運算符,即使密碼為空,我們也將強制創建$edit_data['password']數據,這是我們不希望的。 如果用戶輸入密碼,則它將密碼存儲在$edit_data['password'] ,但是如果用戶將其保留為空白,則將空null存儲在$edit_data['password'] ,這又將保留空白字段更新。


解:

if-statement使用isset()empty()作為條件

if(!empty($this->input->post('new_password')))
{
    $edit_data['new_password'] = $this->input->post('new_password');
}


UPDATE

發送從控制器進行更新時使用的數組,並在查詢中直接使用它。 如果用戶輸入emailphone_number ,但不輸入new_password ,請檢查此選項

在控制器中

if($this->input->post('email') != "")
{
   $update_data['email'] = $this->input->post('email');
}

if($this->input->post('phone_number') != "")
{
   $update_data['phone_number'] = $this->input->post('phone_number');
}

if($this->input->post('new_password') != "")
{
   $update_data['password'] = $this->input->post('new_password');
}

$edit_info = $this->user_model->edit_user($edit_data, $this->session->userdata('user_id'));

// Since email, phone_number, password are the column names of the table
// you can directly use $update_data array in your query
// which prevent from inserting blank values in unfilled fields 

你的數組

Array(
[email] => abc@gmail.com
[phone_number] => 9999999999
)

在模型中

public function edit_user($data, $user_id) 
{
    $this->db->where('id', $user_id);
    $this->db->update('users', $data);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM