2014-01-14 75 views
2

我有一個問題,因爲在服務器端(當我通過AJAX發送給它時)總是缺少一個參數(超出2個)。Ajax/PHP/Json:一個GET參數丟失

我的JS代碼如下所示:

function import_websql(user_id) { 
    var db = openDatabase("database", "1.0", "table", 2*1024*1024); 
    var favourite_ids = ""; 

    if (window.openDatabase){ 
    db.transaction(
     function(t){ // This is the callback with "t" as the transaction object 
      t.executeSql('SELECT * FROM favourites', [], function (t, results) { 
       var len = results.rows.length, i; 
       for (i = 0; i < len; i++) { 
       favourite_ids += results.rows.item(i).id + "t"; 
       } 
      }); 
     }, onError, onReadyTransaction(user_id,favourite_ids) 
    ); 
    } else{ 
     alert("Your smartphone is too weird!"); 
    }; 
} 

function onReadyTransaction(user_id,favourite_ids) { 
    alert(favourite_ids); 
    send_websql(user_id,favourite_ids) 
} 

function onError() { 
    alert("error"); 
} 

function send_websql(user_id,favourite_ids){  
    $.ajax({ 
     url: 'fct.import_websql.php', 
     type: 'GET', 
     data: {user_id: user_id, favourite_ids: favourite_ids}, 
     dataType: 'json', 
     beforeSend: function(){ 

     }, 
     success: function(data) 
     { 
      if(data) { 
       alert(favourite_ids + "Worked!" + data); 
      } 
      else { 
       console.log("Error: " + data); 
      } 
     }, 
     complete: function(data){ 

     }, 
     error: function(xhr,textStatus,err) 
     { 
      console.log("readyState: " + xhr.readyState); 
      console.log("responseText: "+ xhr.responseText); 
      console.log("status: " + xhr.status); 
      console.log("text status: " + textStatus); 
      console.log("error: " + err); 
     } 
    }); 
} 

我的PHP樣子:

<?php 
include_once('database_connect.php'); 
include_once('clean.php'); 

$user_id = clean($_GET['user_id']); 
$favourite_ids = clean($_GET['favourite_ids']); 

$favourite_ids_arr = explode('t', $favourite_ids); 
array_pop($favourite_ids_arr); 

foreach ($favourite_ids_arr as &$favourite_id) { 
    $sql = "INSERT INTO map_favourite_user_bookmark (map_favourite_user_bookmark_favourite_id, map_favourite_user_bookmark_user_id) VALUES ($favourite_id, $user_id)"; 
    $result = mysql_query($sql) or die(mysql_error()); 

    $sql = "UPDATE user_info SET user_websql_imported = 1 WHERE user_id = $user_id)"; 
    $result = mysql_query($sql) or die(mysql_error()); 
} 

$response = "ok" . $favourite_ids; 
echo json_encode($response); 

?> 

「搞笑」的事情是,在JS端之前,我發送數據所需的一切存在(並會是alerted),但在PHP方面favourite_ids完全缺失(不能echo他們,不能處理他們,他們不會被退回......就像他們不存在)。

我在做什麼錯了?

+1

$ recipe_ids \ $ favourite_ids搞砸了變量重命名 – 2014-01-14 20:18:13

+0

正確**爲什麼**你是否在用't'分隔的字符串時,你可以很容易地發送一個json編碼的ARRAY給客戶端?這會消除任何需要構建字符串/爆炸的需求,加上你的字符串自然包含't'的機率,這會導致爆炸將錯誤的位置分解。 –

+0

@Dagon謝謝你,但我最近改變了他們。在我的代碼中,它們都具有相同的變量名稱,這不是問題! –

回答

1

你的問題是數據庫API是異步的,所以你會在數據庫事務尚未完成時執行你的ajax調用。

解決它的一種方法是將ajax調用放入查詢函數的回調函數中。

+0

謝謝。我更新了我提出的問題,但是現在它已經失去了JS端的'favourite_ids' ... –

+0

@JohnBrunner這聽起來像是一個錯誤,你會在控制檯中看到任何消息。這也有助於在原代碼下發布修改後的代碼。 – jeroen

+1

問題是我的'onReadyTransaction'比'sql'函數中'for'循環之後的代碼快。我現在在'executeSql'的'for'循環之後做了一個函數調用,現在一切正常!謝謝你的評論! –