【发布时间】:2010-12-23 20:14:31
【问题描述】:
我不明白为什么这个脚本不起作用。它与 AJAX POST 脚本/函数中的某些内容有关。现在,当我在表单上点击提交时,它会在同一页面上运行 php 代码。它应该做的是将表单的值发送到 project_ajax.php,然后在页面将返回一个成功的 var,它是 true 或 false。
$(document).ready(function () {
$('div#didIt').hide();
$('form[name=adminForm]').submit(function () {
$.post('/project_ajax.php', {
action: $('[name=action]').val(),
pId: $('[name=pId]').val(),
name: $('[name=name]').val(),
url: $('[url=url]').val(),
summary: ('[summary=summary]').val()
}, function (data) {
if (data.success) {
$('div#didIt').slideDown('slow');
} else {
alert('Failed SA!');
}
}, 'json');
return false;
});
});
下面是 project_ajax.php 的代码...
if($_POST['action'] == "update") {
//Prep the field for Query Entry!-----------------------------------
$pId = $_POST['pId'];
$name = trim(mysql_prep($_POST['name']));
$status = 1;
$url = trim(mysql_prep($_POST['url']));
$tumb = false; //False because I still need to make a script for it.
$summary = trim(mysql_prep($_POST['summary']));
$creater = $_SESSION['userId'];
$created = date("Ymd");
$q = "UPDATE " . DB_NAME . ".`projects` SET
name = '{$name}',
status = '{$status}',
url = '{$url}',
summary = '{$summary}',
creater = '{$creater}',
created = '{$created}'
WHERE `projects`.`id` = {$pId}";
$r = mysql_query($q, $connection);
if ($r) {
//Successful
$data['success'] = true;
$date['error'] = false;
$date['message'] = "You are the Greatest!";
} else {
//Fail
$data['success'] = false;
$data['error'] = true;
$date['message'] = "You can't do it fool!";
}
} else {
$data['success'] = false;
$date['error'] = true;
$data['message'] = "You Failed Stupid!";
}
echo json_encode($data);
注意:加载此页面时。浏览器永远不会真正完成加载。 IE8 中标题选项卡上的蓝环旋转,好像页面永远不会完成加载。
【问题讨论】:
-
你在其他浏览器中测试过吗?可能是它只在 IE8 中失败。还要检查是否有任何导致代码失败的 JavaScript 错误(例如语法错误或未定义的内容等)。检查 jQuery 选择器是否选择了正确的表单。
-
您的 PHP 代码看起来很容易受到 SQL 注入攻击。猜猜如果用户发送一个带有值
123; DROP TABLE some_table的pId会发生什么。有关问题的描述和 PHP 的几种解决方案,请参阅en.wikipedia.org/wiki/SQL_injection -
好吧,我相信我的代码很容易发生 SQL 注入。但是我不相信“pId”是一个。只是因为 pId 是从数据库中提取的隐藏值。除非用户可以更改隐藏值?他们可以更改隐藏的值吗?
-
您将一个值从
$_POST分配给$pId,而无需对其进行转义或类型转换。如果projects.id是一个整数,您可以将它转换为一个int ($pId = (int) $_POST['pId'];)。但$pId并不是唯一的问题,所以我的建议是远离mysql_*函数并使用支持准备好的语句的PDO (php.net/manual/en/book.pdo.php) 之类的东西。 -
并回答您评论中的问题:是的,用户可以在将隐藏值发送到您的服务器之前更改它们。基本上,来自用户的所有内容都应被视为潜在的恶意数据。我们生活在一个丑陋的世界......
标签: php jquery mysql ajax post