2009-08-24 70 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