
24.05.2020, 09:14
|
Интересующийся
|
|
Регистрация: 05.02.2020
Сообщений: 26
|
|
AJAX не возвращает результат завпроса
Всем доброго времени суток!
Ребята, помогите пожалуйста, если кто сталкивался.
Вот код:
$("#knopka").on('click', function() {
var kasId = $("#kasId").text();
$.ajax({
url: "open_acard.php",
type: "POST",
data: {kasId: kasId},
dataType: "json",
success: function(resultOut) {
var record = resultOut.record.acardnum;
var answer = resultOut.answer;
$('#ambulance .buttonContainer button').fadeOut(100);
$('#opened').append("Открыта новая карта №" + record + "<br>" + answer);
}
});
Обработчик:
Код:
|
<?php
$kasId = $_POST['kasId'];
$adate_start = (date("Y-m-d H:i:s"));
$db = mysqli_connect("localhost", "", "", "");//подключаемся
$sqlIn = "INSERT INTO table (kas_id, adate_start) VALUES ('$kasId', '$adate_start')";
$result = $db->query($sqlIn);
if($result) {
$sqlOut = "SELECT acardnum FROM table WHERE kas_id = '$kasId'";
$resultOut = $db->query($sqlOut);
while($row = $resultOut->fetch_assoc()) {
$record['acardnum'][] = $row['acardnum'];
$answer = "Все норм";
}
}
else {
$answer = "Не норм";
}
$db->close();
$send = array(
'answer' => $answer,
'record' => $record
);
echo json_encode($send);
?> |
В Денвере все работает, а на сервере запись добавляется в базу, а на страничке ничего не выводится
Денвер:
Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13
Версия клиента базы данных: libmysql - mysqlnd 5.0.8-dev - 20102224 - $Id: 65fe78e70ce53d27a6cd578597722950e490b0d0 $
PHP расширение: mysqli
Сервер:
nginx/1.9.2
Версия клиента базы данных: libmysql - mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
PHP расширение: mysqliДокументация curlДокументация mbstringДокументация
Версия PHP: 5.6.14
Гугл не помог(((
|
|

24.05.2020, 09:58
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Вы используете mysqli, но при этом не используете его возможности экранирования, и сами этого не делаете, создавая дыру в своих запросах.
В остальном нужно проверить наличие ошибок в отлоадчике.
|
|

24.05.2020, 11:21
|
Интересующийся
|
|
Регистрация: 05.02.2020
Сообщений: 26
|
|
Сообщение от laimas
|
Вы используете mysqli, но при этом не используете его возможности экранирования, и сами этого не делаете, создавая дыру в своих запросах.
|
Я прошу прощения, я еще новичок и с благодарностью приму любые указки на мои ошибки
Сообщение от laimas
|
В остальном нужно проверить наличие ошибок в отлоадчике.
|
Я никак не могу понять где ошибки. В Денвере все работает как надо
|
|

24.05.2020, 11:32
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от konsa
|
я еще новичок
|
Данные извне, а тем более данные как параметры запроса обязательно нужно фильтровать, в запросе экранировать их. В mysqli это можно возложить на сам движок используя а запросах метки, читайте об этом в руководстве. Но если kasId, это число, то можно хотя бы так:
if($kasId = (int)$_POST['kasId']) {
//если id не фейк, то выполнение
$sqlIn = "INSERT INTO table (kas_id, adate_start) VALUES ($kasId, NOW())";
} else {
//...
}
(date("Y-m-d H:i:s")) - тут лишние скобки, но это вообще выбросить, текущую дату/время можно получить и функцией SQL - NOW().
Вообще логика запросов странная - некий неизвестный ID записывается в базу, после чего из этой же таблицы по этому id извлекается некое значение.
Открывайте отладчик браузера и смотрите в нем в вкладке Сеть ответ сервера, он в любом случае будет. А ответом может быть вывод ошибки произошедшей на сервере или же ошибки на клиенте.
Денвер лучше выбросить и установить https://ospanel.io, выбрав в нем те модули, которые у вас и на реальном сервере будут.
PS. Странность еще и в том, что выборку из базы пропускают через цикл, а зачем? Если одному владельцу принадлежит несколько записей, то предыдущая запись в базу и выборка никак не могут иметь связей, так как записи владела в таком случае могут быть только в другой, связанной таблице.
Последний раз редактировалось laimas, 24.05.2020 в 11:43.
|
|

24.05.2020, 13:52
|
Интересующийся
|
|
Регистрация: 05.02.2020
Сообщений: 26
|
|
Сообщение от Rise
|
konsa,
Открываешь в браузере DevTools (Инструменты разработчика) сочетанием клавиш Ctrl+Shift+I (или F12). На вкладке Console (Консоль) можно увидеть ошибки JS, у тебя скорее всего там будет TypeError: Cannot read property 'acardnum' of null. На вкладке Network (Сеть) выбираешь XHR (это ajax), выбираешь из списка нужный запрос, рядом откроются детали запроса, выбираешь там вкладку Response (Ответ).
|
Большое спасибо за ответ, до этого смотрел только ошибки
Сообщение от Rise
|
konsa,Что у тебя там?
|
{"answer":"\u0412\u0441\u0435 \u043d\u043e\u0440\u043c","record":{"acardnum":["1"]}}
Больше нигде никаких ошибок не показывает
|
|

24.05.2020, 14:00
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
["1"] - это массив, а значит получить его значение на клиенте можно только так - resultOut.record.acardnum[0].
Это следствие неверного подхода в получении данных ресурса
while($row = $resultOut->fetch_assoc()) {
$record['acardnum'][] = $row['acardnum'];
$answer = "Все норм";
}
не может быть в вашем случае массива.
Последний раз редактировалось laimas, 24.05.2020 в 14:02.
|
|

24.05.2020, 14:06
|
Интересующийся
|
|
Регистрация: 05.02.2020
Сообщений: 26
|
|
Сообщение от laimas
|
Но если kasId, это число
|
Это не число, оно такого вида: YN1219573
Сообщение от laimas
|
(date("Y-m-d H:i:s")) - тут лишние скобки, но это вообще выбросить, текущую дату/время можно получить и функцией SQL - NOW().
|
За это огромное спасибо!
Сообщение от laimas
|
Вообще логика запросов странная - некий неизвестный ID записывается в базу, после чего из этой же таблицы по этому id извлекается некое значение.
|
kasId - это одно и то же, только в разных таблицах, связаны FOREIGN KEY
Сообщение от laimas
|
Открывайте отладчик браузера и смотрите в нем в вкладке Сеть ответ сервера, он в любом случае будет. А ответом может быть вывод ошибки произошедшей на сервере или же ошибки на клиенте.
|
В том-то и дело, что там не выдает никаких ошибок и в Денвере все работает
Сообщение от laimas
|
Денвер лучше выбросить и установить https://ospanel.io, выбрав в нем те модули, которые у вас и на реальном сервере будут.
|
Спасибо за совет, обязательно воспользуюсь
Сообщение от laimas
|
PS. Странность еще и в том, что выборку из базы пропускают через цикл, а зачем? Если одному владельцу принадлежит несколько записей, то предыдущая запись в базу и выборка никак не могут иметь связей, так как записи владела в таком случае могут быть только в другой, связанной таблице.
|
Просто не знаю как по другому поместить ответ в объект json. Пробовал без цикла - не получилось, видимо делаю что-то не так. Не судите строго, я ведь только учусь
Знаю, что туплю, но, почему-то это все работает в Денвере, а на сервере - нет(((
|
|

24.05.2020, 14:08
|
Интересующийся
|
|
Регистрация: 05.02.2020
Сообщений: 26
|
|
Сообщение от Rise
|
Значит на странице должно быть, как минимум "Открыта новая карта №1 Все норм", а вы пишите что:
Вы уж определитесь, что значит НИЧЕГО не выводится.
|
Так, в том и дело, что когда запускаю в Денвере выводится "Открыта новая карта №1 Все норм", а когда на сервере, просто пусто, ничего не выводится, хотя запись в базу добавляется
Последний раз редактировалось konsa, 24.05.2020 в 14:09.
Причина: коррекция
|
|

24.05.2020, 14:12
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от konsa
|
одно и то же, только в разных таблицах
|
То есть table в запросах это условности а реальные запросы к разным таблицам, и одному Id в другой принадлежит множество записей? Если да, то это массив, но как это могло работать тогда у вас на клиенте, если
var record = resultOut.record.acardnum;
это будет массив и на странице не будет вывода 1, 2, ..., будет Array.
Что-то тут с логикой не то.
|
|

24.05.2020, 14:15
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от konsa
|
Это не число, оно такого вида: YN1219573
|
Значит нужно экранировать это значение в запросах. Или https://www.php.net/manual/ru/mysqli...bind-param.php, в противном случае, это 100% возможность sql-инъекции.
|
|
|
|