2014-09-04 4 views
1

Я пытаюсь отправить массив JavaScript на новый PHP массив с помощью JQuery Ajax:Отправить массив JavaScript в PHP массив с помощью JQuery Ajax

var heart = [31,32,33,34,35,36,37,38,39,42,43]; 

$('#find_btn').click(function(){ 
    $.ajax({ 
     type: "POST", 
     url: 'scripts/get_specimens_system.php', 
     data: { 
       system: heart, 
     }, 
     success: function(data) { 
      $('#search_list_container').html(data); 
     } 
    }); 
}); 

В PHP скрипт я следующее перед запросом MySQL:

$system = array($_POST['system']); 

Если я жёстко данные в heart как:

$system = array(31,32,33,34,35,36,37,38,39,42,43); 

запрос работает O K. Что я делаю не так?

В попытке упростить этот вопрос я оставил тот факт, что я устанавливаю массив JS в var system через system = $(this).attr('data-system');

Если данные система установлена ​​в массивы, как:

$('#sub_category_box_systems').html("<a class='sub_category_link' href='#' data-subcat-type='system' data-system='" + brain + "'>Brain</a><br /><hr><a class='sub_category_link' href='#' data-subcat-type='system' data-system='" + nerves + "'>Nerves</a><br /><hr><a class='sub_category_link' href='#' data-subcat-type='system' data-system='" + cerebellum + "'>Cerebellum</a>"); 

Теперь, если я предупреждаю system непосредственно перед заявлением AJAX, предупреждение показывает, что межсегменты в порядке.

$('#sub_category_box_systems').on('click', '.sub_category_link', function() { 
    system = $(this).attr('data-system'); 
}); 


$('#find_btn').click(function(){ 
    alert(system); 
    $.ajax({ 
     type: "POST", 
     url: 'scripts/get_specimens_system.php', 
     data: { 
      system: system, 
     }, 
     success: function(data) { 
     } 
    }); 
}); 

И я обновил PHP файл:

$system = $_POST['system']; 

Все еще не идет, хотя, если я поменять вар system при фактическом варе массива (например, heart), так как Данные Ajax работают. Так что здесь не так? (извините за изменение этого OP ...).

Странно, если я изменю вар system на определенный массив, как показано ниже это работает, так что должно быть некоторые проблемы с форматированием с помощью JQuery .attr('data-system');

$('#sub_category_box_systems').on('click', '.sub_category_link', function() { 
    system = heart; 
}); 

ответ

2

Вы хотите добавить дополнительный массив вокруг параметра , который уже является массивом. Просто:

$system = $_POST['system']; 
+0

Или, если пытаются отправить многомерный массив, использование $ системы с [0] – nwolybug

+0

Только если он просто хочет, чтобы первый ряд его. – Barmar

+0

В попытке упростить вопрос я опустил факт, что я получаю массив JS через тег данных html и используя system = $ (this) .attr ('data-system'); Должен ли я обновить OP или открыть новый вопрос? – IlludiumPu36

-1

Вы можете конвертировать, что в строку, говоря:

data: { 
    system: heart.join(",") 
} 

и преобразование обратно в массив на стороне сервера, говоря:

$system = explode(",",$_POST['system']); 
3

По умолчанию, jQuery $.ajax отправит ваш запрос в виде данных формы. Если открыть браузер отладчик в то время как запрос посылается, вы увидите этот запрос данных:

system[]:31 
system[]:32 
system[]:33 
system[]:34 
system[]:35 
system[]:36 
system[]:37 
system[]:38 
system[]:39 
system[]:42 
system[]:43 

PHP понимает, что это массив и читает его в виде массива по умолчанию. Вы не должны обертывать его тегом array().

Вы можете присвоить массив вашей собственной переменной, например: $system = $_POST['system'];

Однако, ваша работа не совсем сделано там. $system В настоящее время массив строк .Вот var_dump из $system:

array(11) { 
    [0]=> 
    string(2) "31" 
    [1]=> 
    string(2) "32" 
    [2]=> 
    string(2) "33" 
    [3]=> 
    string(2) "34" 
    [4]=> 
    string(2) "35" 
    [5]=> 
    string(2) "36" 
    [6]=> 
    string(2) "37" 
    [7]=> 
    string(2) "38" 
    [8]=> 
    string(2) "39" 
    [9]=> 
    string(2) "42" 
    [10]=> 
    string(2) "43" 
} 

Используйте это, чтобы преобразовать его в массив целых чисел:

$system = array_map('intval', $system);

+0

На самом деле нет необходимости преобразовывать их в целые числа, так как PHP, как правило, преобразует строки в числа. – Barmar

+0

Ловушки, полагающиеся на свободно типизированные переменные, много. Я не сторонник сильной типизации для простого веб-приложения, но, безусловно, хорошая практика, чтобы ваши номера были установлены как числа, а ваши строки заданы как строки. Если бы я был OP, я бы изменил тип данных POST на application/json, так что PHP ясно, что его данные являются либо числовыми, либо строковыми. –

0

Я награждён ответ @Barmar как его решение решить оригинальный ОП. У меня все еще была проблема с получением массивов JS через массив PHP из-за использования system = $(this).attr('data-system'). Изменение кода следующего фиксированного этот вопрос:

$('#sub_category_box_systems').on('click', '.sub_category_link', function() {  
    system = $(this).attr('data-system').split(","); 
}); 
Смежные вопросы