2011-07-17 12 views
1

J'ai un site PHP que je construis et je semble avoir quelques problèmes de rendu. J'ai mon site divisé en plusieurs parties, telles que Header.php, sidebar.php et footer.php. Toutes mes catégories rendent dans la barre latérale aucun problème, mais quand j'essaye de rendre les produits pour la catégorie choisie et la page ne rend pas la page complète. J'ai une base de données simple avec des catégories et des produits.La page PHP ne rend pas correctement

Voici le code de mes fichiers connect_db.php, categories_db.php et products_db.php, qui gèrent tous les éléments de la base de données.

REMARQUE: que je peux obtenir mon fichier product_list.php si je ne fais que l'affichage de tous les produits, mais que j'ai besoin de rendre les produits de la catégorie sélectionnée dans la barre latérale.

Ci-dessous mon index.php ou la vue principale

<?php 
error_reporting(-1); 
ini_set('display_errors', 1); 

require('models/connect_db.php'); 
require('models/categories_db.php'); 
require('models/products_db.php'); 

$categories = get_categories(); 

if (!isset($category_id)) { 
    $category_id = 1; 
} 
else { 
    $category_id = $_GET['category_id']; 
} 
// get all products by category 
$products = get_products_by_category($category_id); 

?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <?php include('views/layout/head.php');?> 
    </head> 
    <body> 
     <!-- Wrapper --> 
     <div class="wrapper"> 
      <!-- Header --> 
      <?php include('views/layout/header.php');?> 

      <!-- Main --> 
      <div id="main"> 
       <div class="cl">&nbsp;</div> 

       <!-- Content --> 
       <div id="content"> 
       <?php include('views/product_list.php');?> 
       </div> 
       <!-- End Content --> 

       <!-- Sidebar --> 
       <?php include('views/layout/sidebar.php');?> 
      </div> 
      <!-- End Main --> 

      <!-- Footer --> 
      <?php include('views/layout/footer.php');?> 
     </div> 
     <!-- End Wrapper --> 
    </body> 
</html> 

Maintenant, la barre latérale rend correctement les catégories, mais quand je clique sur une catégorie, il ne rendra pas le product_list.php, comme prévu.

Ma barre latérale charge correctement toutes les catégories et le code est ci-dessous.

<?php 
    $categories; 
    $categories = get_categories(); 

    $category_id = $_GET['category_id']; 
    if (!isset($category_id)) { 
     $category_id = 1; 
    } 
?> 
<div id="sidebar"> 

    <!-- Categories --> 

    <div class="box categories"> 
     <h2>Categories </h2> 
     <div class="box-content"> 
      <ul> 
       <!-- get category menu items --> 
       <?php foreach($categories as $category) : ?> 
       <li><a href="?category_id=<?php echo $category['category_id'];?>"> 
         <?php echo $category['name'];?> 
        </a> 
       </li> 
       <?php endforeach; ?> 
      </ul> 
     </div> 
    </div> 

    <!-- End Categories --> 

</div> 
<!-- End Sidebar --> 

<div class="cl">&nbsp;</div> 

Maintenant pour le fichier product_list.php qui ne s'affichera pas.

<?php 

// get all products by category 
$products = get_products_by_category($category_id); 

// get category name 
$category_name = get_category_name($category_id); 

?> 

<!-- Products --> 
<div class="products"> 
    <div class="cl">&nbsp;</div> 
    <ul> 
     <?php foreach($products as $product) : ?> 
     <li> 
      <a href="#"><img src="css/images/big1.jpg" alt="" /></a> 
      <div class="product-info"> 
       <h3><?php echo $product['name'];?></h3> 

       <div class="product-desc"> 
        <h4><?php echo $category_name;?></h4> 
        <p><?php echo $product['description'];?></p> 
        <strong class="price"><?php echo $product['price'];?></strong> 
       </div> 
      </div> 
     </li> 
     <?php endforeach; ?> 
    </ul> 
    <div class="cl">&nbsp;</div> 
</div> 
<!-- End Products --> 

