$_POST принимает NULL при AJAX запросе и мешает использовать PDO, как исправить?
Если Вы НЕ отметили ни одного чек-бокса, то Вам ничего и не прилетит.
Т.е. если отправить форму из моего примера, в $_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()
});
Спасибо всем, кто помогал!Окончательный, работающий вариант:$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);