jQuery и Ajax, загрузка только одного элемента из базы данных - PullRequest
1 голос
/ 08 октября 2009

Пожалуйста, посмотрите на этот код:

$('ul#navigation li ul li>a').click(function(){
    var active = $(this).text();
    $('#artcontent p').empty();
    $.ajax({
        type: 'POST',
        url: 'homepage/readarticle',
        data: $(active).serialize(),
        success: function(databack){
           $('#loading').fadeOut('normal');
           $('#artcontent').append(databack);
        }
    })
});


function readarticle()
{
    $articlename = $this->input->post('active');
    $output = $this->articles->displayby_name($articlename);

    if($output){
        $data['article'] = $output;
    }
    $this->load->view('loadarticle',$data);
}

Это функция на сервере.

У меня есть ul li a, которые являются дочерними элементами родительской навигации ul и li. То, что я пытаюсь сделать, это загрузить страницу статьи. Это работает, но читает базу данных и загружает все статьи в моей базе данных, а не те, которые были идентифицированы как активные. Я хотел бы знать, что я делаю неправильно, или есть лучший способ сделать это?

ОК, «домашняя страница / readarticle» - это «контроллер / метод» в моем контроллере CodeIgniter, который загружает представление, отображающее статью.

Что касается строки сериализации, я фактически включил ее без сериализации и мог поймать текст ссылки с Firebug, используя обычный console.log(). Как я уже сказал, он хорошо читает статьи, но читает все статьи из моей базы данных, а не выбирает ту, чей заголовок равен имени в активной переменной (это будет текст ссылки, например, см. . См. Текст.)

ОК, позвольте мне добавить код, который обрабатывает это также из модели, которая является последней частью в:

<?php
    function displayby_name($name) { $this->db->select("articletitle,articlebody,articleauthor");
    $this->db->from('articles'); $this->db->where('articletitle',$name);
    $Q = $this->db->get(); if($Q->num_rows() > 0){ $text = $Q->result_array(); }
    echo $this->db->last_query();
    return $text; }
?>

Есть еще мысли?

Ответы [ 3 ]

2 голосов
/ 08 октября 2009

$(active).serialize() приведет к пустой строке. Вы, вероятно, хотите удалить строку data: $(active).serialize(), и сделать что-то вроде url: 'homepage/readarticle/' + encodeURIComponent(active),, в зависимости от того, что ожидает ваше серверное приложение.

Edit:

На основе серверного кода, который вы только что добавили в свой вопрос, ваш код должен работать, если вы замените data: $(active).serialize(), на data: {active: active},.

Другое Править:

Ну, я позволил себе попытаться воссоздать ваши настройки. И мой код работает нормально (насколько я понял ваше предполагаемое поведение).

Ниже приведено мое приложение CodeIgniter. Может показаться, что кода много, но всего ~ 120 строк, так что не обращайте на меня внимания . Прочитайте его и попробуйте запустить его, если можете. Если это не поможет, добавьте комментарий, и я могу вам помочь, поскольку у меня есть настройки сейчас.

+---controllers
|       homepage.php
|
+---models
|       articles.php
|
\---views
        homepage.php
        loadarticle.php
Контроллеры \ homepage.php:
<?php
class Homepage extends Controller {
  function Homepage()
  {
    parent::Controller();   
    $this->load->model('articles');
  }

  function index()
  {
    $output = $this->articles->display_all();

    $data['articles'] = $output;
    $this->load->view('homepage', $data);
  }

  function readarticle()
  {
    $articlename = $this->input->post('active');
    $output = $this->articles->displayby_name($articlename);

    if($output){
      $data['articles'] = $output;
    }
    $this->load->view('loadarticle', $data);
  }
}
Модели \ articles.php
<?php
class Articles extends Model {
    function Articles()
    {
        parent::Model();    
    }

  function display_all() {
    $this->db->select("articletitle"); 
    $this->db->from('articles');
    $Q = $this->db->get();
    $results = array();
    if ($Q->num_rows() > 0) {
      $results = $Q->result_array();
    } 
    return $results;
  }

  function displayby_name($name) {
    $this->db->select("articletitle, articlebody, articleauthor"); 
    $this->db->from('articles');
    $this->db->where('articletitle', $name); 
    $Q = $this->db->get();
    if ($Q->num_rows() > 0) {
      $text = $Q->result_array();
    } 
    return $text;
  }
}
просмотров \ homepage.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Homepage</title>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <style type="text/css" media="screen">
      #navigation { float: left; padding: 1em; }
      #loading { 
        display: block; position: absolute;
        top: 0; left: 50%; display: none; width: 8em; margin-left: -4em;
      }
      #artcontent { padding: 2em; }
    </style>
  </head>
  <body>
    <ul id="navigation">
      <li>
        <span>Articles:</span>
        <ul>
          <?php foreach ($articles as $article): ?>
          <li><a href="#"><?php echo $article['articletitle']; ?></a></li>
          <?php endforeach; ?>
        </ul>
      </li>
    </ul>
    <span id="loading">Loading...</span>
    <div id="artcontent"><p></p></div>
    <script>
      $('ul#navigation li ul li>a').click(function(){
        var active = $(this).text();
        $('#artcontent').empty();
        $('#loading').show();
        $.ajax({
          type: 'POST',
          url: 'homepage/readarticle',
          data: {active: active},
          success: function(databack){
            $('#loading').fadeOut('normal');
            $('#artcontent').append(databack);
          }  
        });
        return false;
      });
    </script>
  </body>
</html>
просмотров \ loadarticle.php
<?php foreach ($articles as $article): ?>
<h2><?php echo $article['articletitle']; ?></h2>
by <span><?php echo $article['articleauthor']; ?></span>
<p><?php echo $article['articlebody']; ?></p>
<?php endforeach; ?>
Структура MySQL и пример данных
CREATE TABLE IF NOT EXISTS `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `articletitle` varchar(200) NOT NULL,
  `articlebody` text NOT NULL,
  `articleauthor` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `articles` (`id`, `articletitle`, `articlebody`, `articleauthor`)
VALUES
(1, 'foo', 'body foo body', 'author foo author'),
(2, 'bar', 'body bar body', 'author bar author'),
(3, 'baz', 'body baz body', 'author baz author');
1 голос
/ 08 октября 2009

Я бы начал с установки расширения Firebug для firefox, а не с отладки ваших AJAX-запросов (Firebug позволяет вам отслеживать все детали, например, какие данные на самом деле отправляются, какой код ответа и тело и т. Д.) Я больше не могу вам помочь, так как не знаю структуру документа HTML ... особенно его часть: var active = $(this).text(); ... data: $(active).serialize() Я не думаю, что строка data: $(active).serialize() верна ... вы можете объяснить, что вы действительно хотели сделать? Кроме того, размещение ссылки может помочь ... `

0 голосов
/ 08 октября 2009

Будет полезно, если вы также разместите код контроллера в своем приложении (код, который обрабатывает запрос).Он ожидает POST-запрос с переменными или GET-запрос к URL-адресу, содержащему идентификатор статьи?

Как уже упоминалось в предыдущем постере, вы сериализуете строку;Обычно и имеет смысл сериализовать ассоциативный массив (dict, object, hash ... выберите ваше имя).Например, можно ожидать сериализации чего-то похожего на {'articleid': 1}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...