То, что вы отправляете, на самом деле не application/x-www-form-urlencoded
формат. Вы просто соединяете строковые значения, а не именованные параметры, экранированные URL.
Я предлагаю отправлять отдельные параметры в стандартном URL-кодированном формате:
function encodeParameters(o) {
for (var k in o)
pars.push(encodeURIComponent(k)+'='+encodeURIComponent(o[k]))
return pars.join('&');
}
var pars= {key: key, have: haveCredits, needed: creditsNeeded, left: creditsLeft};
xhr.open('POST', '/ajax');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(encodeParameters(pars));
тогда на стороне PHP вы можете получить их, используя обычные массивы запросов:
$key= $_POST['key'];
$creditsNeeded= intval($_POST['needed']);
// ...