Pas un pas deux mais trois probleme pour le prix d'un !! ( php et html)

Résolu/Fermé
yvesman - 4 oct. 2021 à 11:36
 yvesman - 28 oct. 2021 à 08:55
Bonjour,

je travaille sur un script visant a afficher des images avec nom du produit photo description prix mais j'ai 3 problemes :

1) je voudrais aligner les photos l'es une a cote des autres ( par rangee de 4 photos par ligne )

2) je voudrais que le texte revienne à la ligne

3 ) les images changent a chaque maj de la page je voudrais stabiliser ca (php)

4 ) question bonus : je cherche un systeme de pagination qui marche !!

(j'en peux plus de trouver des codes remplies d'erreurs)

vous verrez dans le code que j'ai essaye plusieurs pistes mais qui ne marchent pas

ps :je debute en html php merci de m'aider

voila le code :

 
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="/css/style.css" />
<link rel="stylesheet" href="/css/design.css" />
<script src="/js/jquery.min.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<title>Articles</title>
</head>
<body>
<h1>articles :</h1>

<?php
// Connect to database
include("db_connect_mysqli.php");
// recherche du texte
$sql = "SELECT * FROM produits";
$result = mysqli_query($conn, $sql);
//recherche de l'image
require_once("db_connect_mysqli.php");
$sql_2 = "SELECT name FROM file";
$req = mysqli_query($conn, $sql_2);
?>
<div class="style" "Page de travail"></div>
<span style="max-width:350px;">
<div class="bloc">
<table>
<?php
// condition texte
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_array($result)) {
?>
<tbody>
<tr>
<pre>
<div class="boxgrid caption" color="#fff" >
<td>
<h3><?php echo $row['name'];?></h3>
</td>
<br/>
<td>
<?php
// mise en place image
$path = 'upload/'; // chemin vers le dossier contenant tes images (ne pas oublier le slash final)
$tab = scandir($path); // Place tes images dans un tableau
$tab = array_slice($tab, 2); // J'avais oublie que scandir listait . et .. donc on les vires aussi
//shuffle($tab); // Mélange le tableau
$tab = array_slice($tab, 1, 1); // Garde les 3 premières images
// on fait une boucle du tableau pour l'affichage
foreach($tab as $img)
{
echo '<div class="float_foto"><img src="'.$path.$img.'" alt="" width="300px" ><br/> ';
echo '</div>'; // fin disclass float foto
} // fin foreach
?>

</td>
<br/>
<td>
<p><?php echo $row['description']; ?></p>
</td>
<br/>
<td>
<p><?php echo $row['price']; echo '€'; ?></p>
</td>
</pre>
<br/>
</div> <!-- fin div class boxgrid -->
</tr>
</tbody>
<?php
} // fin while #2
} // fin if
?>
</table>
</div> <!-- fin div class bloc -->
</span>
</body>
</html>
A voir également:

10 réponses

up
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
6 oct. 2021 à 17:51
Bonjour,

Concernant les questions 1 et 2, ceci concerne le code CSS, or nous n'avons pas accès à ce code sur l'exemple.
Pour pouvoir aider sur ces deux questions, il faudrait partager le code HTML affiché dans le navigateur (sans code PHP) ainsi que le code CSS utilisé sur la page.

Concernant la question 3, pas sûr d'avoir bien compris le soucis.
Les images changent lorsque les fichiers dans le dossier upload sont modifiés ?
Dans les commentaires, il est indiqué "Garde les 3 premières images" mais avec les paramètres fournis dans la deuxième utilisation de array_slice, celle-ci devrait retourner seulement une seule image.
Tu pourrais surement simplifier cette partie en utilisant la fonction PHP glob() et une simple boucle for.

Enfin concernant la question bonus, pourquoi ne pas implémenter ton propre système de pagination ? Tu devrais facilement pouvoir trouver pleins de tutoriel à ce sujet.

Bonne journée,
0
question 1-2
voila le code css qui est quasiment vide:

table {
    min-width : 10% ; 
    max-width : 30% ;  
    width : 50px;
}
tr {
    min-width : 10% ; 
    max-width : 30% ;  
    width: -moz-max-content;
}
td {
    min-width : 10% ; 
    max-width : 30% ;  
    width: -moz-max-content;
    width: 50px ;
}


question3

j'ai essaye PHP glob() mais rien ne s'affiche

 // mise en place image
       $path = 'upload/'; // chemin vers le dossier contenant tes images (ne pas oublier le slash final)
      
      // $tab = scandir($path); // Place tes images dans un tableau
    //   $tab = array_slice($tab, 2); // J'avais oublie que scandir listait . et .. donc on les vires aussi 
       /*
  //   shuffle($tab); // Mélange le tableau  


*/    //   $tab = array_slice($tab, 1, 1); 
// Garde les 3 premières images      
//on  fait une boucle du tableau pour l'affichage      
// foreach (glob("*.jpg") as $img)     
 //foreach ($tab as $img)    
 //  foreach ($img as $img)  
