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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    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 chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    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 chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    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 chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    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...

+ 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