2016-06-05 8 views
0

내 MSSQL Server 인스턴스에서 SQL 쿼리를 실행하는 PHP 스크립트가 있습니다. 나는 좋은 결과를 얻는다. 이제 $ .ajax에서 그 결과를 조작하려고하지만 Obejct 테이블의 acessing 필드의 "Object.field_name"방식이 내 Jquery Ajax에서 작동하지 않는 것 같습니다 (어쩌면 한 줄이 돌아 왔기 때문일 수도 있습니다)Jquery Ajax에서 다차원 PHP 배열에 액세스

테이블은 php에서 json_encoded입니다. 이 데이터에 액세스하여 전 세계에 배포 할 수 있도록 도와 주시겠습니까?

PHP 스크립트

<?php 
header('Access-Control-Allow-Origin: *'); 
header('Content-Type: application/json'); //Newly added 
ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 

    try { 
    $hostname = "SQLEXPRESS"; 
    $port = 1433; 
    $dbname = "MY_BD"; 
    $username = "user"; 
    $pw = "password"; 
    $dbh = new PDO ("sqlsrv:Server=$hostname,$port;Database=$dbname","$username","$pw"); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    }catch (PDOException $e) { 
    echo "Failed to get DB handle: " . $e->getMessage() . "\n"; 
    exit; 
    } 

$stm = $dbh->prepare("SELECT * FROM dbo.emp"); 
$stm->execute(); 

$table_1 = array(); 
while($row = $stm->fetch(PDO::FETCH_ASSOC)){ 
    $table_1[] = $row; 
} 

echo json_encode($table_1); 


?> 

자바 스크립트

var my_data ; 

function get_my_data(){ 

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost:8012/My_Script/test_1.php', 
    dataType: "json", 
    crossDomain: true, 
    success: function(result) { 
     my_data = result; 
     alert(my_data); //This will alert [Object object] 
     alert(my_data.id); //This will alert undefined ; id being on of the 
     //result fields 
    } 
    }); 
} 

alert(my_data); //This will alert undefined (not even [Object Object] 
//as if the global variable my_var can't be access in the $.ajax part 
$(document).ready(get_my_data); 

JQuery와 아약스, 브라우저 내 PHP 스크립트의 출력은 Whithout :

[{"id":"1","name":"John","sal":"1525.21","age":"45"}] 
[{"id":"2","name":"Cecily","sal":"854.75","age":"28"}] 
[{"id":"3","name":"Alfred","sal":"945.28","age":"37"}] 
+1

은 '성공'발사입니까? 아약스 오류 처리기는 어디에 있습니까? CORS 설정이 다른 여러'Access-Control' 헤더가없는 것 같습니다. – charlietfl

+2

'my_data [0] .id'를 경고하면 어떻게됩니까? 3 개의 개별 결과를 표시했는지 또는 3 개의 결과가 1 개 있는지를 알 수는 없지만 결과가 객체 배열 인 것처럼 보입니까? 또한'alert()'대신'console.log()'를 사용하고 출력을 탐색 할 수 있도록 브라우저의 콘솔에서 출력을 확인한다면 더 많은 데이터를 얻을 수 있습니다. – stratedge

+0

@charlietfl 내 CORS (잊어 버려. 내가 한 줄 추가했지만 그들은 괜찮아요) ... 다음 오류 hadling입니다. 이 스크립트는 이전에 "Hello world"예에서 사용되었으므로 걱정하지 마십시오. 이제는 다차원 배열이고 전역 변수를 사용하려고합니다. –

답변

1

문제는 다음과 같습니다

1 : my_data 속성에 올바르게 액세스하고 있지 않습니다. my_data은 개체의 배열입니다. 첫 번째 객체의 id 속성에 액세스하려면 my_data[0].id을 사용하십시오.

2 : my_data이 정의되기 전에 $(document).ready(get_my_data); 바로 위에있는 마지막 alert(my_data);이 호출됩니다. 이는 $.ajax이 비동기이기 때문입니다.

+0

알았습니다. 'my_data [0] .id'를 사용하여 액세스 할 수있었습니다. 성공 함수에서 나오는 데이터로 my_data를 정의하고 사용하는 방법이 나중에 어떻게됩니까? –

+1

'나중에'그것을 사용하는 한 가지 방법은'my'data'가'success' 콜백 내에 정의 된 후에 실행해야하는 코드를 넣는 것입니다. 또 다른 방법은 '약속'을 사용하는 것입니다. 논리가 중요하지 않은 경우 일반적으로 '약속'이 좋습니다. 또한'발전기'를 들여다보십시오. –

+0

mg. 초심자를 위해 thats 많게. 나는 성공 콜백에서 그것을 사용하여 뜨거운 나를 도울 것입니다. 나는 약속과 발전기를 들여다 볼 것이다. 고마워. –

1

$.ajax은 비동기이기 때문에 해당 범위에서 my_data에 액세스 할 수 없습니다.

하지만 난 당신이 내가 당신이 찾고있는 무슨 생각이 방법

var my_data; 

function get_my_data() { 

    $.ajax({ 
    type: 'POST', 
    url: 'http://localhost:8012/My_Script/test_1.php', 
    dataType: "json", 
    crossDomain: true, 
    success: function(result) { 
     my_data = result; 
     //alert(my_data); // this is an array you can't alert it do console.log(my_data) 
     //alert(my_data.id); // you can't access id directly because it's an array 
     // rather you can do this way loop/map over it will return each array item 
     my_data.map(function(data) { 
     alert(data.id); 
     }) 
    } 
    }); 
} 

//as if the global variable my_var can't be access in the $.ajax part 
$(document).ready(function() { 
    get_my_data(); 
}); 
+1

"비동기로 ajax를 호출해야합니다. false"* 결코 사용하지 말라는 토론의 주제가 아니어야합니다 .... 그것은 끔찍하고 결함있는 개념입니다. 또한 브라우저 공급 업체에 의해 더 이상 사용되지 않으며 콘솔을 사용하는 경우 경고가 콘솔에 기록됩니다. – charlietfl

+0

@charlietfl 좋은 팁, 내 대답을 내 의견으로 업데이트합니다. –

0

을 할 제안 할 수 있습니다 결과를 반복하는 방법입니다.

$(my_data).each(function(index,value) { 
    alert(value.id); 
}); 

이 작동해야합니다. 이 세계화에 관해서. 변수를 호출 외부에 선언하고 성공으로 설정하면 액세스 할 수 있어야합니다. 당신에게 정의되지 않은 이유는 ajax가 비동기이며 서버가 값을 반환하기 전에 호출이 실행된다는 것입니다.

+0

차가워졌습니다. 내가 옳다면 성공으로해야한다고 정의했습니다. 하지만 아약스는 비동기 적이기 때문에 어떤 시점에서 액세스 할 수 있습니까? (스크립트의 위치를 ​​변경하면 도움이 될 것입니다.) –

+1

액세스 할 수 있다는 말은 없습니다. 5 초 정도'setTimeout'을 시도해 볼 수는 있지만 나쁜 습관입니다. 'success' 콜백 함수에서 호출 한 ajax 요청의 값을 얻은 후에 실행합니다 .Ajax 요청에 async : false를 설정할 수 있지만 일을 수행하는 올바른 방법은 아닙니다 – phreakv6

+0

감사합니다. Raphael이 성공 콜백에 코드를 추가하기 만하면됩니다. –

관련 문제