Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.05.2019, 10:18
Аспирант
Отправить личное сообщение для izumov Посмотреть профиль Найти все сообщения от izumov
 
Регистрация: 05.05.2019
Сообщений: 72

Как же правильно вызывать запрос Ajax в функции?
У меня есть функция

function CheckFormItemUnical(col,colvalue){

var kod=document.getElementById('kod').value;
createRequest() ;
var url="proba8.php";
request.open("POST",url, false );
	request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
	  var data="kod="+kod+"&kol="+col+"&colvalue="+colvalue;
	  request.send(data);
	request.onreadystatechange = function() {
        if (request.readyState == 4) {
            if (request.status == 200) {
                alert(request.responseText);
			if(request.responseText=="0"){rez= true;return rez;}
			else{flagunical=false;rez= false;return rez;}
            } else {
				
                alert('error' + request.statusText);
            }
        }
}
return rez;}

Но так как запрос асинхронный то ответ приходит не всегда. иногда приходит пйстой ответ и функция из-за этого работает неправильно.
Эта функция тестирует значение на уникальность в базе данных в конкретной таблице по столбцу определяемому переменной
col.Если ответ с сервера приходит мгновенно все работает правильно. При задержке же ответа почему то responseText=""
а по логике функции это считается что тест не пройден.Так какответ- это количество строк в базе данных.ПРобовал делать синхронный запрос в отладчике вылазит предупреждение Что синхронный запрос в главном потоке- это устаревший метод. Подскажите как мне перестроить функциючтобы она правильноработала
серверный код
<?php
require"conect.php";
$data = array();
 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $kol=$_REQUEST['kol'];
 $colvalue=$_REQUEST['colvalue'];
 $sql="SELECT  COUNT(*)
FROM clients
WHERE ";
$sql.=$kol;
$sql.=" =";
$sql.=$colvalue;
$sql.=" AND (kod <> ";
$sql.=$kod;
$sql.=")";
$stmt = $pdo->prepare($sql);
  // echo $sql;
   
   $stmt->execute();

$value = $stmt->fetchColumn(0);
echo  $value;
?>
Ответить с цитированием
  #2 (permalink)  
Старый 18.05.2019, 10:30
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Асинхронные функции вместо возврата результата должны вызывать другую функцию для обработки результата:
request.onreadystatechange = function() {
  ...
  callback(rez);
}
Ответить с цитированием
  #3 (permalink)  
Старый 18.05.2019, 17:43
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

izumov, зачем так распылять текст тела запроса (тем более что он у вас странный по условию), к тому же он небезопасный. Если уж не фильтруете данные извне, что плохо, то хотя бы используйте по максимум возможности PDO:

$sql = "SELECT COUNT(*) FROM clients
        WHERE kol = :kol AND colvalue = :colvalue AND kod <> :kod";

$stmt = $pdo->prepare($sql);
   
$stmt->execute($_POST);


$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - установите все предпочтения один раз в настройках, в подключении PDO.

Стоит учитывать, что в $_REQUEST попадают данные из GET, POST и COOKIE, если используете эту переменную, то с гарантией, что вы контролируете процесс.

Что касается "При задержке же ответа почему то responseText=""
а по логике функции это считается что тест не пройден."
- и какова же задержка, что такая огромная база? Клиент ожидает ответ от сервера на свой асинхронный запрос, и прекращает ожидание если превышено время timeout, что можно контролировать. Также можно анализировать статусы и заголовки передаваемые сервером. Будете это делать, значит и анализ будет не по "пустой" строке.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AJAX Запрос - не могу добраться до значения переменной вне функции thc2000 AJAX и COMET 6 13.07.2018 17:47
AJAX в функции dmitriyk AJAX и COMET 4 16.12.2013 12:43
как запустить в цикле последовательно две функции вызова ajax Bakhit jQuery 4 24.08.2013 12:13
Как вызвать правильно php-файл из функции? Seobmen Общие вопросы Javascript 4 10.10.2012 14:40
Как повесить проверку на ajax запрос? Randomizer jQuery 10 24.09.2010 12:20