Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.05.2020, 09:14
Интересующийся
Отправить личное сообщение для konsa Посмотреть профиль Найти все сообщения от konsa
 
Регистрация: 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

Гугл не помог(((
Ответить с цитированием
  #2 (permalink)  
Старый 24.05.2020, 09:58
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Вы используете mysqli, но при этом не используете его возможности экранирования, и сами этого не делаете, создавая дыру в своих запросах.

В остальном нужно проверить наличие ошибок в отлоадчике.
Ответить с цитированием
  #3 (permalink)  
Старый 24.05.2020, 11:21
Интересующийся
Отправить личное сообщение для konsa Посмотреть профиль Найти все сообщения от konsa
 
Регистрация: 05.02.2020
Сообщений: 26

Сообщение от laimas Посмотреть сообщение
Вы используете mysqli, но при этом не используете его возможности экранирования, и сами этого не делаете, создавая дыру в своих запросах.
Я прошу прощения, я еще новичок и с благодарностью приму любые указки на мои ошибки

Сообщение от laimas Посмотреть сообщение
В остальном нужно проверить наличие ошибок в отлоадчике.
Я никак не могу понять где ошибки. В Денвере все работает как надо
Ответить с цитированием
  #4 (permalink)  
Старый 24.05.2020, 11:32
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 24.05.2020, 13:52
Интересующийся
Отправить личное сообщение для konsa Посмотреть профиль Найти все сообщения от konsa
 
Регистрация: 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"]}}
Больше нигде никаких ошибок не показывает
Ответить с цитированием
  #6 (permalink)  
Старый 24.05.2020, 14:00
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 24.05.2020, 14:06
Интересующийся
Отправить личное сообщение для konsa Посмотреть профиль Найти все сообщения от konsa
 
Регистрация: 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. Пробовал без цикла - не получилось, видимо делаю что-то не так. Не судите строго, я ведь только учусь

Знаю, что туплю, но, почему-то это все работает в Денвере, а на сервере - нет(((
Ответить с цитированием
  #8 (permalink)  
Старый 24.05.2020, 14:08
Интересующийся
Отправить личное сообщение для konsa Посмотреть профиль Найти все сообщения от konsa
 
Регистрация: 05.02.2020
Сообщений: 26

Сообщение от Rise Посмотреть сообщение
Значит на странице должно быть, как минимум "Открыта новая карта №1 Все норм", а вы пишите что:

Вы уж определитесь, что значит НИЧЕГО не выводится.
Так, в том и дело, что когда запускаю в Денвере выводится "Открыта новая карта №1 Все норм", а когда на сервере, просто пусто, ничего не выводится, хотя запись в базу добавляется

Последний раз редактировалось konsa, 24.05.2020 в 14:09. Причина: коррекция
Ответить с цитированием
  #9 (permalink)  
Старый 24.05.2020, 14:12
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от konsa
одно и то же, только в разных таблицах
То есть table в запросах это условности а реальные запросы к разным таблицам, и одному Id в другой принадлежит множество записей? Если да, то это массив, но как это могло работать тогда у вас на клиенте, если

var record = resultOut.record.acardnum;


это будет массив и на странице не будет вывода 1, 2, ..., будет Array.

Что-то тут с логикой не то.
Ответить с цитированием
  #10 (permalink)  
Старый 24.05.2020, 14:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от konsa
Это не число, оно такого вида: YN1219573
Значит нужно экранировать это значение в запросах. Или https://www.php.net/manual/ru/mysqli...bind-param.php, в противном случае, это 100% возможность sql-инъекции.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывести результат AJAX в div с динамическим ид voron121 AJAX и COMET 6 30.05.2016 18:46
AJAX результат kirill1989 AJAX и COMET 1 11.12.2014 04:03
Как сделать так чтобы ajax возвращал результат? Rooner AJAX и COMET 7 28.06.2013 12:42
Как вернуть результат из ajax внутри функции? Rooner AJAX и COMET 4 29.03.2013 19:15
Не выводится результат MySQL (при использовании AJAX) iBars AJAX и COMET 1 17.12.2012 09:13