Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.05.2015, 23:16
Аватар для apolon13
Интересующийся
Отправить личное сообщение для apolon13 Посмотреть профиль Найти все сообщения от apolon13
 
Регистрация: 24.04.2015
Сообщений: 28

Не могу вытащить данные из БД
Доброго времени суток.
Столкнулся я с такой проблемой.
При попытке вытащить данные из бд получаю пустоту.
вот код:HTML
<body>
	<div class="container"><ul>
	<li><a href="id1">Товары для отдыха</a></li>
	<li><a href="id2">Товары для дома</a></li>
	<li><a href="id3">Специальные ножи</a></li>
	<li><a href="id4">Детские санки</a></li>
	</ul>
	</div>
	<div style="clear: both;"></div>
	<div id="container2" class="container"></div>
	<div style="clear: both;"></div>
	<div id="container3" class="container"></div>
	
	
</body>


Вот тут код ajax запроса

$(document).ready(function(){
  
  
  $('.container:not(:first)').hide();
  
$('.container a').click(function(e){
var res = $(this).attr('href');
	$.ajax({
	  type: "POST",
	  url: "ajax.php",
	  data:"id="+ res,
	  success: function(data)
	  {		
		$('#container2').hide().html(data).fadeIn(200);		
		return false	
	  }
		});
		return false
	});
	
	$('#container2').live('click', function(){
	var res = $(this).attr('href');
	$.ajax({
	  type: "POST",
	  url: "ajax.php",
	  data:"id="+ res,
	  success: function(data)
	  {		
		alert(data);
		return false	
	  }
		});
		return false
	
});
ну и вот самый наипростейший php обработчик
[PHP] 
	if(isset($_POST['id'])){
	$a = $_POST['id'];}
	
	$inter = preg_replace("/\D/","",$a);
	if(isset($inter))
	{$db=mysql_connect('localhost','root','root');
	mysql_select_db('r5409416_apolon',$db);
	$result = mysql_query("SELECT links FROM links WHERE id=".$inter ,$db);
	$q=mysql_fetch_array($result);
	printf ("%s",$q['links']);	
	}
	
	
[/PHP]

Ну так вся СОЛЬ вот в чём.
при попытке запросить из бд записи по id у ссылок,которые пришли тоже из БД
Я получаю в alert(Пустоту)!
А для работы с новыми элементами я использую 
[JS]$('#container2').live('click', function(){
	var res = $(this).attr('href');
	$.ajax({
	  type: "POST",
	  url: "ajax.php",
	  data:"id="+ res,
	  success: function(data)
	  {		
		alert(data);
		return false	
	  }
		});
		return false
хотя метод .live вроде бы уже и не используется.

В общем помогите кто как может пжлс.
работать с ajax я только учусь и ничего не понимаю

Есть ссылка даже на сам мини http://r5409416.bget.ru/

Последний раз редактировалось apolon13, 02.05.2015 в 23:33.
Ответить с цитированием
  #2 (permalink)  
Старый 03.05.2015, 00:28
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Зачем href="id1", просто цифры (если нет иных параметров запроса в url, иначе лучше использовать data для задания id), да и в случае, если url будет содержать иные цифры кроме указанных в href ссылок, то номер id будет неверным.
<li><a href="1">Товары для отдыха</a></li>
<li><a href="2">Товары для дома</a></li>
<li><a href="3">Специальные ножи</a></li>
<li><a href="4">Детские санки</a></li>

Метод .leve() устарел, да и этот метод для динамически создаваемых элементов, если список UL со ссылками всегда на странице, то он не нужен и достаточно .click(). Иначе метод .on() с делегированием обработки события onclick ближайшему родителю гарантировано присутствующему на странице.

$('.container a').click(function(e) {
        e.preventDefault();
        $.ajax({
            type: "POST",
            url: "ajax.php",
            data:"id="+this.href.split('/').pop(),
            success: function(data) {    
                $('#container2').hide().html(data).fadeIn(200);    
            }
        });
    });

Зачем повторять такое же $('#container2') не понятно, нужно все привести к одному обработчику.
На стороне сервера так:
а) если ajax.php обрабатывает только эти запросы по параметру id, то не надо никаких isset($_POST['id']), а нужно проверять истинность параметра, ибо работа этого скрипта начнется только именно по POST запросу. Кроме того, даже если поступать так, то уже не if(isset($inter)), а if($inter).
б) если ajax.php обрабатывает различные запросы по различным ключам, то нужно определять имя ключа, тут уже можно и isset($_POST['id']), и switch по ключам, и т.п...
Если а), то:
if($id = (int)$_POST['id']) {
    //запрос к базе
    //только что может дать
    printf ("%s",$q['links']);
    //кроме самих значений полей для html, конечно, если база не хранит html-кода
} //иначе параметр не id

Последний раз редактировалось laimas, 03.05.2015 в 00:48.
Ответить с цитированием
  #3 (permalink)  
Старый 03.05.2015, 10:22
Аватар для apolon13
Интересующийся
Отправить личное сообщение для apolon13 Посмотреть профиль Найти все сообщения от apolon13
 
Регистрация: 24.04.2015
Сообщений: 28

laimas,
Цитата:
Метод .leve() устарел, да и этот метод для динамически создаваемых элементов, если список UL со ссылками всегда на странице, то он не нужен и достаточно .click(). Иначе метод .on() с делегированием обработки события onclick ближайшему родителю гарантировано присутствующему на странице.
Так в том и дело что список ul с ссылками приходит из БД со своими id, значение которых соответствует id следующего уровня ссылок.И в итоге надо получить 5 уровней каталога.Но на 2-ом уровне всё встаёт.
и задача состоит в том что бы прицепить ajax к любым приходящим из бд ссылкам.

но метод .on не работает,как уж только я не пробовал.
вот например даже тут preventDefault не срабатывает.
Пробовал в различных вариантах
облазил кучу форумов
по сути должно работать.
Но не работает
Может быть я где то сильно ошибаюсь
$('.container:not(:first)').hide();
  
  $('.container a').click(function(e) {
        e.preventDefault();
        $.ajax({
            type: "POST",
            url: "ajax.php",
            data:"id="+this.href.split('/').pop(),
            success: function(data) {    
                $('#container2').hide().html(data).fadeIn(200); 
					$(document).on("click", "#container2 a", function(e) {
				e.preventDefault();
				});					
            }
        });
    });

Последний раз редактировалось apolon13, 03.05.2015 в 10:34.
Ответить с цитированием
  #4 (permalink)  
Старый 03.05.2015, 10:33
Аватар для apolon13
Интересующийся
Отправить личное сообщение для apolon13 Посмотреть профиль Найти все сообщения от apolon13
 
Регистрация: 24.04.2015
Сообщений: 28

Цитата:
Зачем повторять такое же $('#container2') не понятно, нужно все привести к одному обработчику.
Согласен.
Повторять обработчик глупо.
Ответить с цитированием
  #5 (permalink)  
Старый 03.05.2015, 12:49
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

но метод .on не работает,как уж только я не пробовал.

Не так нужно устанавливать обработчики для ссылок контейнера '#container2'. Если таком образом как:

$(document).on("click", "#container2 a", function(e) ...

то это нужно было прописать в $(document).ready(function()...

А при получении их в success так:

$('#container2').hide()
                .html(data)
                .fadeIn(200)
                .find('a')
                .click(function(e) {
                    e.preventDefault();
                    //.....
                });
Ответить с цитированием
  #6 (permalink)  
Старый 03.05.2015, 13:11
Аватар для apolon13
Интересующийся
Отправить личное сообщение для apolon13 Посмотреть профиль Найти все сообщения от apolon13
 
Регистрация: 24.04.2015
Сообщений: 28

laimas,
Всё понял
Тут огромное пасибо что разъяснил.

Но по сути сейчас ajax должен автоматически подцеплять ссылки пришедшие из бд.
Но этого не происходит.
При клике на ссылку например с id 11
Он должен вытащить из бд ещё список и вставить его в #container2, т.е заменить его html код
Но браузер молчит, ничего не происходит.
Ответить с цитированием
  #7 (permalink)  
Старый 03.05.2015, 13:13
Аватар для apolon13
Интересующийся
Отправить личное сообщение для apolon13 Посмотреть профиль Найти все сообщения от apolon13
 
Регистрация: 24.04.2015
Сообщений: 28

laimas,
Ведь как я понимаю нового post запроса не нужно формировать
Ответить с цитированием
  #8 (permalink)  
Старый 03.05.2015, 14:48
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

У вас код:
<div id="container2" class="container"></div>
<div id="container3" class="container"></div>

То есть элементы с классом container всегда на странице, я правильно понимаю? А если так, что объявление обработчиков нужно производить сразу при загрузке страницы:

$('.container').on('click' 'a', function(e) {
     e.preventDefault();
     //и далее запрос 
     //$.ajax ....
});


удалив установку их bp success, то есть в нем останется только:

$('#container2').hide().html(data).fadeIn(200);

И события у ссылок будут обрабатываться, это можно проверить и посредством alert. Проверьте.
Ответить с цитированием
  #9 (permalink)  
Старый 03.05.2015, 16:12
Аватар для apolon13
Интересующийся
Отправить личное сообщение для apolon13 Посмотреть профиль Найти все сообщения от apolon13
 
Регистрация: 24.04.2015
Сообщений: 28

laimas,
Да,верно, класс .container присутствует везде.

В конечном итоге если я всё правильно понял,получился такой код;
$(document).ready(function(){
  
  
  $('.container:not(:first)').hide();
  
  $('.container').on('click','a',function(e) {
        e.preventDefault();
        $.ajax({
            type: "POST",
            url: "ajax.php",
            data:"id="+this.href.split('/').pop(),
            success: function(data) {    
                $('#container2').hide().html(data).fadeIn(200);			
            }
			});
        
    });
  
	
});


но теперь просто при клике на любую ссылку он просто по ней переходит.
т.е e.preventDefault(); уже как минимум не работатет.

И в консоли еще ошибка Uncaught TypeError: $(...).on is not a function

Вот беда
Ответить с цитированием
  #10 (permalink)  
Старый 03.05.2015, 16:25
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

<html> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script> 
$(function() {
    $('a').click(function(e) {
        e.preventDefault();
        alert('Нет, не будет!')
    })
});
</script>     
</head> 
<body>
<a href="!55536!http://javascript.ru/forum/ajax/55536-ne-mogu-vytashhit-dannye-iz-bd.html#post369286">Переход будет?</a>
</body> 
</html>

Пробуйте.
Какая версия jQuery используется?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вытащить данные из массива Влад_имир jQuery 45 07.04.2015 22:33
Вытащить данные в алерт maximus2011 jQuery 5 22.08.2014 16:15
Не могу отправить данные на сервер dmitry111 Общие вопросы Javascript 2 20.02.2013 11:24
Не могу вытащить массив из объекта по указателю из самого объекта bunta Общие вопросы Javascript 3 09.09.2010 18:44
Помогите вытащить из таблицы данные... MD6 Общие вопросы Javascript 1 07.10.2008 13:03