使用带有CodeIgniter的AJAX在单击复选框时更新数据库中的字段

使用带有CodeIgniter的AJAX在单击复选框时更新数据库中的字段,ajax,codeigniter,Ajax,Codeigniter,很久以前,我写了一个基于网络的配方管理程序。它是使用CodeIgniter(2)编写的。搜索或浏览时,配方显示在列表视图中,并且可以在编辑视图中打开,在编辑视图中可以输入/更改字段。我希望能够在列表视图中编辑一些配方信息,而无需打开编辑器窗口,进行更改,然后单击提交。这些更改只是设置或取消设置复选框。配方具有某些属性,如“新的”,或标记为“导出”,这些属性显示为复选框,经过适当身份验证的用户可以操作这些复选框 我找到了一些如何实现一个简单AJAX例程的代码示例。而且,直到最近我在最新的3.x版本

很久以前,我写了一个基于网络的配方管理程序。它是使用CodeIgniter(2)编写的。搜索或浏览时,配方显示在列表视图中,并且可以在编辑视图中打开,在编辑视图中可以输入/更改字段。我希望能够在列表视图中编辑一些配方信息,而无需打开编辑器窗口,进行更改,然后单击提交。这些更改只是设置或取消设置复选框。配方具有某些属性,如“新的”,或标记为“导出”,这些属性显示为复选框,经过适当身份验证的用户可以操作这些复选框

我找到了一些如何实现一个简单AJAX例程的代码示例。而且,直到最近我在最新的3.x版本中更新了CodeIgnitor,它才开始工作

我真的需要一些帮助来弄清楚如何让它再次工作。而且,甚至可以将数据库调用集成到基于CodeIgnitor的模型中,而不是作为CodeIgnitor框架之外的独立php脚本。而且,由于我在编码技能和JSON、AJAX等技术方面已经过时,我非常感谢没有从我的具体需求中抽象出来的具体帮助我曾看到其他帖子要求类似的帮助,但无法找出如何将其应用于我的情况

这就是我今天所拥有的不再有效的东西。这是添加到我想要此功能的页面上的HTML标题的脚本:

<script language="JavaScript"><!--  
function chkit(row, chk, field) {

   chk = (chk==true ? "1" : "0");
   var url = "http://localhost/recipes/check_validate.php?number="+row+"&chkYesNo="+chk+"&field="+field;

   if(window.XMLHttpRequest) {
      req = new XMLHttpRequest();
   } else if(window.ActiveXObject) {
      req = new ActiveXObject("Microsoft.XMLHTTP");
   }
   // Use get instead of post.
   req.open("GET", url, true);
   req.send(null);
}
//-->
</script>

如上所述,每个列出的配方都有几个与之相关的复选框。每个复选框的源代码如下所示:

<input type="checkbox" name="f_attribute6_1052" value="0"   onclick="chkit(1052, this.checked, 'attribute6');" />

因此,据我所知,当选中复选框时,会调用“chkit”javascript函数,并传递配方编号(本例中为1052)、复选框的状态(true或false)以及属性字段的名称(本例中为“attribute6”)

该脚本运行一个名为“check_validate.php”的php脚本。下面是代码:

<?php
// Would be nice to generalize this, even integrate with the recipe model code
$dbhost = 'localhost';   // usually localhost
$dbuser = 'username';      // database username
$dbpass = 'password';      // database password

$db = @mysql_connect($dbhost, $dbuser, $dbpass) or die ("Database connection failed.");

mysql_select_db('recipe_db');

// Get the variables.
$number = $_GET['number'];
$value = $_GET['chkYesNo'];
$field = $_GET['field'];

$sql = "UPDATE recipes SET $field = $value WHERE recipeNumber=$number";

mysql_query($sql) or die(mysql_error());

?>

现在,我知道有一个迫在眉睫的问题。由于我没有抽象这些DB调用,也没有直接使用mysql,所以需要做一些更改,以使用mysqli

最好是将最后一个php脚本移动到模型代码中的函数中,以摆脱非CodeIgnitor php脚本。而且,我知道我在HTML标题中使用的javascript非常陈旧、过时,而且不安全


记住,我不是一个训练有素的编码员,在这里需要人手;-)

我将check_validate.php更改为:

<?php
// Would be nice to generalize this, even integrate with the recipe model code
$dbhost = 'localhost';      // usually localhost, this mimics what is in the database config file
$dbuser = 'user';       // database username
$dbpass = 'pass';   // database password
$dbname = 'recipes';        // database name

$db = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

if ($db->connect_error) {
    trigger_error('Database connection failed: ' . $db->connect_error, E_USER_ERROR);
}

$number = $_GET['number'];
$value = $_GET['chkYesNo'];
$field = $_GET['field'];

$sql = "UPDATE recipes SET $field = $value WHERE recipeNumber=$number";

$rs=$db->query($sql);

if($rs === false) {
    trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $db->error, E_USER_ERROR);
} else {
    $rows_returned = $rs->num_rows;
}

?>

而且,它是有效的。我仍然在js控制台中遇到一些访问控制允许源错误,所以需要追踪这些错误。但是,功能恢复了,代码也恢复了原来的工作方式。因此,解决方案只是mysqli的一个正确实现,而不是mysql