Je ne suis pas sûr que ce soit parce que le category_id $ ne se définir ou quoi, s'il vous plaît quelqu'un me aider à franchir ce problème.

ERREURS:

Indication: variable non définie: category_id en /var/www/WidgetCorp/views/product_list.php sur la ligne 4

Indication: Undefined variable: category_id dans/var/www/WidgetCorp/vues/product_list.php sur la ligne 7

erreur fatale: Appel à la méthode non définie PDO :: fetch() dans /var/www/WidgetCorp/models/categories_db.php en ligne 22

+4

puh, c'est beaucoup de code ... –

+1

Wayyyy trop de code là. Que voulez-vous dire par «ne rend pas»? Avez-vous des erreurs? Est-ce que ça ne s'affiche pas comme tu veux? – Mat

+0

désolé ... Je voulais que ce soit complet .... Des idées? –

Répondre

1

Je crois que le problème est vous incluez le fichier sidebar.php APRÈS le product_lis Fichier t.php. Product_list.php fait référence à $ category_id, mais $ category_id ne semble pas être inclus avant le fichier sidebar.php. Donc, vous essayez de passer une variable indéfinie à vos diverses fonctions, et cela engendre une erreur.

Une partie de ce problème est que vous avez mal configuré vos ressources. Essayez de placer tout le code en haut de vos fichiers modèles (ce qui saisit les données dont vous avez besoin), afin de le séparer de votre code de présentation.

En ce qui concerne votre commentaire, l'ordre du code doit retourner à quelque chose comme ceci:

<?php 
/* sidebar.php */ 
$categories; 
$categories = get_categories(); 

$category_id = $_GET['category_id']; 
if (!isset($category_id)) { 
    $category_id = 1; 
} 
/* product_list.php */ 
// get all products by category 
$products = get_products_by_category($category_id); 

// get category name 
$category_name = get_category_name($category_id); 
+0

J'ai essayé d'ajouter tout le code au début de mon fichier index.php, et je reçois toujours les mêmes erreurs. –

+0

as-tu veillé à mettre le code de la barre latérale AU-DESSUS du code de product_list.php? – jacobangel

+0

Je continue d'obtenir l'erreur ... Avis: Indéfini index: category_id dans /var/www/WidgetCorp/index.php on line 11 –

1

Ok! Si je comprends bien votre structure, index.php est le script principal qui rend tous les composants - l'en-tête, la barre latérale, les produits et le pied de page. Sidebar.php et product_list.php ne restituent qu'un contenu spécifique.

Maintenant, lorsqu'on clique sur une catégorie, le category_id est passé en paramètre GET à index.php. Lorsque le code inclut "views/product_list".php », il recherche $category_id qui n'existe pas encore (je suppose que « register_globals » est mise hors service) S'il vous plaît essayez d'utiliser $_GET['category_id'] dans les 2 premières déclarations à product_list.php, comme:.

// get all products by category 
$products = get_products_by_category($_GET['category_id']); 

// get category name 
$category_name = get_category_name($_GET['category_id']); 

I a également remarqué que dans sidebar.php, vous utilisez correctement $_GET['category_id'] pour définir $category_id.Cela signifie que $category_id sera disponible dans tout le code suivant.Cependant, puisque "product_list.php" est appelé avant "sidebar.php", $category_id isn ' t disponible dans "product_list.php"

Suggestion supplémentaire

Pour le scénario ci-dessus, il est préférable d'utiliser $_GET['category_id'] dans tous les endroits où la valeur est nécessaire. Cela évite tout conflit ou problème de variable indéfinie. Une autre alternative si vous devez lire $_GET['category_id'] une fois comme dans votre exemple, initialisez $category_id dans le fichier principal "index.php" plutôt que dans l'un des fichiers inclus. Cela garantira que la variable est disponible partout. Par exemple, vous pouvez ajouter ces lignes juste après les 3 premières exigences:

$category_id = 1; 
if (isset($_GET['category_id']) && !empty($_GET['category_id'])) { 
    $category_id = $_GET['category_id']; 
} 

Espérons que l'explication ci-dessus est utile!