2016-06-05 5 views
0

У меня есть php-скрипт, выполняющий SQL-запрос на моем экземпляре MSSQL Server. Я получаю хороший результат. Теперь я пытаюсь манипулировать своим результатом из $ .ajax. Но кажется, что способ заполнения полей в объектной таблице «Object.field_name» не работает в моем JQuery Ajax (возможно, потому что есть больше, чем одна строка)Доступ к многомерному массиву PHP в JQuery Ajax

Таблица json_encoded в php. Не могли бы вы помочь мне получить доступ к этим данным и поместить их в глобальный vairable?

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); 


?> 

скрипт Javascript

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); 

Whithout Jquery Ajax, вывод мой PHP скрипт в браузере:

[{"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

для начинающих - «успешный» стрельба? где ваш обработчик ошибок ajax? В вашей конфигурации CORS не хватает нескольких других заголовков «Access-Control». – charlietfl

+2

Что вы можете получить, если вы предупреждаете 'my_data [0] .id'? Похоже, что ваши результаты представляют собой массив объектов, хотя я не могу сказать, показывали ли вы три отдельных результата или 1 результат с 3 строками? Кроме того, вы получите больше данных, если вы используете 'console.log()' вместо 'alert()' и проверьте консоль своего браузера для вывода, что позволит вам изучить выход. – stratedge

+0

@charlietfl для моего CORS (забудьте о них. Я добавил одну строку, но они в порядке) ... Далее ошибка hasling. Не беспокойтесь об этом, так как этот скрипт использовался в случае «Hello world» раньше, и он работал. Теперь единственное, что это многомерный массив, а также то, что я хочу использовать глобальную переменную –

ответ

1

Проблемы:

1: Вы не имеете доступа к объектам my_data. my_data - массив объектов. Чтобы получить доступ к свойству id первого объекта, используйте my_data[0].id.

2: Последний alert(my_data); непосредственно над $(document).ready(get_my_data); вызывается до определения my_data. Это связано с тем, что $.ajax является асинхронным.

+0

нормально. Я смог получить к нему доступ с помощью 'my_data [0] .id' Любая идея, как я могу определить my_data с данными, поступающими из функции успеха, и использовать их позже? –

+1

Один из способов использования «позже» - это поставить код, который нужно запустить после того, как 'my_data' определен в обратном вызове' success'. Другой способ - использовать «обещания». Если у вас нетривиальное количество логики, «обещания», как правило, лучше. Также посмотрите на «генераторы». –

+0

omg. Для новичка много. Я горячо использую его в обратном вызове успеха, который мне поможет. Я посмотрю на обещания и генераторы. Спасибо друг. –

1

Вы не можете получить доступ к my_data из этой области, потому что $.ajax является асинхронным.

Но я могу предложить вам сделать этот путь

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

прохладный. Если я прав, то я определил его как должен в этом успехе. Но поскольку ajax является асинхронным, в какой момент я смогу получить к нему доступ? (изменение позиции в скрипте поможет? –

+1

Нет смысла говорить, когда вы сможете получить доступ. Вы можете попробовать «setTimeout» в течение 5 секунд или около того, но это плохая практика. У вас должен быть любой код, который должен запустите после получения значений из вашего запроса ajax, вызванного из функции обратного вызова «success». Вы можете установить async: false в свой запрос ajax, но это неправильный способ сделать что-то. – phreakv6

+0

Хорошо, спасибо. Рафаэль сказал, что тоже. Я просто добавлю код в обратный вызов успеха –

Смежные вопросы