Php 当使用CodeIgniter自动保存数据时,其他部分正在工作

Php 当使用CodeIgniter自动保存数据时,其他部分正在工作,php,mysql,codeigniter,codeigniter-3,Php,Mysql,Codeigniter,Codeigniter 3,我有30多个字段,我正在尝试将数据自动保存到数据库中 我可以在数据库中插入数据,但它一直在插入。它没有更新最后一条记录。它没有检查其他部分 我正在获取stud\u id的总计数,并在stud\u id的帮助下更新记录。这是个好主意吗 public function student_autosave($data){ $sql_count_id="SELECT COUNT(stud_id) FROM student_info"; $q = $this->db->query

我有30多个字段,我正在尝试将数据自动保存到数据库中

我可以在数据库中插入数据,但它一直在插入。它没有更新最后一条记录。它没有检查其他部分

我正在获取
stud\u id
的总计数,并在
stud\u id
的帮助下更新记录。这是个好主意吗

public function student_autosave($data){
    $sql_count_id="SELECT COUNT(stud_id) FROM student_info";
    $q = $this->db->query($sql_count_id);
    $last_count=$q->num_rows();
    if ($last_count == 1) {
        $this->db->insert('student_info',$data);
    }else{
        $query = $this->db->where(['stud_id'=>$last_count])->update('student_info',$data);
        if($this->db->affected_rows()>0){
            return 1;
        }else{
            return 0;
        } 
    }
} 
自动保存脚本

$(document).ready(function() {
    timePicker(10);
});

var s;
function timePicker(vr) {
    if (vr > 0) {
         if (vr > 1) {
             $('#timer').html('Data will be updated in next '+ vr+' secounds');
         } else {
             $('#timer').html('Data will be updated in next 1 secound');
         }
         vr--;
         s = setTimeout('timePicker(' + vr + ')', 1000);
     } else {
         clearInterval(s);
         $.ajax({
             type: 'post',
             url: '<?php echo base_url("index.php/Student_controller/student_data_autosave"); ?>',
             data: $('form[name="student_formname"]').serialize(),
             success: function (data) {
                 s = setTimeout('timePicker(' + 10 + ')', 5000);
                 return false;
             }
         });
     }
 }
$(文档).ready(函数(){
计时器选择器(10);
});
var s;
功能时间选择器(vr){
如果(vr>0){
如果(vr>1){
$('#timer').html('数据将在下一个'+vr+'secounds'中更新');
}否则{
$('#timer').html('数据将在下一秒更新');
}
虚拟现实--;
s=setTimeout('timePicker('+vr+'),1000);
}否则{
净空间隔;
$.ajax({
键入:“post”,
url:“”,
数据:$('form[name=“student\u formname”]')。序列化(),
成功:功能(数据){
s=setTimeout('timePicker('+10+'),5000);
返回false;
}
});
}
}

对此,我的新答案是:重新设计流程

  • 除非在每次新页面加载时为新用户生成唯一的表单id,否则您将无法自信地区分不同的用户。此外,如果用户在表单中间发生了一些事情,并且表单id“丢失”,那么用户将不得不重新开始,因为下次加载表单时,它将有一个新的随机生成的id。(好吧,更深层的事实是,当出现问题时,您可能会找到保留表单id的方法,但这是一个不必要的复杂过程)
  • 使用计时器自动保存是一项不必要的功能,并且肯定会导致对服务器/数据库的浪费/不需要的调用。想象一下,有人开始填表格,上厕所,喝咖啡,打电话给亲戚,不得不去学校接孩子,记得杂货店需要一些东西。。。你明白了。同时,您的页面会一次又一次地自动保存。把这个僵尸放在跑步机上绝对没有好处
当我移民到澳大利亚时,我不得不在网上填写政府表格。表格很长。他们做了明智的事;他们将表格分成5-7个问题/字段,并提供返回/下一步按钮。每次我点击其中一个按钮,我的进度就被保存了下来。这并不是一次可怕的笨拙经历,事实是,我确实需要走开或打电话来检索表单中的一些个人信息。一旦我提交了一个电子邮件地址,这些表单就会被分配一个永久链接(该链接会尽快通过电子邮件发送给我),这样即使我断开了连接,我也可以从我中断的地方重新开始

根据这个故事,我的建议是:

  • 表单的第1页必须是最低限度的联系信息,以便您的程序可以为每个新用户分配一个id(自动递增主键)
  • 因为我建议您通过电子邮件向用户发送永久链接,您可以通过使用它来验证用户是否实际使用了真实的电子邮件以及他们是否可以访问,从而使您的收益加倍。这意味着他们将输入自己的姓名、电子邮件和密码,当用户收到您的自动电子邮件时,表单将暂停,他们单击永久链接,自动将他们放置在需要继续的页面上,您将得到注册(可能)合法的确认
  • 每次用户单击“上一步”/“下一步”,都会更新数据库。您可以使用ajax实现这一点,也可以使用纯html/php以简单/老式的方式提交页面
  • 无论用户的速度有多慢,或者如果他们遇到崩溃/断开连接,您的程序都不会执行任何无意识的调用,您甚至可以构建一些非常必要的验证和检查点

最后,在查询中使用数据之前,请始终清理和验证用户提交的所有内容——可能永远都是这样。

我的新答案是:重新设计流程

  • 除非在每次新页面加载时为新用户生成唯一的表单id,否则您将无法自信地区分不同的用户。此外,如果用户在表单中间发生了一些事情,并且表单id“丢失”,那么用户将不得不重新开始,因为下次加载表单时,它将有一个新的随机生成的id。(好吧,更深层的事实是,当出现问题时,您可能会找到保留表单id的方法,但这是一个不必要的复杂过程)
  • 使用计时器自动保存是一项不必要的功能,并且肯定会导致对服务器/数据库的浪费/不需要的调用。想象一下,有人开始填表格,上厕所,喝咖啡,打电话给亲戚,不得不去学校接孩子,记得杂货店需要一些东西。。。你明白了。同时,您的页面会一次又一次地自动保存。把这个僵尸放在跑步机上绝对没有好处
当我移民到澳大利亚时,我不得不在网上填写政府表格。表格很长。他们做了明智的事;他们将表格分成5-7个问题/字段,并提供返回/下一步按钮。每次我点击其中一个按钮,我的进度就被保存了下来。这并不是一次可怕的笨拙经历,事实是,我确实需要走开或打电话来检索表单中的一些个人信息。一旦我提交了一个电子邮件地址,这些表单就会被分配一个永久链接(该链接会尽快通过电子邮件发送给我),这样即使我断开了连接,我也可以从我中断的地方重新开始

根据这个故事,我的建议是:

  • 表格的第1页必须是最低限度的联系信息
    $sql_count_id="SELECT COUNT(stud_id) as count FROM student_info";
    
    // perform your query,
    $q = $this->db->query($sql_count_id);
    
    // if there were rows returned and
    if($q->num_rows() ){
    
           // count ==1 then
           if($q->row()->count == 1){
    
                 // perform your insert
    
           }else{
    
                // perform your update
            } 
    }else{
         // something went wrong with your query
        // should return atleast 1 even if count is zero
    }