2013-12-09 2 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

: P

직전 변수에 할당 괜찮습니다. 그렇지 않으면 또 다른 문제가 있습니다. – Haneev

+1

당신은 단지 쿼리가 작동한다고 가정해서는 안됩니다. b)'execute()'를 호출 할 때'fetchAll()'이'false'를 반환하지 않는지 확인하십시오.) c) 'prepare()'가 호출 된 후에'$ sth'에 실제로 유효한'PDOStatement' 객체가 있는지 확인하십시오. 코드가 행복한 경로에 있지 않을 때 모든 오류 조건을 처리하십시오 - 오류를 기록하면 문제가 무엇인지 알 수 있습니다. –

+0

험 ... '?'을 묶는 것이 실제로 가능합니까? SQL의 LIMIT 인수에? 나는 그것이 변수만을위한 것이라고 생각했다. 그것이 사실이라면 쿼리가 2 개의 데이터를 다시 전송할 수 없습니까? LIMIT 구분 기호 대신 –

답변

1

감사드립니다. 캐릭터 '?' 단순히 자리 표시자가 아니며 쿼리의 실제 매개 변수 (조건 또는 값과 같은)를 나타냅니다. 사람들은 할 수있다 올바른 문장입니다

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

: 요점은 MySQL이 쿼리를 준비 할 때, 그것은 쿼리가 실제로 실행 될 때, 조건이 여기 것, 또는 값이 무엇인가에 업데이트됩니다 것을 알고 있다는 것입니다 준비되고 이해된다. 하지만 그것들? 단순히 변수, exemple를 들어, 당신은 그렇게 할 수 없습니다 : 그들은 매개 변수, PHP에서 $whatever 좋아하지 변수입니다

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

을, 그들은 단순히 당신이 그들을주는 어떤 값으로 대체되지 않습니다 (SQL 인젝션은 여전히 ​​것 큰 문제는 SQL) 매개 변수로 그들을 취급하고, 그들은 당신이 그들을 사용할 수있는 특정 장소가 있고, LIMIT? 슬프게도, 그들 중 하나되지 않습니다 : 그가 start``와 객체와`per_page` 이상이있을 때 당신은`위해서 var_dump ($ 사용자)`시도 할 수 있습니다

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 시간을 좌절시킨 것을 해결했습니다 ... 진심으로 감사드립니다! Btw, 어떻게 PDO에 대한 깊은 이해를 얻었습니까? 어디에서 더 잘 이해해야할까요? 좋은 소스가 있습니까?내 말은, PHP 공식 사이트에 의해 pdo 문서보다 나은가요? – Ezeewei

+0

mysql 개발자 http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers에 대한 PDO 튜토리얼을 읽었는데, 진술서 준비, 사용법, 오류 관리 등에 관한 모든 기본적인 지침을 가지고 있습니다. 또한 시도하여 :) –

+0

참고 주셔서 감사합니다! 고맙다. :) – Ezeewei