IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Affichage catalogue et formulaire d'édition d'articles PHP [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Artiste
    Inscrit en
    Mai 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Artiste
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2020
    Messages : 6
    Par défaut Affichage catalogue et formulaire d'édition d'articles PHP
    Je suis débutant et c'est la première fois que je m'inscris sur un forum... Merci à tous pour ce forum... J'espère ne pas faire d'impair!
    j'ai construit un "site/blog" avec 10 catégories alimentées par des formulaires -> bases de données (id auto, dessins, sculptures, musique, expression etc.. )

    je voudrais pouvoir modifier ensuite certaines tables de ces bases (titre, commentaire,.) simplement à partir d'un tableau qui me servirait de 'catalogue et suivi catalogue de mes oeuvres . j'ai trouvé cette discussion:

    https://www.developpez.net/forums/d1...he-simple-bdd/
    J'ai cherché à comprendre et adapter mais Je bloque. page blanche... comment envoyer et récupérer les $post, comment lancer l'update de la table? (en plus je n'ai pas les erreurs : pas d'accès au serveur d'hébergement de mon site)
    Je poste ces débuts de codes.

    - recherche.php - (tableau de recherche souhait d'édition "en direct" et validation par bouton ou [entrée] dans la zone concernée.)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8"/>
    	<title>Recherche</title>
    	<style>
    		table{width:100%;border-collapse:collapse}
    		table tr,table th,table td{border:1px solid black;}
    		table tr td{text-align:center;padding:1em;}
    	</style>
    </head>
    <body>
    	<?php include('concom.php');?>
    	<form method='post'>
    		<input type='number' placeholder='recherche' name="recherche_valeur"/>
    		<input type='submit' value="Rechercher"/>
    	</form>
    	<table>
    		<thead>
    			<tr><th>Id</th><th>Titre</th><th>Commentaire</th><th>Date</th></tr>
    		</thead>
    		<tbody>
    			<?php
    				$sql='select * from pictures';
    				$params=[];
    				if(isset($_POST['recherche_valeur'])){
    					$sql.=' where nom like :nom';
    					$params[':nom']="%".addcslashes($_POST['recherche_valeur'],'_')."%";
    				}
    				$resultats=$connect->prepare($sql);
    				$resultats->execute($params);
    				if($resultats->rowCount()>0){
    					while($d=$resultats->fetch(PDO::FETCH_ASSOC)){
    					?>  <form name="inscription" method="post" action="chgtCom.php">
    						<tr>
    						<td><input type='number' value='<? echo$d['Id']?>'name="Id"</td>
    						<td><input type='textarea' value='<? echo $d['Titre']?>'name="titre"/></td>
    						<td><input type='textarea' value='<?  echo $d['Commentaire']?>' name="Commentaire"/></td>
    						<td><input type='textarea' value='<? echo $d['Date']?>' name="Date"/></td>
    						<input type="submit" name="valider" value="valider Id<?=$d['Id']?>"/>
    					    </form>
    						</tr>
    					<?php
    					}
    					$resultats->closeCursor();
    				}
    				else echo '<tr><td colspan=4>aucun résultat trouvé</td></tr>'.
    				$connect=null;
    			?>
    		</tbody>
    	</table>
    </body>
    </html>
    - code.php - (fichier récupération du submit et post update dans la table pictures.)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
     
    $postId= $post ['Id'];
    $postTitre=$post ['Titre'];
    $postCommentaire=$post ['Commentaire'];
    $postDate=$post ['Date'];
     
     
         $connect = mysqli_connect("localhost", "utilsateur", "mdp", "ma_base"); 
      /* Vérification de la connexion */ 
       if (!$connect) { 
          echo "Échec de la connexion : ".mysqli_connect_error(); 
          exit(); 
       }  
      /* Vérification de la connexion */ 
     
     if(isset($_POST['valider']))
       if (!$connect) 
       { 
          echo "Échec de la connexion : ".mysqli_connect_error(); 
          exit(); 
       } 
        else
        {
        $query="UPDATE pictures SET Titre='$postTitre', Commentaire='$postCommentaire', Date='$postDate' WHERE id='$postId'";
        mysql_query($query);
        echo "Les modification ont été enregistrées dans la base de données";
        mysql_close();
        }
        else  
        { 
          echo "Érreur" ; 
          exit(); 
        }
     
    mysqli_close($connect);
    ?>
    - connexion.php - Il y a aussi un fichier de connexion PDO (je n'ai pas trop compris par rapport à if (!$connect)...) mais je chercherai avant d'éventuelles questions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    //connection_database.php
     
       $connect = new PDO('mysql:host=localhost;dbname=ma_base', 'utilisateur, 'mdp',[
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
      ]);
     
    ?>
    Un petit rendu du tableau souhaité pour modifier les articles.
    Nom : tableau.jpg
Affichages : 556
Taille : 42,9 Ko
    Si c'est possible, j'en créerai pour chaque catégorie.

    Voili ,voilà; J'espère ne pas être trop ridicule et que quelqu'un pourra me mettre sur la bonne voie...
    Au plaisir de vous lire,

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 513
    Par défaut
    Salut,

    Déjà tu utilises deux API, PDO et Mysqli, ce qui n'est pas bon. il faut choisir seulement 1 mais pas les deux en même temps.

    En parcourant tes scripts je commence par ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(isset($_POST['recherche_valeur'])){
    	$sql.=' where nom like :nom';
    	$params[':nom']="%".addcslashes($_POST['recherche_valeur'],'_')."%";
    }
    Tu n'as pas de colonne "nom" dans la table "pictures", tu as plutôt Id,Titre,Commentaire,Date et donc si tu veux rechercher par Titre par exemple il faut remplacer "nom" par "Titre" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(isset($_POST['recherche_valeur'])){
    	$sql.=' where Titre like :titre';
    	$params[':titre']="%".addcslashes($_POST['recherche_valeur'],'_')."%";
    }
    Et en ce qui concerne un bouton pour chaque ligne je ne te conseille pas.
    deux solutions possibles :
    • Ajouter une 5éme colonne "Actions" à la fin qui contiendra les boutons d'actions "supprimer"/"modifier"
    • Ajouter une 5éme colonne "Case à Cocher" dans chaque ligne, et lorsqu'on soumet le formulaire on ne modifie/supprime que les lignes cochées.


    Le code complet de la première solution qui fonctionne en utilisant l'attribut form="..." (du HTML5) pour chaque input, voir l'exemple sur w3schools.

    index.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8"/>
    	<title>Recherche</title>
    	<style>
    		table{width:100%;border-collapse:collapse}
    		table tr,table th,table td{border:1px solid black;}
    		table tr td{text-align:center;padding:1em;}
    	</style>
    </head>
    <body>
    	<?php 
                    include('concom.php');
                    if ( !isset($connect) ){ //si $connect n'est pas défini, on affiche une erreur et on quitte le script
                         echo "Échec de la connexion"; 
                         exit(); 
                    } 
            ?>
    	<form method='post'>
    		<input type='text' placeholder='rechercher par titre...' name="recherche_valeur"/>
    		<input type='submit' value="Rechercher"/>
    	</form>
    	<table>
    		<thead>
    		<!-- ajout d'une colonne Actions qui contiendra les boutons supprimer et modifier ...-->
    			<tr><th>Id</th><th>Titre</th><th>Commentaire</th><th>Date</th><th>Actions</th></tr>
    		</thead>
    		<tbody>
    			<?php
    				$sql='select * from pictures';
    				$params=[];
    				if(isset($_POST['recherche_valeur'])){
    					$sql.=' where Titre like :titre';
    					$params[':titre']="%".addcslashes($_POST['recherche_valeur'],'_')."%";
    				}
    				$resultats=$connect->prepare($sql);
    				$resultats->execute($params);
                                    $compteur=0;
    				if($resultats->rowCount()>0){
    					while($d=$resultats->fetch(PDO::FETCH_ASSOC)){
    						$compteur++;
    					?>
    						<tr>
    						<!-- Normalement la colonne Id ne doit pas être modifiable ni visible si c'est une clé primaire !
    							les erreurs corrigées :
    							1- espace avant name="Id"
    							2-fermeture de l'input avec />
    							3- name="Titre" avec T majuscule
    							4- Erreur de syntaxe value='< ? echo ...?>', 
    								-soit avec (php) après ? et "echo" : < ?php echo $variable;?> 
    								-soit remplacer (php) par "=" mais sans "echo" < ?=$variable?>
    							5- le <input type="submit"> été mal placé, y'a pas de <td> parent !								
    						-->
    							<td>
    								<form id="form<?=$compteur;?>" name="inscription" method="post" action="chgtCom.php">
    									<input type='number' value='<?=$d['Id']?>' disabled />
    									<input type="hidden"  name="Id" value="<?=$d['Id']?>" />
    								</form>
    							</td>
    							<td>
    								<input form="form<?=$compteur;?>" type='textarea' name="Titre" value='<?=$d['Titre']?>' />
    							</td>
    							<td>
    								<input form="form<?=$compteur;?>" type='textarea' name="Commentaire" value='<?=$d['Commentaire']?>' />
    							</td>
    							<td>
                                                                   <!-- type="datetime-local" existe !, + bonus : conversion et affichage de la date au bon format -->
    								<input form="form<?=$compteur;?>" type='datetime-local' name="Date" value='<?php $date=new DateTime($d['Date']);echo $date->format('Y-m-d\TH:i:s');?>' />
    							</td>
    							<td>
    								<input form="form<?=$compteur;?>" type="submit" name="action" value="Modifier" />
    								<input form="form<?=$compteur;?>" type="submit" name="action" value="Supprimer" />
     
    							</td>
     
     
    						</tr>
    					<?php
    					}
    					$resultats->closeCursor();
    				}
    				else echo '<tr><td colspan=5>aucun résultat trouvé</td></tr>'.
    				$connect=null;
    			?>
    		</tbody>
    	</table>
    </body>
    </html>
    Le fichier de la modification en utilisant PDO de concom.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <?php
    include "concom.php";
    if ( !isset($connect) ){ //si $connect n'est pas défini, on affiche une erreur et on quitte le script
          echo "Échec de la connexion"; 
          exit(); 
       } 
    else{
    	/* $_POST et pas $post */
    	$postId= $_POST['Id'];
    	$postTitre=$_POST['Titre'];
    	$postCommentaire=$_POST['Commentaire'];
    	$postDate=$_POST['Date'];
    	$action=$_POST['action']??""; /*l'opérateur ?? est équivalent à : if(isset($_POST['action']))$action=$_POST['action']; else $action=""; */ 
    	echo "id :".$postId.", action :".$action."<br />";
    	if(!empty($action)){
               /* Attention, il faut toujours préparer les requêtes quand on traite les variables $_POST ou $_GET, et ne jamais passer les variables en dur !*/
    	   if($action=="Modifier"){//procédure de modification 
    			$query="UPDATE pictures SET Titre=?, Commentaire=?, Date=? WHERE id=?";
    			$stmt=$connect->prepare($query);
    			$stmt->execute([$postTitre,$postCommentaire,$postDate,$postId]);
    			if($stmt->rowCount()>0){
    				header("location: index.php");//redirection vers la même page pour actualiser le tableau
    			}
    			else{
    				echo "Aucune modification n'a été effectuée !<br />";
    			}
    	   }else if($action=="Supprimer"){/* procédure de suppression ...*/
    			$query="delete from pictures where Id=?";
    			$stmt=$connect->prepare($query);
    			$stmt->execute([$postId]);
    			if($stmt->rowCount()>0){
    				header("location: index.php");
    			}
    			else{
    				echo "Aucune suppression n'a été effectuée !<br />";//redirection vers la même page pour actualiser le tableau
    			}
    	   }
     
    	}
    	else  
    	{ 
    	  echo "Aucune action !" ; 
    	  exit(); 
    	}	
    }
    $connect=null;
    Et le fichier concom.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php 
    try{
       $connect = new PDO('mysql:host=localhost;dbname=ma_base', 'nom_utilisateur', 'mot_de_passe',[
           PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
           PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
      ]);
    }catch(PDOException $e){
    	echo "Erreur de connection :".$e->getMessage();
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    ...tu utilises deux API, PDO et Mysqli, ce qui n'est pas bon. il faut choisir seulement 1 mais pas les deux en même temps.
    Il faut choisir PDO.
    Point.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Artiste
    Inscrit en
    Mai 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Artiste
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2020
    Messages : 6
    Par défaut Merci beaucoup Toufik83! et jreaux62 et petite question en +
    Bien. je note pour Pdo. Il faudra que je revoie toutes mes connexions dans mes pages alors...

    Un Grand Merci Toufik83!! C'est très clair. vraiment super

    Une ou deux petite question supplémentaire si je n'abuse pas de votre temps...

    - On cache l'Id (pour des raisons de sécurité?) mais peut-on l'intégrer dans la recherche (c'est la référence de chacune de mes créations). Sinon, Il faut alors que je fasse une table N° par exemple qui récupére l'Id clé primaire?

    J'ai mis un peu de temps à répondre, j'avais un souci de codage en utf-8. Mon serveur prend les modifications sans prendre en compte les caractères spéciaux et accents malgré la conversion de mes tables en utf-8.

    - J'ai donc récupéré la fonction de mon script qui me sert à poster mes article et l'ai appliquée aux variables comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $postTitre=htmlentities($_POST['Titre']);
    Ça a l'air de fonctionner mais est-ce que la méthode est correcte?

    - Ensuite, je change un peu de "thème", je pensais que ce serait plus simple d'appliquer un dimensionnement automatique au textarea en html ou css. J'ai recherché, certains post parlent de fonctions, de js, Est-qu'il existe une solution "simple"? Sinon, je taperai mon commentaire à part avant de l'insérer pour éviter les err'edfurs. :-)

    Encore merci,

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Haberick Voir le message
    Il faudra que je revoie toutes mes connexions dans mes pages alors...
    Le script de connexion doit être mis dans un fichier externe, appelé via include() dans les pages.


  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 513
    Par défaut
    Citation Envoyé par Haberick Voir le message
    - On cache l'Id (pour des raisons de sécurité?)
    Je ne dis pas que c'est un problème de sécurité mais je ne vois aucun intérêt de montrer les id de ta table aux utilisateurs.

    Citation Envoyé par Haberick Voir le message
    mais peut-on l'intégrer dans la recherche (c'est la référence de chacune de mes créations).
    Oui, pour cela il faut modifier un peu la requête sql et ajouter les colonnes en question :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $sql.=' where Id like :valeur or Titre like :valeur';
    $params[':valeur']="%".addcslashes($_POST['recherche_valeur'],'_')."%";

    Par-contre, on a oublié de sécuriser les données à l'affichage avec htmlspecialchars (pour toutes les value="..."):
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <input type='number' value='<?=htmlspecialchars($d['Id'])?>' disabled />
    <input type="hidden"  name="Id" value="<?=htmlspecialchars($d['Id'])?>" />

  7. #7
    Membre à l'essai
    Homme Profil pro
    Artiste
    Inscrit en
    Mai 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Artiste
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2020
    Messages : 6
    Par défaut Quelques détails...
    - Parfait pour la requête de recherche! ...J'aurais pu réfléchir un peu plus...

    - Coté "htmlspecialchars", la fonction me crypte les commentaires que j'appelle sur la base...
    Est-ce que je peux l'appliquer plutôt à la réception sur l'autre fichier? Comme ça a l'air de fonctionner...

    - Une petite question s'était glissée dans mon dernier message. y-aurait-il un moyen d'ajuster la fenêtre de commentaire au contenu. J'ai trouvé des astuces en css (voir image) mais je ne vois pas comment faire pour intégrer les valeurs. Si on peut faire qqch sans ajouter une fonction ou autre... Sinon, tant pis; c'est déjà très bien grâce à vous.

    Nom : fenetre_texte.jpg
Affichages : 503
Taille : 49,2 Ko

    ...Après, je commence mes includes vers le fichier de connexion...Merci pour la lecture jreaux62, j'ai regardé un peu...

    Mais débutant, ça commence à faire bcp ces derniers mois... Je fatigue...

    Merci Beaucoup Beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Doublons sur affichage d'un formulaire en mode édition
    Par ACNTOURAINE dans le forum Contribuez
    Réponses: 2
    Dernier message: 26/03/2015, 14h43
  2. Pb d'affichage de sous formulaire
    Par Didi17 dans le forum Access
    Réponses: 7
    Dernier message: 28/10/2005, 03h48
  3. Une table --> 2 sous formulaires d'édition ?
    Par Neilos dans le forum IHM
    Réponses: 2
    Dernier message: 20/06/2005, 16h10
  4. Réponses: 6
    Dernier message: 19/05/2005, 11h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo