【问题标题】:How to pass variable from JavaScript to PHP using jQuery POST如何使用 jQuery POST 将变量从 JavaScript 传递到 PHP
【发布时间】:2011-01-23 12:44:24
【问题描述】:

我从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 正确发布变量。

【问题讨论】:

    标签: php javascript jquery post


    【解决方案1】:

    尝试将 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 进行了转义。

    【讨论】:

      【解决方案2】:

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

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

      顺便说一句,您应该重新考虑允许在客户端代码中使用表名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-16
        • 2014-06-28
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        相关资源
        最近更新 更多