$_POST принимает NULL при AJAX запросе и мешает использовать PDO, как исправить?

Есть форма
<form id="filter">
    <input type="checkbox" name="day[]" value="1"> 
    <input type="checkbox" name="day[]" value="2">
    <input type="checkbox" name="day[]" value="3"> 
</form>

Значения передаются с помощью AJAX
var a = 0;
var b = 5;
var c = $( "#filter" ).serialize();
var Data = 'a=' + a + '&' + 'b=' + b + '&' + c;
var process = false;
                    $.ajax({
                        url: 'script.php',
                        method: 'POST',
                        data: Data,
                        beforeSend: function() {
                            process = true;
                        }
                    });

В script.php var_dump($_POST['day']) выдает NULL, var_dump($b); показывает string(0) ""
$a = $_POST['a'];
$b = $_POST['b'];
$c = implode(',', $_POST['day']); // Warning: implode(): Invalid arguments passed
$in  = str_repeat('?,', count($c) - 1) . '?'; // Warning: Second argument has to be greater than or equal to 0
$sql = "SELECT * FROM table WHERE day IN ($in) ASC LIMIT :a, :b";
$stmt = $pdo->prepare($sql);
$stmt->execute($с, [$a, $b]);
$data = $stmt->fetchAll();
echo json_encode($data);

Вот это не помогает:
if (isset($_POST['day'])) {
    $c = implode(',', $_POST['day']);
}


ДОБАВЛЕНО: Если не использовать подготовленные запросы и pdo, а mysqli, то все работает, несмотря на Warning: implode(): Invalid arguments passed
  • Вопрос задан
  • 1321 просмотр
Решения вопроса 2
gromdron
@gromdron
Работаю с Bitrix24
Если Вы НЕ отметили ни одного чек-бокса, то Вам ничего и не прилетит.
Т.е. если отправить форму из моего примера, в $_POST будет:
array(2) {
  ["a"]=>
  string(1) "0"
  ["b"]=>
  string(1) "5"
}

Т.е. никакого day у Вас и нет.
Я так понимаю, Вы делаете вывод данных на основе значения этого day. А значит ничего не и должно вывестись.

То есть, Ваш код сведется к:
$result = [];

$a = (int) $_POST['a'];
$b = (int) $_POST['b'];

$c = array_filter( (array) $_POST['day'] );

if ( !empty($c) )
{
	$c = implode(',', $_POST['day']);
	$in = str_repeat('?,', count($c) - 1) . '?';
	$sql = "SELECT * FROM table WHERE day IN ($in) ASC LIMIT :a, :b";
	$stmt = $pdo->prepare($sql);
	$stmt->execute($с, [$a, $b]);
	$data = $stmt->fetchAll();

	$result = $data;
}

echo json_encode($result);


P.S. А так ли Вам нужна именно ручная сборка значений? Почему бы не вынести в саму форму?

<form id="filter">
	<input type='hidden' name='a' value='0' />
	<input type='hidden' name='b' value='5' />
	<input type="checkbox" name="day[]" value="1"> 
	<input type="checkbox" name="day[]" value="2">
	<input type="checkbox" name="day[]" value="3"> 
</form>


$.ajax({
    url: 'index.php',
    method: 'POST',
    data: $("#filter").serialize()
});
Ответ написан
@nvjfdvjnkn Автор вопроса
Спасибо всем, кто помогал!

Окончательный, работающий вариант:
$result = [];

$a = (int) $_POST['a'];
$b = (int) $_POST['b'];

$c = array_filter( (array) $_POST['day'] );

if ( !empty($c) )
{
  $c = implode(',', $_POST['day']);
  $c = explode(",", $c);
  $in = str_repeat("?,", count($c) - 1) . '?';
  $sql = "SELECT * FROM table WHERE day IN ($in) LIMIT ?, ?";
  $stmt = $pdo->prepare($sql);
  $params = array_merge($c, [$a, $b]);
  $stmt->execute($params);
  $data = $stmt->fetchAll();
  $result = $data;
}

echo json_encode($result);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Sanovskiy
@Sanovskiy
Веб-разработчик с 2005 года
$c = implode(',', $_POST['day']); // Warning: implode(): Invalid arguments passed

Замените на
$c = implode(',', array_filter($_POST['day'])); // Warning: implode(): Invalid arguments passed

array_filter()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы