Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.01.2014, 15:41
Аватар для Vikky
Интересующийся
Отправить личное сообщение для Vikky Посмотреть профиль Найти все сообщения от Vikky
 
Регистрация: 31.12.2013
Сообщений: 14

Асинхронный вывод данных из базы MySQL
Приветствую!

Уже пару дней бьюсь с этим вопросом, поэтому буду рад любой помощи (и да.. Гугл уже спрашивал).

Делаю простой счётчик кликов по ссылкам, который сохраняет данные в БД и выводит их при перезагрузке страницы (для каждой страницы - свой результат). С сохранением - проблем никаких нет, всё асинхронно. Но когда я пытаюсь так же асинхронно вывести значение - вместо цифр пустота. Причём без ошибок в консоли

JS код вывода следующий:

function getXmlHttp() {
	var xmlHttp;
	try {
		xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlHttp = false;
		}
	}
	if (!xmlHttp && typeof XMLHttpRequest !== 'undefined') {
		xmlHttp = new XMLHttpRequest();
	}
	return xmlHttp;
}

var xmlHttp = getXmlHttp();
var params = "count=" + document.location.href; // берём URL документа для определения кол-ва кликов на данной странице
xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", "counter.php", true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(params);
xmlHttp.onreadystatechange = function() {
	if (this.readyState !== 4) return;
	if (this.status !== 200) return;
}
return xmlHttp.responseText;


PHP код вывода следующий:

$showQuery = $db->query("SELECT `counter` FROM `table` WHERE `url`='{$_POST['count']}' LIMIT 1");

if (!empty($_POST['count'])) 
{

	if ($showQuery->num_rows === 0) 
	{
		echo '0';
	} 
	else 
	{
		$counter = $showQuery->fetch_array();		
		echo $counter['counter'];
	}

}


Подскажите, пожалуйста, почему не работает при таком раскладе? При этом, если поменять значение:
xmlHttp.open("POST", "counter.php", false);

то всё выводится нормально, но боюсь при увеличении БД будет наблюдаться "подвисание" страницы, как написано тут..
Ответить с цитированием
  #2 (permalink)  
Старый 04.01.2014, 17:39
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 912

Строка 28, детка
Ответить с цитированием
  #3 (permalink)  
Старый 04.01.2014, 17:42
Аватар для Vikky
Интересующийся
Отправить личное сообщение для Vikky Посмотреть профиль Найти все сообщения от Vikky
 
Регистрация: 31.12.2013
Сообщений: 14

Сообщение от Rise Посмотреть сообщение
Строка 28, детка
А что не так-то с ней? Почему точно такой же код, но с другим POST-параметром отправляет "+1" в БД при клике "на ура", а выводить не хочет?
Ответить с цитированием
  #4 (permalink)  
Старый 04.01.2014, 17:46
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 912

Очевидно потому что этот параметр не для красоты там есть...
Ответить с цитированием
  #5 (permalink)  
Старый 04.01.2014, 17:49
Аватар для Vikky
Интересующийся
Отправить личное сообщение для Vikky Посмотреть профиль Найти все сообщения от Vikky
 
Регистрация: 31.12.2013
Сообщений: 14

Сообщение от Rise Посмотреть сообщение
Очевидно потому что этот параметр не для красоты там есть...
Решительно не понимаю о чём идёт речь.. или зайти с этим вопросом позже, когда адекватные жители форума с праздников выйдут? ОК.
Ответить с цитированием
  #6 (permalink)  
Старый 04.01.2014, 18:00
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Vikky, на то она и асинхронность, что твой код не останавливается, дожидаясь ответа, а продолжает выполняться дальше. А это значит что return responseText выполнится тутже, когда запрос даже еще не дошел до сервера!
Решение - используй callback-функции. Схожая тема: Как получить переменную после пост.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 04.01.2014, 18:31
Аватар для Vikky
Интересующийся
Отправить личное сообщение для Vikky Посмотреть профиль Найти все сообщения от Vikky
 
Регистрация: 31.12.2013
Сообщений: 14

Сообщение от danik.js Посмотреть сообщение
Vikky, на то она и асинхронность, что твой код не останавливается, дожидаясь ответа, а продолжает выполняться дальше. А это значит что return responseText выполнится тутже, когда запрос даже еще не дошел до сервера!
Решение - используй callback-функции. Схожая тема: Как получить переменную после пост.
Именно не поняв ничего в том топике - я этот и создал..

Просто не понимаю: как может быть, что
xmlHttp.onreadystatechange = function() {
	if (xmlHttp.readyState !== 4) return;
	
	if (xmlHttp.status === 200) {
		alert(xmlHttp.responseText);
	}
}

выводит значение из БД во всплывающем окошке, а просто на страницу - нет..

Последний раз редактировалось Vikky, 04.01.2014 в 18:35.
Ответить с цитированием
  #8 (permalink)  
Старый 04.01.2014, 18:35
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Vikky
а просто на страницу
просто - это как? Ну напиши document.write(xmlHttp.responseText) - выведет просто на страницу.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 04.01.2014, 20:34
Аватар для Vikky
Интересующийся
Отправить личное сообщение для Vikky Посмотреть профиль Найти все сообщения от Vikky
 
Регистрация: 31.12.2013
Сообщений: 14

Сообщение от danik.js Посмотреть сообщение
просто - это как? Ну напиши document.write(xmlHttp.responseText) - выведет просто на страницу.
Просто так, это если всё обёрнуто в функцию и нужно выводить в совершенно другом месте.

JS:
...
function myFunction() {
	var xmlHttp = getXmlHttp();
	var params = "count=" + document.location.href;
	xmlHttp = new XMLHttpRequest();
	xmlHttp.open("POST", "counter.php", true);
	xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xmlHttp.send(params);
	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState !== 4) return;
		if (xmlHttp.status == 200) {
			return xmlHttp.responseText;
		}
	}
}
...
...
...
document.getElementById("myID").innerHTML = myFunction();
...
...


В таком варианте даёт undefined вместо пустой строки.

Последний раз редактировалось Vikky, 04.01.2014 в 21:55.
Ответить с цитированием
  #10 (permalink)  
Старый 04.01.2014, 23:26
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Vikky
return xmlHttp.responseText;
Эта конструкция вернет результат в то место, откуда была вызвана функция (это основы программирования). Внимание, вопрос: где происходит вызов этой функции? И соответственно куда улетит возвращаемое значение?

Чтоб ты понимал пример по-проще:

var fn = function() {
    return 'abc';
};


var result = fn(); // тут вызов функции, return вернет значение вот прям в эту строчку, в место вызова функции.
__________________
В личку только с интересными предложениями

Последний раз редактировалось danik.js, 04.01.2014 в 23:29.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
javascript + mysql вывод данных frixer Общие вопросы Javascript 1 22.08.2012 10:40
Вывод данных из базы в цикле со ссылкой на всплывающее окно alexvb Events/DOM/Window 14 10.02.2012 16:16
обновление и вывод из базы данных sarkis AJAX и COMET 1 02.12.2011 04:37
Вывод данных в Друпал 6 из MySQL, небольшая работа torquemada Работа 1 22.05.2011 17:05
Вывод данных из mysql Евген AJAX и COMET 3 22.08.2010 17:55