Как передать переменную с JavaScript на PHP с помощью jQuery POST

Я передаю переменную 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.

Попробуйте изменить переменные POST на $_POST['variable_name'] . Вы используете синтаксис, который зависит от регистрации глобальных переменных в качестве переменных. Это функция, которая 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 .

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

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

В стороне, вы должны действительно пересмотреть возможность использования tablename в клиентском коде.