2009-08-24 66 views
0

所以我决定开始使用原型,这是我的第一个问题。我试图发送一个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 


?> 

任何人都看到任何失败的错误?

+1

在mysql_query()调用之后调用mysql_error()是否显示任何内容? – ceejayoz 2009-08-24 16:07:45

+2

顺便说一句,如果您看到$ sql返回,则问题不在Prototype中。 – ceejayoz 2009-08-24 16:09:04

+1

这不是一个答案,但你需要做更多的输入消毒,特别是使用最后的SQL查询。我会使用mysql_real_escape_string http://us.php.net/manual/en/function.mysql-real-escape-string.php来清理GET输入。 – Max 2009-08-24 16:12:07

回答

0

尝试回显您实际在mysql_query中运行的完全相同的SQL(将其存储在$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); 
+0

感谢您的建议jwheare。保存查询字符串并回显后,我在PhpMyAdmin中运行它,它工作正常。我会在下一个命令行尝试它... – danwoods 2009-08-25 13:25:02

0

找到了!不知何故,我在最终确定的$ trackname之前得到了额外的空间。 ltrim把它修好了。感谢大家,感谢那些提到安全功能的人。我一定会执行这些。 Dan