Я передаю переменную 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 в клиентском коде.