在CodeIgniter中管理“发生数据库错误”1062错误

时间:2014-12-05 14:11:27

标签: php mysql codeigniter

我是CodeIgniter的新手,我开始探索CI功能,特别是在这种情况下,表格构造。我已经阅读了有关此内容的文档,并且我已经在网上搜索过,但没有找到解决方案。

主要的问题是,当我指定一个字段时,它的值必须是唯一的,如果我输入一个特定的值,那么一切都没问题,但如果我没有抓住一个&#34 ;发生数据库错误" 1062错误(重复输入"文本"密钥"密钥")。我以错误的方式做某事。

在这里,我将解释我的代码。在此之前,我已经读过,为了使用id_unique[tablename.tablefield],您必须先为该特定字段设置一个唯一的ID,这就是我所做的。

你能更好地向我解释一下发生了什么吗?

以下是模型中的功能:

function save_users() {

    $username = $_POST['username'];
    $password = $_POST['password'];
    $email = $_POST['email'];

    $sql = $this->db->query("INSERT INTO users (username, password, email) VALUES ('".$username."', '".$password."', '".$email."') ");
}

这是控制器:

public function index() {
    $this->load->helper(array('form', 'url'));

    $this->load->library('form_validation');

        $this->form_validation->set_rules("username","username","trim|required|xss_clean|callback_username_check");
    $this->form_validation->set_rules("password","password","trim|required|md5");
          $this->form_validation->set_rules("email","email","trim|required|valid_email|is_unique[users.email]");

    if ($this->form_validation->run() == FALSE)
    {
        $this->load->view('myform');
    }
    else
    {
        $this->load->view('formsuccess');
    }
}

public function username_check($str) {

    if ($str != "admin") {

        $this->load->model("new_model");            

        $this->form_validation->set_message("username_check", "The %s field cannot have username Test ");
        $this->form_validation->set_message("is_unique[users.email]","Errore!");

        $this->new_model->save_users();

        return FALSE;
    } else {
        return TRUE;
    }
}

1 个答案:

答案 0 :(得分:0)

我不是100%确定您需要什么,但我会对您的代码进行一些更改。 例如,回调。我不认为您应该从回调函数将用户添加到数据库中。

这应该在表单验证通过后完成。

我会改变你的控制器,对此;

public function index()
{
  $this->load->helper(array('form', 'url'));
  $this->load->library('form_validation');
  $this->load->model('new_model');

  $this->form_validation->set_rules('username' 'Username', 'trim|required|xss_clean|callback_username_check');
  $this->form_validation->set_rules('password' 'Password', 'trim|required|md5');
  $this->form_validation->set_rules('email' 'Email Address', 'trim|required|xss_clean|valid_email|is_unique[users.email]');

  if (!$this->form_validation->run())
  {
    $this->load->view('myform');
  }
  else
  {
    // Now we add the entry to the database
    if ($this->new_model->save_user())
    {
      echo 'user added!';
    }
    else
    {
      echo 'error within model';
    }
  }
}


public function username_check($username)
{
  if ($username == 'admin')
  {
    $this->form_validation->set_message('username_check', 'The %s cannot be "admin"');
    return false;
  }
  else
  {
    return true;
  }
}

我所做的是从回调函数中删除数据库条目,并将其移入索引函数,并在表单验证通过后运行。

这会解决您的问题吗?

现在运行该功能,会在模型"中说"错误,这是因为你的模型没有将任何东西返回给控制器。将save_user函数修改为此;

function save_users()
{
    $username = $_POST['username'];
    $password = $_POST['password'];
    $email = $_POST['email'];
    $sql = $this->db->query("INSERT INTO users (username, password, email) VALUES ('".$username."', '".$password."', '".$email."') ");
    return ($this->db->affected_rows() > 0) ? true : false;
}