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 :

Insertion en base d'un texte [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut Insertion en base d'un texte
    Bonjour à toutes et à tous,

    Objectif :
    Insertion dans la table publications d'un texte saisi par un producteur dans son espace perso.
    Dans le code ci-après je tente d'insérer un texte dans la table publications mais aucun message ne s'affiche et l'injection SQL ne se fait pas.
    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
     
    <?php
    	//session_start();
    	require_once 'includes/inc_connexion.php';	
    	include 'includes/inc_identification.php';
    	$conn=opendb_conn(); // on se connecte à la Base de données		
    	/** Script effectuant le traitement de l'insertion dans la table publication du texte publié depuis le formulaire  */	
     
    	if(isset($_POST) && !empty($_POST['contenu']) && !empty($_SESSION['id'])) {
    		$id = $_SESSION['id'];
    		$contenu = $_POST['contenu'];
     
    		// requête pour l'insertion du texte dans la table des publications 
    		$req = "insert into publications values(null,:texte,CURDATE(),:idproducteur)";
    		// on prépare le traitement de la requête
    		$stmt = $conn->prepare($req);
    		if($_POST['submit']) {
    			// Pour sécuriser l'insertion en base d'un nouveau texte à publier nous utilisons le mode transactionnel
    			// avec un bloc try ... catch()
    			try {
    				$conn->beginTransaction();	
    				// on associe les marqueurs nommés avec les variables crées plus haut
    				$stmt->bindParam(':texte', $contenu, PDO::PARAM_STR);
    				$stmt->bindParam(':idproducteur', $id, PDO::PARAM_INT); // id du producteur effectuant la publication
    				// exécution de la requête
    				$stmt->execute();			
    				// on commit
    				$conn->commit();
    				// on affiche un message
    				print '<div style="color:#132959">Publication du texte réussie! ... </div>';
    				echo "ok";
    			}catch(PDOException $e) {
    				// on rollback
    				$conn->rollback();
    				// on affiche un message d'erreur
    				print "Erreur lors de l'insertion en base !: " . $e->getMessage() . "</br>";
    				echo 'erreur';
    			} // try ... catch()
    		} //if($_POST['submit'])	
    	} //if
     
    	print_r($_POST);
    ?>
    Ce code est appelé par le fichier php suivant :
    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
     
    <?php	
    	//session_start();  A session had already been started - ignoring session_start() in ..../inc_identification.php
    	include 'includes/inc_identification.php';
    ?>
    <!DOCTYPE html>
     
    <html>
    	 <head>
            <meta charset="utf-8" />
            <link rel="stylesheet" href="css/eltStyle.css" />
    		<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script><!-- Invocation de la bibliothèque jquery.js -->
    		<script src="js/jquery-ui-1.8.23.js"></script>
    		<script src="js/afficherZoneTexte.js"></script><!-- Code jQuery rattaché à la page -->
            <title>Le cercle des vignobles - Carnets du vignoble</title>
        </head>
     
    	<body>
    		 <div id="bloc_page">
    			<header>						
    				<?php 
    					include("includes/inc_menus.php"); 
    					if(isset($_SESSION['login'])) { //si la session est en cours ... j'affiche le login de connexion						
    						echo '<div class="site_conn">connect&eacute;'.' ['.$_SESSION['login'].']'.'</div>';
    					} 					
    				?>
     
    				<form action="disconn_producteur.php" method="post">
    					<input type="submit" class="disconnect" value="Se d&eacute;connecter" />
    				</form>
    			</header><!-- header -->
     
    			<?php include("includes/inc_publication.php"); ?>	
    			<!-- div pour l'ajout du résultat en ajax-->
    			<div id="resultatAjax"></div>
    			<!-- div pour l'ajout du message d'erreur -->
    			<div class="error" style="color:#FF000"></div>
    			<form name="form2" id="formText" method="post" action="ajout_publierTexte.php">					
    				<textarea name="contenu"  rows="25" cols="130" maxlength="5000" > 				
    				</textarea>	
    				<!-- div pour l'ajout du loader d'attente ajax -->
    				<div id="loader" style="display:none"><img src="img/loader.gif" alt="loader" /></div>
    				<p>
    					<input type="submit" class="publier" name="submit" id='submit' value="Publier" />					
    				</p>								
    			</form><!-- formText -->
     
    			<form name="form3" id="formMedia" method="post" action="#">
    				<button id="vins" class="zone_ajout" >&laquo; Int&eacute;grer mes vins &raquo;</button>					
    				<button id="photos" class="zone_ajout" >&laquo; Ajouter des photos &raquo;</button>
    			</form><!-- formMedia -->
    		</div><!-- bloc_page -->	
    	</body>
    </html>
    Merci d'avance,

    Transact.

  2. #2
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    Je ne récupère pas le bloc try ... catch() et seule la valeur texte est récupérée.
    La variable contenu est présente dans le fichier js suivant :
    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
     
    /** script traitant de la mise à jour de la zone de texte de publication dans l'espace producteur	*/
    $(document).ready(function(){
    	$('textarea').focus(); // placer le focus du curseur dans le textarea	
    	/* attacher un évènement de type submit sur le formulaire submit */
    	$("#formText").submit(function(e) {
    		// pendant la soumission on affiche le loader d'attente ajax
    		$("#loader").show();
    		// empêcher le comportement par défaut de soumission du formulaire
    		e.preventDefault();
    		// objectif : récupérer la valeur du champ textarea du formulaire MAIS ON NE SAIT PAS où cette valeur est située.
    		// ($this) fait référence à l'objet courant donc le formulaire
    		//	utilisation de .find() pour trouver les éléments fils de l'objet courant ayant le name souhaité
    		// .val() car nous voulons la valeur
    		// et nous mettons tout cela dans une variable text pour ne pas perdre la valeur
    		var contenu = $(this).find("textarea[name=contenu]").val(); 
    		var url = $(this).attr('action');
    		$.post(url, {texte : contenu}, function(data) {
    			// une fois les données soumisent on cache le loader
    			$("#loader").hide();
     
    			if(data!="ok") {			
    				$(".error").empty().append(data);
    			} else {
    				alert("bonjour");
    			}			
    		});
     
    	}); //$("publicationForm").submit(function(e))
     
    });

  3. #3
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    J'entrevois d'où vient le problème; en effet le formulaire me renvoi le contenu du textarea mais l'injection ne peut pas se faire car la table publications attend un champ AUTO-INCREMENTABLE id, date_publication, idproducteur qui ne sont pas présent dans le formulaire.

    Faut-il que je regarde du côté de JSON ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    il faut nommer explicitement les champs dans la requête d'insertion (et enlever "null") :
    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		$req = "insert into publications values(null,:texte,CURDATE(),:idproducteur)";
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		$req = "insert into publications (nom-du-champ-texte, nom-du-champ-date, nom-du-champ-idproducteur) values (:texte, CURDATE(), :idproducteur)";
    Cela dit, je vois if(... !empty($_SESSION['id'])...
    Tu es sûr que c'est bien un INSERT (nouvel enregistrement) ?
    Ce ne serait pas plutôt un UPDATE (modification d'un enregistrement existant) ?

    BREF, il faut revoir la logique et la conception...

  5. #5
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    Bonjour jreaux62,

    J'ai nommé explicitement les champs dans la requête d'insertion ... mais cela ne change rien.
    Par ailleurs, il s'agit d'une insertion car en fait lorsque le producteur insère du texte dans sa zone de publication, j'ai besoin de savoir que le texte inséré provient du producteur connecté d'où le SESSION['id'] id étant le champ id de la table des producteurs dans la base de données.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    - montre-nous la structure de ta table,
    - fait un echo $contenu (pour vérifier s'il est rempli)
    - montre-nous ton code corrigé
    -... bref, tout ce qui peut servir à t'aider.

    PS : nommer "id" tous les champs auto-incrémentés de toutes tes tables n'aide pas à y voir clair...

  7. #7
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    1- J'ai modifié les noms des champs dans la base de données car en effet le nom id dans toutes les tables n'est pas vraiment pertinent.

    2- La structure de la table des publications
    Nom Type
    publication_id int(11) AUTO_INCREMENT
    publication_texte mediumtext
    publication_date date
    idproducteur int(11)

    TOUS les champs sont à NOT NULL, idproducteur est une fk (en unique index) pointant vers la clé primaire producteur_id de la table des producteurs.

    3- Le code corrigé
    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
     
    <?php
    	session_start();
                  error_reporting(E_ALL); ini_set('display_errors', 1); 	
    	print_r($_SESSION['id']);
    	print '<br/>';
    	print_r($_POST);
     
    	require_once 'includes/inc_connexion.php';	
    	include 'includes/inc_identification.php';
    	$conn=opendb_conn(); // on se connecte à la Base de données		
    	/** Script effectuant le traitement de l'insertion dans la table publication du texte publié depuis le formulaire  */	
    	if(!empty($_POST['contenu']) && !empty($_SESSION['id'])) {
    		$id = $_SESSION['id'];
    		$contenu = $_POST['contenu'];		
    		// requête pour l'insertion du texte dans la table des publications 
    		$req = "insert into publications(texte,date_publication,idproducteur) values(:texte,CURDATE(),:idproducteur)";
    		// on prépare le traitement de la requête
    		$stmt = $conn->prepare($req);
    		if($_POST['submit']) {
    			// Pour sécuriser l'insertion en base d'un nouveau texte à publier nous utilisons le mode transactionnel
    			// avec un bloc try ... catch()
    			try {
    				$conn->beginTransaction();	
    				// on associe les marqueurs nommés avec les variables crées plus haut
    				$stmt->bindParam(':texte', $contenu, PDO::PARAM_STR);
    				$stmt->bindParam(':idproducteur', $id, PDO::PARAM_INT); // id du producteur effectuant la publication
    				// exécution de la requête
    				$stmt->execute();			
    				// on commit
    				$conn->commit();
    				// on affiche un message
    				print '<div style="color:#132959">Publication du texte réussie! ... </div>';
    				echo "ok";
    			}catch(PDOException $e) {
    				// on rollback				
    				$conn->rollback();
    				// on affiche un message d'erreur
    				print "Erreur lors de l'insertion en base !: " . $e->getMessage() . "</br>";
    				echo 'erreur';
    			} // try ... catch()	
    		} //if($_POST['submit'])
    	} //if
     
    ?>

  8. #8
    Invité
    Invité(e)
    Par défaut
    Mets des echo après les if, pour voir si ca passe bien où tu veux :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "jusqu'ici, ca va !";
    ...
    echo "jusqu'ici, ca va toujours !";
    + des echo des variables, pour vérifier qu'elles sont bien remplies.

    Ps : if($_POST['submit']) { ne me semble pas utile.
    En tout cas, il n'est pas à sa place (avant le 1er if serait plus logique, non ?)
    Dernière modification par FirePrawn ; 05/10/2012 à 12h27. Motif: Mise en forme

  9. #9
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    Les variables $_POST['contenu'] et $_SESSION['id'] sont bien récupérées.
    Il semblerait que la portion de code effectuant l'insertion ne se fasse jamais.

  10. #10
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    "le problème" vient du script javascript jQuery c'est ce dernier qui effectue un événement sur le bouton submit du formulaire.

  11. #11
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    [Résolu]
    En debboguant mon code "step by step", j'ai trouvé d'où provennait l'erreur.
    Il s'agissait bien du code présent dans fichier Javascript afficherZoneTexte.js.
    J'avais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $.post(url, {texte : contenu}, function(data) {
    Alors qu'il fallait cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $.post(url, {contenu : contenu}, function(data) {
    En fait la paire "clé:valeur" pour récupérer les données postée doit être la valeur name du champ du formulaire donc du textarea pour mon cas.

    Ce qui entrainait que la variable $_POST['contenu'] n'était pas initialisée car non postée. Le test suivant m'a permis de comprendre cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /*
    	if(isset($_POST['contenu'])) {
    		echo 'Salut';
    	} else {
    		echo 'au revoir';
    	}
    	*/
    Merci encore.
    Transact.

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

Discussions similaires

  1. Création d'un alias sur base données "Microsoft Text Dr
    Par defluc dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/06/2005, 08h28
  2. Réponses: 8
    Dernier message: 11/05/2005, 14h48
  3. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34
  4. [ADO.NET] Problème avec Insert dans base de données
    Par mpascolo dans le forum Accès aux données
    Réponses: 9
    Dernier message: 24/01/2005, 09h36
  5. PB date lors d'une insertion en Base.
    Par NATHW dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/09/2004, 17h53

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