// condition texte   
 if (mysqli_num_rows($result) > 0) {   
  while ($row = mysqli_fetch_array($result)) {  
  ?>      
<!--  <tbody> -->           
<!--  <pre> -->        
   <!--  <div class="boxgrid caption" color="#fff" > -->         
   <td>
<tr>       
<?php          
  echo '<div class="float_foto"><img src="'.$path.$img.'" alt=""  width="300px" ><br/>  ';        echo '</div>'; // fin disclass float foto        ?>       </td></tr>       <td><tr>       <p><?php  echo $row['name']; ?></p>        </td></tr>       <td><tr>       <p><?php  echo $row['price']; echo '€'; ?></p>
       </td></tr>                 
<!--   </div> <!-- fin div class boxgrid -->       <!--   </pre> -->       <!--  </tr> -->       <!-- </tbody> -->     <?php            
  } // fin foreach 

de plus il n'accepte pas la fonction for et affiche la page en erreur 500

question subsidiaire :

j'ai installe une pagination le seul souci est que le nombre d'articles a afficher par page n'est pas pris en compte

 //pagination
$retour_total = $conn->query("SELECT COUNT(*) AS total FROM produits ");
//var_dump($retour_total);
$donnees_total=mysqli_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
$total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
$messagesParPage=10; //Nous allons afficher 30 messages par page.
 
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);

//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);
$sql = "SELECT * FROM produits LIMIT 10";
//$messagesParPage=30; //Nous allons afficher 30 messages par page.
 
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);
 
if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
{
     $pageActuelle=intval($_GET['page']);
 
     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
     {
          $pageActuelle=$nombreDePages;
     }
}
else // Sinon
{
     $pageActuelle=1; // La page actuelle est la n°1    
} 
 // $messagesParPage=10; //Nous allons afficher 30 messages par page.
 
$nombreDePages=ceil($total/$messagesParPage);
 
if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
{
     $pageActuelle=intval($_GET['page']);
 
     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
     {
          $pageActuelle=$nombreDePages;
     }
}
else // Sinon
{
     $pageActuelle=1; // La page actuelle est la n°1    
}
 
$premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcul la première entrée à lire
//Affichage la liste des pagesSélectionnez
//$messagesParPage=10; //Nous allons afficher 30 messages par page.
 
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);
 
if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
{
     $pageActuelle=intval($_GET['page']);
 
     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
     {
          $pageActuelle=$nombreDePages;
     }
}
else // Sinon
{
     $pageActuelle=1; // La page actuelle est la n°1    
}
 
$premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcule la première entrée à lire

//pagination suite
  echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
{
     //On va faire notre condition
     if($i==$pageActuelle) //S'il s'agit de la page actuelle...
     {
         echo ' [ '.$i.' ] '; 
     }    
     else //Sinon...
     {
          echo ' <a href="article.php?page='.$i.'">'.$i.'</a> ';
     }
}
echo '</p>';


probleme ++ :

la page se repete 91 fois

===>>> EDIT: Correction des balises de code ( ajout du langage)
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
en retour html j'ai ca :

  <!--  <pre> -->    
       <!--  <div class="boxgrid caption" color="#fff" > -->
     
       <td><tr>
       <div class="float_foto"><img src="upload/31f965i-QiS._AC_UL320_.jpg" alt=""  width="300px" ><br/>  </div>       </td></tr>
       <td><tr>
       <p>text</p> 
       </td></tr>
       <td><tr>
       <p>0€</p>
       </td></tr>
    
       
      <!--   </div> <!-- fin div class boxgrid --> 
      <!--   </pre> -->
       <!--  </tr> -->
       <!-- </tbody> -->
           <!--  <tbody> -->


===>>> EDIT: Correction des balises de code ( ajout du langage)
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
up
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
13 oct. 2021 à 13:03
Le code html de ton dernier message n'est pas complet. Le code css partagé me semble également un peu vide (rien dans les fichiers style.css et design.css ? Pas de règles css pour les classes .bloc, .boxgrid, .caption, .float_foto ?)

Pour répondre aux questions :
1. Les balises img sont par défaut de type "inline", ces balises vont donc s'afficher les unes à cotés des autres si elles ont la place suffisante.
Néanmoins, d'après ton code, les images à afficher ont une largeur de 300px et celles-ci sont affichées dans un conteneur avec une largeur maximum de 350px. Du coup je ne vois pas vraiment comment tu pourras afficher des images avec cette largeur dans un conteneur trop petit (diminuer la taille des images ou agrandir le conteneur).

