veritabanından jQuery ve Ajax, yükleme yalnızca bir öğe

2 Cevap php

Bu kod bakmak Lütfen:

$('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);
}

Bu sunucu üzerinde işlevdir.

Ben ebeveyn ul navigasyon ve li çocukları olan bir ul li a sahiptir. Ne yapmaya çalışıyorum bir makale sayfasını yüklemek için. Bu çalışır ancak bunun yerine aktif tespit birinin benim veritabanında tüm makaleleri veritabanı ve yükleri okur. Ben yanlış ne yapıyorum bilmek istiyorum ya da bu konuda gitmek için daha iyi bir yolu var mı?

Tamam, 'anasayfası / readarticle' makaleyi işler görünümü yükler benim CodeIgniter denetleyicisi 'kontrolörü / yöntemi' olduğunu.

Serialize çizgi gelince, ben aslında, tefrika olmaksızın aktif koymak ve olağan console.log() kullanarak Kundakçı ile bağlantı metnini yakalamak olabilir. Dediğim gibi, bu makaleleri tamam okur, ancak bunun yerine unvanı aktif değişkeninde adına eşit olan (yani örneğin, böylece bağlantı metni olacaktır birini getiriliyor benim veritabanındaki tüm makaleleri okur ., bu metin bakın.)

Tamam, beni de son parça olan modeli de bu işler kodu ekleyelim:

<?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; }
?>

Hala herhangi bir düşünce?

2 Cevap

$(active).serialize(), boş bir dize neden olacaktır. Muhtemelen data: $(active).serialize(), satırı kaldırmak ve sunucu tarafı uygulama bekliyor ne bağlı olarak, url: 'homepage/readarticle/' + encodeURIComponent(active), gibi bir şey yapmak istiyorum.

Edit:

Eğer data: {active: active}, ile data: $(active).serialize(), olarak değiştirin eğer sadece soruya eklenen sunucu tarafı kod dayanarak, kod çalışır.

Another Edit:

Peki, senin kurulum yeniden girişimi için özgürlük aldım. Ve benim kod (bildiğim kadarıyla amaçlanan davranış anladım gibi) iyi çalışıyor.

Aşağıdaki benim CodeIgniter uygulamasıdır. It might look like a lot of code but it's only ~120 lines in total, so bare with me. Bunu okuyun ve eğer çalıştırmayı deneyin. Bu işe yaramazsa, bir yorum eklemek ve ben şimdi kurulum beri ben oradan size yardımcı olabilir.

+---controllers
|       homepage.php
|
+---models
|       articles.php
|
\---views
        homepage.php
        loadarticle.php
controllers\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);
  }
}
models\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;
  }
}
views\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>
views\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 structure and sample data
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');

Ayrıca app (isteği kolları code) denetleyicisi kod göndermek eğer yardımcı olacaktır. Değişkenler ile bir POST isteği bekliyor, ya da makale id içeren bir url bir GET isteği bekliyor?

As a previous poster has mentioned, you are serialising a string; It is common, and more meaningful to serialise an associative array (dict, object, hash... choose your name). For example, one would expect to serialise something similar to {'articleid':1}.