Я реорганизовал свой код, чтобы он соответствовал «лучшим практикам», так что файлы javescript находились в каталоге / scripts, а файлы изображений - в каталоге / assy, что потребовало от меня экспериментов над тем, как работает конкретный c который отправляет XMLHttpRequest (). open ("GET", "/scripts/getpartinformation.php?partNumber=" + PN, true) для получения информации о части из MySQL DB. Я оставил исходную функцию в index. php и включил идентичную версию в файл javascript, как показано ниже.
Изображение HTML вызывает одну из двух идентичных функций javascript следующим образом:
<area shape="rect" coords="333,316,399,330" href="TopAssy.html" onClick="parent.getassyInformation('100.100002');">
<area shape="rect" coords="341,230,407,246" href="TopAssy.html" onClick="GetassyInformation('100.100001');">
getassyInformation (PN) и GetassyInformation (PN) - это один и тот же код, но в двух разных местах. getassyInformation (PN) находится в заголовке index. php следующим образом:
<script>
function getassyInformation(PN) {
...
</script>
}
GetassyInformation (PN) находится в хранилище. js, файл javascript в каталоге / scripts, вызывается из заголовка файла изображения как:
<script src="../scripts/Storage.js"></script>
Ниже приведен их код (показан верхний регистр «g»):
function GetassyInformation(PN) {
alert("entered GetassyInformation()");
var arrayPosEnum = {
DESCRIPTION: 0,
PRICE: 1,
QUANTITY: 2,
EXTENDEDPRICE:3
};
alert("you clicked: " + PN);
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState === 4 && this.status === 200) {
alert ("readystate is " + this.readyState + " and status is " + this.Status);
console.log("ResponseText is: " + this.responseText);
//convert responseText into array at the comma separator
var dbData = this.responseText.split(',');
//add default Qty of '1' and Ext Price placeholders to end of array
dbData.push("1", dbData[arrayPosEnum.PRICE]);
localStorage.setItem(PN, dbData);
}else{
alert ("readystate is " + this.readyState + " and status is " + this.Status);
console.log({xmlhttp});
}
};
alert("immediately after xmlhttp.onreadystatechange");
xmlhttp.open("GET", "../scripts/getassyinformation.php?assyNumber=" + PN, true);
xmlhttp.send();
}
При нажатии «100.100002» появляется предупреждение " сразу после отображения xmlhttp.onreadystatechange "код проходит через ответы xmlhttp с предупреждениями, отображающими" readyState is: "от 1 до 4 (см. код else), и пара значений ключа возвращается из базы данных MySQL в responseText . Однако при щелчке "100.100001" отображается предупреждение "сразу после xmlhttp.onreadystatechange" и отображается предупреждение "readystate is 1 ....", а затем ничего.
Я экспериментировал с XMLHttpRequest.open URL-адрес с двойной точкой или без двойной точки в обеих версиях и дает одинаковый результат, сбой при нажатии «100.100001» и успех при нажатии «100.100002». Apache находит информацию getassy. php, с двойной точкой перед / scripts или без нее при нажатии «100.100002».
Когда я нажимаю «100.100001» (сбой), я не получаю сообщения об ошибке в apache_error. log, но я получаю следующие записи в access.log:
::1 - - [12/Jul/2020:15:43:51 -0500] "GET /scripts/getpartinformation.php?partNumber=100.100001 HTTP/1.1" 200 28
::1 - - [12/Jul/2020:15:43:51 -0500] "GET /scripts/Storage.js HTTP/1.1" 304 -
Когда я нажимаю «100.100002» (успех), я получаю следующие записи в access.log:
::1 - - [12/Jul/2020:15:45:51 -0500] "GET /scripts/getpartinformation.php?partNumber=100.100002 HTTP/1.1" 200 25
::1 - - [12/Jul/2020:15:45:53 -0500] "GET /scripts/Storage.js HTTP/1.1" 304 -
Общий формат журнала указывает, что «28» и «25» в конце каждой строки «указывают размер объекта, возвращаемого клиенту». Это имеет смысл, потому что responseText, показанный в console.log, имеет следующий вид: «ключ: 100.100002, а элемент: base assy, 50.00» или 25 символов. Значение «28», показанное для сбойного PN (100.100001), имеет смысл, поскольку в случае успеха в console.log будет указано следующее: «ключ: 100.100001, а элемент: Cradle assy, 125.00» или 28 символов.
Есть ли у кого-нибудь представление о том, что может происходить с парой значений ключа, возвращаемой из MySQL при нажатии «100.100001»? Я в тупике, почему для обоих сообщается «200», но нажатие «100.100001» не проходит через readyStates, и значение теряется, но, похоже, было отправлено из отчета access.log с кодом состояния « 200 и 28 символов.