PHP表单提交

时间:2011-10-02 11:43:07

标签: php jquery mysql ajax

我已经建立了迷你内容管理系统。在我的页面添加表单我正在使用 ckeditor 。对于文本命名内容

<textarea id="content" style="width:100%" name="content"></textarea>

使用以下php代码将表单中的所有数据添加到db表中。 (用于消毒数据的函数过滤器)

<?php
require '../../core/includes/common.php';

$name=filter($_POST['name'], $db);
$title=filter($_POST['title'], $db);
$parentcheck=filter($_POST['parentcheck'],$db);
if(isset ($_POST['parent'])) $parent=filter($_POST['parent'],$db);
else $parent=$parentcheck;  
$menu=filter($_POST['menu'], $db);
$content = $db->escape_string($_POST['content']);

if(isset($_POST['submit'])&&$_POST['submit']=='ok'){
$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$menu')") or die($db->error);
$new_id = $db->insert_id;
$result2=$db->query("INSERT INTO pages (id, title, content) VALUES ('$new_id', '$title', '$content')") or die($db->error);  
header("location:".$wsurl."admin/?page=add");       
}
?>

功能过滤器(数据清理)

function filter($data, $db)
{
    $data = trim(htmlentities(strip_tags($data)));
    if (get_magic_quotes_gpc())
    $data = stripslashes($data);
    $data = $db->escape_string($data);
    return $data;
}

我对此有疑问。 (我是ajax的新手。)


  1. 目前我正在使用标准php提交数据(页面刷新 每次)。如何修改ajax提交的代码?
  2. 我只有一个按钮来提交数据。我想创造第二个 按钮“保存”,它将通过ajax更新数据库字段
  3. 如何通过ajax创建自动保存功能(定期在后台保存表单并告知用户,就像在Stackoverflow上一样)?
  4. 提前谢谢

3 个答案:

答案 0 :(得分:3)

假设您想使用jQuery为您执行ajax业务,您需要在textarea中设置数据的定期POST(请注意,在某些浏览器中,GET请求有限制)。

在第一次POST时,您需要告诉PHP脚本“这是第一个POST”,以便它知道要插入数据,然后它应该返回给您一些识别特征。每次你发布数据时,你也应该发送这个识别特征,让我们只使用主键(PK)。当您发布数据+ PK时,PHP脚本应该对SQL运行更新查询。

构建这些时,需要考虑的是使用JavaScript从浏览器向PHP脚本发送数据。 PHP脚本只获取您发送的任何数据包,并且可以通过生成例如JSON来返回值。然后,您的JavaScript代码可以使用这些返回值来决定下一步该做什么。许多初学者经常犯错误,认为PHP可以调用JS,但实际上它是另一种方式,总是在这里开始使用JS。

在这种情况下,PHP将为您保存数据库中的数据,因此您需要将需要保存的所有数据发送到PHP。在JS中,这就像有一些你称之为“saveMyData”的魔术函数,在PHP中,它就像处理表单提交一样。

这方面的JavaScript看起来像这样(未经测试):

<script type="text/javascript">
    var postUpdate = function(postKey){
        postKey = postKey || -1;
        $.post("/myscript.php", 
               /* note that you need to send some other form stuff
                  here that I've omitted for brevity */
               { data: $("#content").value(), key: postKey }, 
               function(reply){
                   if(reply.key){
                       // if we got a response containing the primary key
                       // then we can schedule the next update in 1s
                       setTimeout(function(){postUpdate(reply.key);}, "1000");
                   }
               }
        });
    };
    // first invocation:
    postUpdate();
</script>

PHP方面看起来像这样(未经测试):

除此之外:filter的实施应使用mysql_real_escape_string()代替条带标记,mysql_real_escape_string将提供您所需的转义。

<?php
require '../../core/includes/common.php';

$name = filter($_POST['name'], $db);
$title = filter($_POST['title'], $db);
$parentcheck = filter($_POST['parentcheck'],$db);
if(isset($_POST['parent'])){
    $parent = filter($_POST['parent'],$db);
}else{
    $parent = $parentcheck;
}
$menu = filter($_POST['menu'], $db);
$content = $db->escape_string($_POST['content']);

$pk = intval($_POST['key']);

if($pk == -1 || (isset($_POST['submit']) && $_POST['submit']=='ok')){
    $result = $db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$menu')") 
              or die($db->error);
    $new_id = $db->insert_id;
    $result2 = $db->query("INSERT INTO pages (id, title, content) VALUES ('$new_id', '$title', '$content')") 
               or die($db->error);
    $pk = $db->insert_id;
    echo "{\"key\": ${pk}}";
    // header("location:".$wsurl."admin/?page=add");       
}else if($pk > 0){
     $result2 = $db->query("UPDATE pages SET content='$content' WHERE id='$pk')") 
               or die($db->error);
     echo "{\"key\": ${pk}}";
}

答案 1 :(得分:0)

对于AJAX,您可以使用jQuery's ajax API。这是非常好的,是跨浏览器。 对于保存和自动保存:您可以使用临时表来存储数据。当用户按下保存按钮或自动保存数据时,使用AJAX将数据保存到表中,并为新创建的行返回一个键。在将来的自动保存/保存按钮事件时,您使用AJAX更新临时表。

一句建议,使用PHP和Javascript框架。我个人使用Symfony和Backbone.js。 Symfony会自动检查CSRF和XSS,并且使用Doctrine也可以防止SQL注入。还有其他可用的框架(例如CodeIgniter,CakePHP等),但我认为Symfony是最好的。

编辑:对于自动保存功能,当页面第一次加载时,您可以使用Javascript SetTimeout调用您的AJAX保存功能。

答案 2 :(得分:0)

关于安全问题:

您的silver bullet功能存在根本缺陷,无法正常工作,无法正常工作,无法正常工作。

SQL具有与hmtl不同的转义需求 您使用的功能相互抵消。 escape_string添加\,stripslashes删除它们 不用担心功能的顺序,您需要使用专用转义功能,只有一个目的。
最重要的是,您正在使用折旧函数。

对于MySQL,这是mysql_real_escape_string请注意,escape_string (没有真实的)是折旧的,因为它不够彻底。请改用real_escape_string on mysqli escape_stringreal_escape_string的别名。

请参阅:
How does the SQL injection from the "Bobby Tables" XKCD comic work?
The ultimate clean/secure function