2013-12-09 29 views
0

我無法使用解碼的json數組運行此函數。 例如,我試圖用PDO準備語句獲取數組: *注意:$user與解碼的json數組一起傳遞。PDO fetchAll,獲取並將其與解碼的JSON數組一起使用

public function get_pagnated_qs($user){  
     ////////////////////////Actual 
     $sth = $this->dbh->prepare("SELECT a.quest_id, a.quest_title, a.quest_desc, b.qcat_name,c.qtype_title FROM eq_question_s AS a INNER JOIN eq_question_category AS b ON a.qcat_id = b.qcat_id INNER JOIN eq_question_type AS c ON a.qtype_id=c.qtype_id ORDER BY quest_id LIMIT ?, ?"); 
     $sth->execute(array($user->start, $user->per_page)); 
     $result = json_encode($sth->fetchAll()); 
     return $result; 
} 

它不會產生對象(我發現,當我呼應javasccript側的對象。

在另一方面,如果我與實際數量代替兩個?(即0,3),那麼一切都將工作完美。

功能是作爲編碼的JSON返回$結果返回給客戶端處理和格式轉換成表格。

我不知道這段代碼有什麼錯?

讓我們假設我已經正確解碼了json數組作爲對象,否則會有太多的代碼讓我們感到沮喪。

也許只是一些見解將有所幫助,但我不想挫敗任何人。

客戶端JS其採取的實際回報和產生形式(部分功能)是:

function showListOfPaginatedQuestions(jsonData) { 
    alert('pagED RAN!'); 
    alert(jsonData); 
    console.log(jsonData); 
    var table = '<table width="600" cellpadding="5" class="table table-hover table-bordered"><thead><tr><th scope="col">Category</th><th scope="col">Type</th><th scope="col">Question</th><th scope="col">Question Description</th><th scope="col"></th></tr></thead><tbody>'; 

    $.each(jsonData, function(index, user){  
     table += '<tr>'; 
     table += '<td class="edit" field="qcat_id" user_id="'+user.quest_id+'">'+user.qcat_name+'</td>'; 
}); 
$('div#content').html(table); 
} 

謝謝

+1

你可以試試'的​​var_dump($用戶)'當與'start'一個對象,'per_page'比沒關係,否則還有另一個問題。 – Haneev

+1

你應該永遠不要假設你的查詢有效。你應該a)在調用prepare()後確認'$ sth'實際上包含了一個有效的'PDOStatement'對象b)當你調用execute()時,驗證'fetchAll()'不返回'false'c)處理所有的錯誤條件,當代碼不在快樂的路徑上時 - 記錄錯誤,以便您可以看到問題所在。 –

+0

哼哼......真的有可能綁定'?'到SQL的LIMIT參數?我認爲這只是變量。如果這是真的,那麼你的查詢不可能用兩個數據發回任何數據?代替LIMIT分隔符 –

回答

1

有你要了解有關準備語句的東西。人物 '?'不是簡單的佔位符,而是指查詢的實際參數,例如條件或值。問題的關鍵是,當MySQL的準備查詢時,它知道,當查詢將被實際執行,病情會去這裏或值將被更新的東西:

$stmt = $db->prepare("SELECT * FROM table WHERE column=?"); 
$stmt = $db->prepare("UPDATE table SET column=? WHERE keyColumn=?"); 

這些都是正確的陳述,可以準備和理解。但那些?不是簡單的變量,爲例,你不能這樣做:

$stmt = $db->prepare("SELECT * FROM ? Where column='1726'"); 

它們的參數,如在PHP $whatever沒有變,他們不是簡單地通過你給他們任何值代替(SQL注入仍然是一個巨大的問題)SQL將它們視爲參數,並且它們有特定的地方可以使用它們,LIMIT?,?是不是其中之一,遺憾的是:對

只是將它們分配給變量之前:

public function get_pagnated_qs($user){  
     ////////////////////////Actual 
     $start = $user->start; 
     $perPage = $user->per_page; 
     $sth = $this->dbh->prepare("SELECT a.quest_id, a.quest_title, a.quest_desc, b.qcat_name,c.qtype_title FROM eq_question_s AS a INNER JOIN eq_question_category AS b ON a.qcat_id = b.qcat_id INNER JOIN eq_question_type AS c ON a.qtype_id=c.qtype_id ORDER BY quest_id LIMIT $user, $perPage"); 
     $sth->execute(); 
     $result = json_encode($sth->fetchAll()); 
     return $result; 
} 
+0

你剛剛解決了我沮喪的6小時......真誠地感謝你!順便說一下,你如何對PDO有如此深刻的理解?我應該從哪裏開始更好地理解它?有什麼來源是好的嗎?我的意思是,比php官方網站上的pdo文件更好? – Ezeewei

+0

我閱讀了關於mysql開發人員的PDO教程http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers它真的有關於準備語句,使用它們,錯誤管理等的所有基本準則。也通過嘗試:) –

+0

感謝您的參考!讚賞:) – Ezeewei

相關問題