Как передать переменную из JavaScript в PHP с помощью jQuery POST - PullRequest
0 голосов
/ 04 марта 2010

Я передаю переменную sessionnum из следующей функции Javascript на странице chat.php:

$(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;
        });
    });

К следующей функции PHP в backend.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);

Это работает только тогда, когда я жестко кодирую присвоение, такое как $tablename1 = 100 в backend.php, даже если переменная и ее значение являются целыми числами и имеют одно и то же значение. Этот хак неприемлем, так как мне действительно нужно передать переменную. Есть ли ошибка в моем коде?

Этот код адаптирован с http://articles.sitepoint.com/article/ajax-jquery/3

Спасибо за любую помощь, правильно разместившую переменную в jQuery.

Ответы [ 2 ]

2 голосов
/ 04 марта 2010

Попробуйте изменить переменные POST на $_POST['variable_name']. Вы используете синтаксис, который основан на том, что глобальные переменные зарегистрированы . Это функция, которая а) не включена по умолчанию и б) представляет серьезную угрозу безопасности, когда она включена. Таким образом, попробуйте изменить код на стороне сервера на:

$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 голос
/ 04 марта 2010

Казалось бы, вы полагаетесь на register_globals и ссылаетесь на то, что будет переменной POST в PHP, вместо ссылки на индекс $ _ POST superglobal , например,

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

Кроме того, вы должны действительно пересмотреть возможность использования имени таблицы в коде на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...