如何使用jQuery POST将变量从JavaScript传递给PHP

时间:2010-03-04 04:37:15

标签: php javascript jquery post

我从页面chat.php中的以下Javascript函数传递变量sessionnum

$(document).ready(function(){

        timestamp = 0;
        updateMsg();
        $("form#chatform").submit(function(){
            $.post("backend.php",{
                        message: $("#msg").val(),
                        name: author,
                        action: "postmsg",
                        time: timestamp,
                        tablename1: sessionnum
                    }, function(xml) {
                $("#msg").empty();

                addMessages(xml);

                document.forms['chatform'].reset()
                fixScroll();
            });
            return false;
        });
    });

到backend.php中的以下PHP函数:

if(@$action == "postmsg") {
    mysql_query("INSERT INTO `$tablename1` (`user`,`msg`,`time`)
                VALUES ('$name','$message',".time().")",$dbconn);
    mysql_query("DELETE FROM `$tablename1` WHERE id <= ".
                (mysql_insert_id($dbconn)-$store_num),$dbconn);
    }

$messages = mysql_query("SELECT user,msg
                         FROM `$tablename1`
                         WHERE time>$time
                         ORDER BY id ASC
                         LIMIT $display_num",$dbconn);

只有在我对backend.php中的$tablename1 = 100等赋值进行硬编码时才会起作用,即使变量及其值都是整数和相同的值。这个hack是不可接受的,因为我实际上必须传递变量。我的代码中有错误吗?

此代码改编自http://articles.sitepoint.com/article/ajax-jquery/3

感谢您使用jQuery正确地发布变量的任何帮助。

2 个答案:

答案 0 :(得分:2)

尝试将POST变量更改为$_POST['variable_name']。您使用的语法依赖于全局变量registered作为变量。这是一项功能,a)默认情况下未启用,b)启用时会产生重大安全风险。因此,请尝试将服务器端代码更改为:

$action = $_POST['action'];
$tablename1 = mysql_real_escape_string($_POST['tablename1']);
$name = mysql_real_escape_string($_POST['name']);
$message = mysql_real_escape_string($_POST['message']);

if(@$action == "postmsg") {
    mysql_query("INSERT INTO `$tablename1` (`user`,`msg`,`time`)
                VALUES ('$name','$message',".time().")",$dbconn);
    mysql_query("DELETE FROM `$tablename1` WHERE id <= ".
                (mysql_insert_id($dbconn)-$store_num),$dbconn);
    }

$messages = mysql_query("SELECT user,msg
                         FROM `$tablename1`
                         WHERE time>$time
                         ORDER BY id ASC
                         LIMIT $display_num",$dbconn);

请注意,为了防止某些SQL注入,您在SQL查询中使用的变量(用户可能会更改)已使用mysql_real_escape_string进行转义。

答案 1 :(得分:1)

看起来好像你依赖register_globals,并引用PHP中的POST变量,而不是引用$_POST superglobal索引,例如。

if ( $_POST['action'] == 'postmsg' ) {
    $name= mysql_real_escape_string( trim( $_POST['name'] ) );
    // query using $name reference
}

另外,您应该重新考虑允许在客户端代码中使用tablename。