2. Tu ne peux pas utiliser la balise br pour positionner une cellule d'un tableau html sur une nouvelle ligne. Pour créer une nouvelle ligne dans un tableau html, il faut utiliser la balise tr.
Tu ne devrais pas utiliser les tableaux html pour faire de la mise en page. Le positionnement des éléments html doit se faire en CSS.
Ton code sera surement plus simple et plus facile à maintenir sans utiliser de tableau html.

3. Toujours pas compris le problème, d'où ma précédente question : Les images changent lorsque les fichiers dans le dossier upload sont modifiés ?

4. La question bonus pourra faire l'objet d'une autre discussion, j'avoue ne pas avoir trop regardé les extraits de code partagé à ce sujet (surement plus simple avec le code complet).

A partir du code partagé dans ton premier message, on constate plusieurs erreur de syntaxe html :
- La chaine "Page de travail" dans la div class="style" n'est pas correcte : soit il s'agit du contenu de la balise div (à déplacer entre les balises div du coup), soit il s'agit de la valeur d'un attribut pour lequel il manque le nom de l'attribut.
- Il faut éviter d'utiliser une balise h3 après une balise h1 sans utiliser de balise h2 : les niveaux des titres ne sont pas cohérents. Si tu utilise la balise h3 car elle s'affiche de manière plus petite que la balise h2, ce n'est pas la bonne approche. Le HTML doit être utilisé pour la sémantique mais pas pour le style. Tu peux toujours modifier la taille du h2 avec du css pour modifier l'affichage.
- Plusieurs erreurs sur l'utilisation du tableau html :
-- La balise table ou tbody ne peut avoir que des balises tr en enfant direct (pas de balise br).
-- La balise tr ne peut avoir que des balises td en enfant direct (pas de pre ou div)

Au lieu d'ajouter un span avec un style max-width directement en html, tu peux simplement ajouter la propriété max-width sur la class css .bloc.
Si la classe .bloc est utilisée sur d'autres pages pour lesquelles tu ne veux pas appliquer le max-width, tu peux aussi créer une autre classe à ajouter en plus de la classe .bloc.

Un début de correction possible :
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="/css/style.css" />
    <link rel="stylesheet" href="/css/design.css" />
    <script src="/js/jquery.min.js"></script>
    <!--[if lt IE 9]>
    <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <title>Articles</title>

    <style>
        .bloc-max350 {
            max-width: 350px;
        }

        .article {
            color: #fff;
        }

        .article-name {
            font-size: 1.17em;
        }

        .article-images img {
            width: 300px;
        }
    </style>
</head>
<body>
    <h1>articles :</h1>

    <?php
    // Connect to database
    include("db_connect_mysqli.php");
    // recherche du texte
    $sql = "SELECT * FROM produits";
    $result = mysqli_query($conn, $sql);
    //recherche de l'image      
    require_once("db_connect_mysqli.php");
    $sql_2 = "SELECT name FROM file";
    $req = mysqli_query($conn, $sql_2);
    ?>

    <div class="style">Page de travail</div>

    <div class="bloc bloc-max350">

        <?php
        if (mysqli_num_rows($result) > 0) :
            while ($row = mysqli_fetch_array($result)) : 
        ?>

        <div class="article boxgrid caption">
            <h2 class="article-name"><?php echo $row['name']; ?></h2>

            <div class="article-images">
                <?php
                $path = 'upload/';
                $images = glob($path . '*.jpg');

                if ($images) {
                    $images = array_slice($images, 0, 4);

                    foreach ($images as $img) {
                        echo '<img src="' . $path . $img . '" alt="">';
                    }
                }
                ?>
            </div>

            <p><?php echo $row['description']; ?></p>

            <p><?php echo $row['price'] . '€'; ?></p>
        </div> <!-- /.article -->

        <?php
            endwhile;
        endif;
        ?>

    </div> <!-- fin div class bloc -->
</body>

</html>

-> Le code css entre les balises style devrait être déplacé dans une des feuilles de style style.css ou design.css
0
apres test rien ne s'affiche dans la page ( pas de texte et l'image reste vide )
0
up
0
problemes 1) 2) et 4) resolus

pour le 3) je l'ai remplace par ce code :

$repertoire = "upload/";
$iteration = opendir($repertoire);
$fichier = readdir($iteration);
$fichier_info = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($fichier_info, $repertoire.$fichier);
//lister_images("upload/");


le probleme est que je n'arrive pas a l'integrer correctement la j'ai toutes les images qui apparaissent dans une seule table ( je veux 1 image par table )

pour repondre a la question precedente : oui les images changent a chaque maj
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
28 oct. 2021 à 06:40
Bonjour
Tu parles de table... Mais je ne vois rien de tel dans ton code ..
Le mieux serait que tu mettes cette discussion en résolue et que tu en ouvres une nouvelle specifique pour ce "nouveau" problème dans le forum programmation/php.

Ps: n'oublie pas d'y montrer ton code complet...
0