2013-01-18 3 views
1

J'ai une page qui contient 4 produits chargés à partir de la base de données, lorsque vous faites défiler vers le bas, vous obtenez 4 produits de plus à chaque fois.Codeigniter éléments en double de la base de données

Ces produits sont chargés de manière aléatoire, le problème sont les produits en double.

Ceci est la ligne que je dans le modèle:

$this->db->order_by('productID', 'RANDOM'); 

Sans cette ligne, tout fonctionne très bien. Je ne peux pas utiliser limit mis à 1 parce que j'ai:

$query = $this->db->get('product', 4, $offset); 

Il y a une façon simple de résoudre ce problème? Je dois faire un tableau qui contient tous les produits?

MISE À JOUR

Voici le script dans le index.php

<script type="text/javascript"> 
$(document).ready(function(){ 

    var products = <?= $get_products ?>; 
    var loaded_products = 0; 

    $(".loadMoreProducts").click(function(){ 
     loaded_products += 4; 

     var dati = "welcome/get_products/" + loaded_products; 

     $.ajax({ 
      url:'welcome/get_products/' + loaded_products, 
      type: 'get', 
      data: dati, 
      cache: false, 
      success: function() { 

      $.get(dati, function(data){ 
       $("#mainContainerProductWelcome").append(data); 
      }); 

      if(loaded_products >= products - 4) { 
       $(".loadMoreProducts").hide(); 
      } else { 
       // load more still visible 
      } 
      }, 
      error: function() { 
      // there's something wrong 
      } 
     }); 

     // show spinner on ajax request starts 
     $(".loading-spinner").ajaxStart(function(){ 
      $(".loading-spinner").show(); 
      $(".text-load").hide(); 
     }); 

     // ajax request complets hide spinner 
     $(".loading-spinner").ajaxStop(function(){ 
      $(".loading-spinner").delay(5000).hide(); 
      $(".text-load").show(); 
     }); 

     return false; 
    }); 

    // submit form contact 
    $(window).scroll(function() { 
    if($(window).scrollTop() + $(window).height() >= $(document).height()) { 
     loaded_products += 4; 

     var dati = "welcome/get_products/" + loaded_products; 

     $.ajax({ 
      url:'welcome/get_products/' + loaded_products, 
      type: 'get', 
      data: dati, 
      cache: false, 
      success: function() { 

      $.get(dati, function(data){ 
       $("#mainContainerProductWelcome").append(data); 
      }); 

      if(loaded_products >= products - 4) { 
       $(".loadMoreProducts").hide(); 
      } else { 
       // load more still visible 
      } 
      }, 
      error: function() { 
      // there's something wrong 
      } 
     }); 

     // show spinner on ajax request starts 
     $(".loading-spinner").ajaxStart(function(){ 
      $(".loading-spinner").show(); 
      $(".text-load").hide(); 
     }); 

     // ajax request complets hide spinner 
     $(".loading-spinner").ajaxStop(function(){ 
      $(".loading-spinner").delay(5000).hide(); 
      $(".text-load").show(); 
     }); 
     return false; 
    } 
}); 

}); 
</script> 
contrôleur

:

function index() 
{ 
    $this->load->helper('url'); 
    $data['description'] = "Description"; 
    $data['keywords'] = "Keywords"; 
    $data['products'] = $this->abitainterni->getAllProductsLimit(); 
    $data['get_products'] = $this->abitainterni->get_products(); 
    //load view 
    $this->load->view('welcome', $data); 
} 

function get_products($offset) 
{ 
    $data['products'] = $this->abitainterni->getAllProductsLimit($offset); 
    $this->load->view('get_products', $data); 
} 

modèle:

function getAllProductsLimit($offset=0) 
{ 
    $sql = "SELECT * FROM product P"; 
    $this->db->order_by('productPosition','ASC'); 
    $query = $this->db->get('product', 4, $offset); 
    if($query->num_rows() > 0){ 
    return $query->result(); 
    } else { 
    return 0; 
    } 
} 

function get_products() 
{ 
    $query = $this->db->count_all_results('product'); 
    return $query; 
} 
+0

Pouvez-vous poster toute requête?Je veux dire, activer le profileur et afficher la requête complète utilisée pour obtenir les produits. –

+0

J'ai mis à jour la question. – simo

Répondre

5

Faire un tableau de reçus ProducstIDs

Par exemple :, Dans la première manche, vous avez productIDs comme (1,5,8,9)

Do comme suit.

$exlude_ids= 1,5,8,9; 

$this->db->where_not_in('productID',$exlude_ids); 

la prochaine fois, ajoutez ces ID à exclude_ids et continuez la boucle.

Je l'ai fait sur un site Web. Donc, si vous avez besoin de plus d'aide, il suffit de commenter.

EDIT

CONTRÔLEUR:

Après l'extraction des quatre premières lignes de produit, ajoutez ces product_ids dans un tableau et passer ce au modèle comme illustré ci-dessous.

par exemple: $exlcude_ids = array(1,5,7,3);

Modèle:

function getAllProductsLimit($offset=0,$exlude_ids=array()) 
{ 
    $this->db->select(*); 
    if(count($exclude_ids)>0) 
    { 
     $this->db->where_not_in('productID',$exlude_ids); 
    } 
    $this->db->order_by('productPosition','ASC'); 
    $query = $this->db->get('product', 4, $offset); 
    if($query->num_rows() > 0) 
    { 
    return $query->result(); 
    } 
    else 
    { 
    return 0; 
    } 
} 
+0

Merci, Maintenant j'essaye de faire ça. Si je ne peux pas je serais heureux si vous m'aidez. – simo

+0

J'ai édité ma réponse s'il vous plaît vérifier. Réponds-moi si tu as d'autres questions .. :) J'espère que cela t'aidera. :) –

+0

Qu'en est-il du contrôleur? Je dois exploser() '$ exclude_ids' et le passer au modèle avec $ data ['products'] = $ this-> db-> getAllProductsLimit ($ offset, $ exclude_ids);' comment allez-vous? – simo

3

Vous devriez le faire comme ça. Lorsque vous exécutez la requête pour la première fois, définissez un tableau.
Maintenant, lorsque vous obtenez les résultats (4 lignes) et affichez les enregistrements mettre les identifiants de ces enregistrements dans un tableau javascript. Vous devez utiliser ajax pour faire défiler et extraire plus de résultats. La prochaine fois que vous voulez exécuter la requête d'abord envoyer le tableau javascript, php utiliser json. PHP va obtenir json encoded array .decode. si sa longueur est égale à 0 alors lancez une requête simple. Exécutez WHERE productID NOT IN ($array). De cette façon, vous serez capable de le faire.

+0

Merci pour votre soutien, j'ai mis à jour ma question, pouvez-vous m'aider à faire cela? – simo

Questions connexes