单击复选框,使用AJAX和CodeIgniter更新数据库中的字段

时间:2017-04-15 20:55:56

标签: ajax codeigniter

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

我找到了一些代码示例,说明如何实现一个简单的AJAX例程来执行此操作。而且,直到最近我更新了CodeIgnitor的最新版本3.x版本时才能正常工作。

我真的可以用一些帮助来弄清楚如何重新开始工作。而且,甚至可能将数据库调用集成到基于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());

?>

现在,我知道有一个直接的问题。由于我没有抽象出这些数据库调用并直接使用mysql,所以需要改变一些东西来改为使用mysqli。

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

请记住,我不是一个训练有素的编码员,需要在这里进行手工操作; - )

1 个答案:

答案 0 :(得分:0)

我将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控制台中收到一些Access-Control-Allow-Origin错误,因此需要跟踪它。但是,功能已恢复,代码可以像以前一样工作。所以,解决方案只是mysqli而不是mysql的正确实现。