很久以前我写了一个基于网络的食谱管理程序。它是使用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非常陈旧,过时且不安全。
请记住,我不是一个训练有素的编码员,需要在这里进行手工操作; - )
答案 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的正确实现。