SQL-запрос на Windows IIS Server 2003 разрывается с переданной переменной, jQuery AJAX - PullRequest
0 голосов
/ 23 июня 2010

Работая над текущим проектом, я столкнулся со странной проблемой.У меня есть HTML-страница, которая выполняет AJAX-вызов php-файла, передавая переменную.Файл php создает запрос SQL с использованием этой переменной, генерирует файл XML и возвращает результат.

На моем веб-сервере все это работает нормально.Однако при перемещении на IIS-сервер Windows 2003 (постоянный дом) происходит сбой.

Наблюдения до сих пор ... Это разрывает на сервере Windows:

$qry  = "SELECT * FROM structure_name WHERE ID = $variable ORDER by ID ASC";
$results = mysql_query($qry);

Этот разрыв на сервере Windows:

$variable = 5; 
$qry  = "SELECT * FROM structure_name WHERE ID = $variable ORDER by ID ASC";
$results = mysql_query($qry);

Это разрывает на сервере Windows:

$variable = 5; 
$qry  = "SELECT * FROM structure_name WHERE ID = " + $variable + "ORDER by ID ASC";
$results = mysql_query($qry);

Это работает:

$qry  = "SELECT * FROM structure_name WHERE ID = 5 ORDER by ID ASC";
$results = mysql_query($qry);

Таким образом, кажется, что сервер не любит переменную, чтобы бытьвключены в строку запроса.Есть предложения?

1 Ответ

0 голосов
/ 17 октября 2010

Какое сообщение об ошибке вы видите?Если вы не видите ошибку (или получаете ошибку HTTP 500), включите ошибки в файле PHP.ini или просмотрите журнал ошибок PHP.Это даст нам хорошее представление о том, что происходит не так.

Ваше третье утверждение имеет две проблемы, однако:

  1. Требуется пробел перед словом ORDER, в противном случае переменная $разбил его так: ГДЕ ID = 5ORDER мимо.
  2. Используется знак плюс, который является дополнением в PHP, а не конкатенацией.Вместо этого используйте точки / точки, чтобы объединить его в виде строки.

Это должно выглядеть следующим образом:

$variable = 5; 
$qry  = "SELECT * FROM structure_name WHERE ID = " . $variable . " ORDER by ID ASC";
$results = mysql_query($qry);

Другая идея: использовать профилировщик MySQL (http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html), чтобы увидеть, чтоВыражение SQL отправляется на ваш сервер MySQL. Возможно, ваш сервер MySQL генерирует ошибку. Вы также можете посмотреть, есть ли в MySQL журнал ошибок, вы можете проверить

Кроме того, вы можете избежать вводачтобы избежать атак с использованием SQL-инъекций, попробуйте использовать это:

$variable = 5;
$qry = sprintf("SELECT * FROM structure_name WHERE ID = %d ORDER by ID ASC",
    mysql_real_escape_string($variable));
$results = mysql_query($qry);

Для получения дополнительной информации об атаках MySQL-Query и SQL-инъекциях перейдите по следующим ссылкам:

...