прототип ajax неправильно выполняет запрос

Итак, я решил начать использовать прототип, и вот мой первый вопрос. Я пытаюсь отправить запрос ajax на php-страницу, которая обновляет единственную запись. Когда я делаю это вручную (т.е. ввожу адрес + параметры, он работает нормально, но когда я использую этот код из javascript:

var pars = 'trackname=' + track + '&tracktime=' + time;

new Ajax.Request('php/setSongTime.php', {
method: 'get',
parameters: pars,
onSuccess: function(transport){
  var response = transport.responseText || "no response text";
  alert("Success! \n\n" + response);
  },
onFailure: function(){ alert('Something went wrong...') }

OnSuccess срабатывает и отображает правильную информацию из php, но обновление не выполняется. php возвращает строку UPDATE, поэтому я проверяю параметры, и они выглядят нормально. Кто-нибудь видит проблему? Спасибо...

Всего JavaScript:

/*This file handles all the user-based computations*/

//variable declarations to be used throughout the session
var untimedSongArray = [];

function beginProcess(){

new Ajax.Request('php/getUntimed.php', {
method: 'get',
onSuccess: function(transport){
  var response = transport.responseText || "no response text";
  untimedSongArray = response.split("+");  
  alert(response);
  getFlashMovie("trackTimer").timeThisTrack(untimedSongArray[0]); 
  //alert("Success! \n\n" + response);
  //var html = response;
  },
onFailure: function(){ alert('Something went wrong...') }

});
}

function getFlashMovie(movieName) {
  var isIE = navigator.appName.indexOf("Microsoft") != -1;
  return (isIE) ? window[movieName] : document[movieName];  }

function setSongTime(track, time){
  alert("track " + track + " has a time of " + time);
  //$.get("php/setSongTime.php", { trackname: track, tracktime: time } );
  var pars = 'trackname=' + track + '&tracktime=' + time;

  new Ajax.Request('php/setSongTime.php', {
  method: 'get',
  parameters: pars,
  onSuccess: function(transport){
    var response = transport.responseText || "no response text";
    alert("Success! \n\n" + response);
    },
  onFailure: function(){ alert('Something went wrong...') }
  });
}

Общий php-код:

<?php

//turn on error reporting
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);
//header('Content-Type: text/xml');

/////////////Main script
//pull variables
//need to do some error checking here
$trackname = ($_GET['trackname']);
$tracktime = ($_GET['tracktime']);

//remove leading track information
$trackname = str_replace('../music_directory/moe/moe2009-07-18/', '', $trackname);
$trackname = str_replace('.mp3', '', $trackname);
//echo $trackname;

//connect with database
$con = mysql_connect("localhost","root","");
if(!$con){
  die('Could not connect: ' . mysql_error());
}

mysql_select_db("musicneverstopped", $con);
//end connecting to database

//////////////////////////////////////////

//update given song time
$sql = "UPDATE songs SET length = ".$tracktime." WHERE unique_song_id = ".$trackname;
echo $sql;
mysql_query("UPDATE songs SET length = '$tracktime' WHERE unique_song_id = '$trackname'");

//error check
//if(!$attempt){
//die(mysql_error());
//}

//////////////////////////////////////////

//close database connection
mysql_close($con);//close mysql connection


?>

Кто-нибудь видел какие-либо ошибки?


person danwoods    schedule 24.08.2009    source источник
comment
Показывает ли что-нибудь вызов mysql_error() после вызова mysql_query()?   -  person ceejayoz    schedule 24.08.2009
comment
Между прочим, если вы видите, что $sql возвращается, проблема не в Prototype.   -  person ceejayoz    schedule 24.08.2009
comment
Это не ваш ответ, но вам нужно больше очищать ввод, чем вы, особенно с последним SQL-запросом. Я бы использовал mysql_real_escape_string us.php.net/manual/ en/function.mysql-real-escape-string.php для очистки ввода GET.   -  person Max    schedule 24.08.2009
comment
@ceejayoz изменил код на: mysql_query(UPDATE song SET length = '$tracktime' WHERE unique_song_id = '$trackname'); эхо mysql_error(); Без изменений и без сообщения об ошибке   -  person danwoods    schedule 24.08.2009


Ответы (2)


Попробуйте повторить тот же самый SQL, который вы на самом деле запускаете в mysql_query (сохраните его в $sql, а затем передайте его в запрос, вместо того, чтобы записывать запрос дважды).

Затем попробуйте запустить запрос, который отображается в ответе непосредственно в командной строке mysql на вашем сервере, и посмотрите, что произойдет.


Кроме того, просто чтобы повторить Максу важность экранирования ваших SQL-запросов, я бы добавил к очистке ввода, что вы должны использовать переменные связывания в своем запросе, а не просто объединять ваш пользовательский ввод с остальной частью SQL.

Что-то вроде этого гарантирует, что ваши переменные будут соответствующим образом экранированы, чтобы избежать атаки SQL-инъекции.

$sql = "UPDATE songs SET length = '%s' WHERE unique_song_id = '%s'";
$query = sprintf(
    $sql,
    mysql_real_escape_string($tracktime),
    mysql_real_escape_string($trackname)
);
mysql_query($query);
person James Wheare    schedule 25.08.2009
comment
Спасибо за совет jwheare. Сохранив строку запроса и повторив ее, я запустил ее в PhpMyAdmin, и все заработало нормально. Я попробую это в командной строке дальше... - person danwoods; 25.08.2009

Нашел! Каким-то образом я получил дополнительный пробел перед завершенным $trackname. ltrim все исправил. Спасибо всем и спасибо тем, кто упомянул функции безопасности. Я обязательно их реализую. Дэн

person danwoods    schedule 25.08.2009