【问题标题】:Insert New Row If Not Update如果不更新则插入新行
【发布时间】:2014-12-16 03:39:38
【问题描述】:

当我的用户在活动模型中登录时。如果用户在更新属于用户 ID 的行之前已经登录。否则应该插入行。

问题:目前它只更新与以前相同的行。如果用户 id 之前没有登录过,它应该插入一个新行。

如何解决模型问题。

<?php 

class Model_account_activity extends CI_Model {

  public function updateActivity($key, $data) {
      $data['user_id'] = $this->session->userdata('user_id');

      if (isset($data['user_id'])) {
         $user_id = $data['user_id'];
      } else {
         $user_id = 0;
      }

      $query = $this->db->query("UPDATE `" . $this->db->dbprefix . "user_activity` SET 
         `user_id` = '" . (int)$user_id . "', 
         `key` = " . $this->db->escape($key) . ", 
         `data` = " . $this->db->escape(serialize($data)) . ",
         `date_added` = NOW()
      ");

      if ($query == FALSE) {
        $this->addActivity();
        return true;
      } else {
        return false;
      }
   }

    public function addActivity($key, $data) {
      $data['user_id'] = $this->session->userdata('user_id');

      if (isset($data['user_id'])) {
         $user_id = $data['user_id'];
      } else {
         $user_id = 0;
      }

      $this->db->query("INSERT INTO `" . $this->db->dbprefix . "user_activity` SET 
         `user_id` = '" . (int)$user_id . "', 
         `key` = " . $this->db->escape($key) . ", 
         `data` = " . $this->db->escape(serialize($data)) . ",
         `date_added` = NOW()
      ");
   }
} 

【问题讨论】:

  • 你的意思是REPLACE INTO ... 吗?
  • 在我看来,您的 UPDATE 查询无论如何都会运行。条件应该在查询之前。你能提供更多信息吗?
  • 我还看到您在调用 addActivity 函数时缺少参数。你能提供更多信息吗?
  • 如果你使用 MySQL,你可以使用ON DUPLICATE KEY UPDATE。这会缩短你的代码。
  • @Diego Camacho 如果user id 在该表中不存在,它应该插入一个新行,否则这将是我想要实现的更新

标签: php codeigniter


【解决方案1】:

通过唯一的ID 或primary key 从DB 获取结果,然后检查查询结果。如果结果计数为0,则可以插入其他更新。示例...

$this->db->where('column_name', $user_id); //Unique column or primary_key .It may be $user_id
$query = $this->db->get('table_name');
if($query->num_rows == 0)
{
    //Insert query
}
else
{
    //Update query
}

【讨论】:

  • 您应该使用唯一的ID。 user_id 是唯一的还是 primary_key ?
  • activity_id 是主键叫什么
  • 检查您的更新query。您没有在更新query 中添加where 条件。结果所有rows 都更新了。
  • @Please Wait 根据您的建议,我能够让它发挥作用。
【解决方案2】:

感谢@Please Wait 现在一切正常,这就是我能够让它工作的方法。

<?php 

class Model_account_activity extends CI_Model {

  public function activity($key, $data) {
   $user_id = $this->session->userdata('user_id');

   $this->db->where('user_id', $user_id);
   $query = $this->db->get('user_activity');

   $data['user_id'] = $this->session->userdata('user_id');

   if (isset($data['user_id'])) {
      $user_id = $data['user_id'];
   } else {
      $user_id = 0;
   }

   if($query->num_rows() == FALSE) {

      $data = array(
        'user_id' => $user_id,
        'key' => $key,
        'data' => serialize($data),
        'date_added' => mdate('%Y-%m-%d %H:%i:%s', now())

      );
      $this->db->insert_id();
      $this->db->insert('user_activity', $data);

   } else {

      $data = array(
        'user_id' => $user_id,
        'key' => $key,
        'data' => serialize($data),
        'date_added' => mdate('%Y-%m-%d %H:%i:%s', now())

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2012-12-17
    • 1970-01-01
    • 2019-01-16
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多