INSERT php PDO

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : INSERT php PDO

Re: INSERT php PDO

par AB » 07 janv. 2015, 19:51

Bah faut faire des exercices dans une page séparée avant d'intégrer le code dans ton site.

Essaye déjà de faire fonctionner le code que je t'ai donné dans mon précédent message dans une page séparée pour comprendre. Il faut prendre les problèmes un par un.

Re: INSERT php PDO

par Malalatiana » 06 janv. 2015, 17:17

ok merci, mais toujours la même avec les informations qui se montre avec le formulaire et jee me suis dit que peut être le probleme se trouve dans mon code de listage des tableaux!!
voila le code
<?php
include("header1.php");
?>
<?php
include("entetesite.php");
?>
<?php
$hostdb = 'localhost';
$userdb = 'root';
$passdb = '';
$namedb = 'parcmfb';

try {
  $conn = new PDO("mysql:host=".$hostdb."; dbname=".$namedb."", $userdb, $passdb, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
  $conn->exec("SET CHARACTER SET utf8");  

  $sql = "SELECT * FROM responsable";
  $result = $conn->query($sql);

  if(!$result) {
            echo 'Impossible d\'afficher la liste de tous les responsables';
		                }
		
		else
		{
			echo '<table width="200" border="1" align="center">
			    <caption padding="10px"><center>Liste des Responsables</center></caption>
					<tr>
 					<th scope="col">NumRespo</th>
					<th scope="col">NomRespo</th>
					<th scope="col">MailRespo</th>
					<th scope="col">TelRespo</th>
					<th scope="col">Observation</th>
					</tr>';
			
			while( $donnees=$result->fetch(PDO::FETCH_ASSOC))
			{
				echo '
  					<tr>
    					<td>'.$donnees['NumRespo'].'</td>
   						<td>'.$donnees['NomRespo'].'</td>
						<td>'.$donnees['MailRespo'].'</td>
						<td>'.$donnees['TelRespo'].'</td>
						<td>'.$donnees['Observation'].'</td>
  					</tr>
					';
			}
			echo '</table>';
		};

 

  $conn = null;
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
<?php
include("respoajout.php");
?>
<?php
include("footer.php");
?>
et puis pas encore de redirection vers header location!! #-o 8-| :shock:

Re: INSERT php PDO

par AB » 05 janv. 2015, 20:06

Re bonjour,

J'ajoute que je t'ai montré le minimum pour que cela fonctionne. Le code complet devrait utiliser un bloc try/catch pour intercepter les erreurs des requêtes en cas de problème.
<?php
// connexion bdd
//$conn = ...

// Initialisation des variables qui seront affichées dans le html.
$erreur_requete = null;
$tableau_responsable = array();

try
{
	if(isset($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']))
	{
		$stmt = $conn->prepare("INSERT INTO responsable(NumRespo, NomRespo, MailRespo, TelRespo, Observation) VALUES ( ?, ?, ?, ?, ?)");
		$stmt->execute(array($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']));
		
		header('Location: respo.php');
		exit;
	}
	else
	{
		$req = "SELECT * FROM responsable";
		$res = $conn->query($req);
		
		// Si les résultats ne sont pas très nombreux (plusieurs milliers de lignes) on peut tout récupérer d'un coup avec fetchAll() ce qui permet de libérer plus vite les ressources de la bdd.
		
		/* Je met l'option PDO::FETCH_ASSOC comme option dans fetchAll pour ne pas te dérouter et pouvoir utiliser la notation tableau standard ex : $value['NumRespo'] lors de l'affichage plus loin dans le html. Si on mettait l'option PDO::FETCH_OBJ ou si on ne reneignait pas l'option et que la notation objet soit définie par défaut on devrait récupérer les valeurs du tableau de résultat avec la notation objet, ex : $value->NumRespo
		*/
		$tableau_responsable = $res->fetchAll(PDO::FETCH_ASSOC);
		
		// On libère les ressources
		$res->closeCursor();
	}
}
catch(PDOException $e)
{
   // $erreur_requete est une variable que tu feras afficher où tu veux dans ton html 
   $erreur_requete = "Problème dans la requête";

   // durant la phase de test UNIQUEMENT on fait afficher l'erreur détaillée pour débugage mais pas en exploitation pour éviter de renseigner d'éventuels pirates sur la structure de la table. 
   $erreur_requete .= " : ".$e->getMessage();
}

?>
<!DOCTYPE html>
<html lang="fr">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>titre page</title>
</head>

<body>
    <div>
          <!-- ici par exemple on affiche les erreurs de requêtes -->
	<?= isset($erreur_requete) ? $erreur_requete : '';?>
    </div>
    
    <div>
    <!-- ton formulaire par exemple ici -->
    </div>
    
	<div>
          <!-- ici on liste les résultats -->
    <?php foreach($tableau_responsable as $value)
	{
		// on protège les valeurs que l'on affiche avec htmlspecialchars car elles proviennent de données rentrées par l'utilisateur
		echo htmlspecialchars($value['NumRespo']) . " " . htmlspecialchars($value['NomRespo']) . " " . htmlspecialchars($value['MailRespo']) ." " . htmlspecialchars($value['TelRespo']) . " " . htmlspecialchars($value['Observation']) ."<br>";
	}
	?>
    </div>
</body>

</html>
Remarques qu'on évite de faire des requêtes dans le code html. Tu vois qu'ici on affiche que des variables ou des tableaux dans le html mais on ne fait pas de requêtes.

Re: INSERT php PDO

par Malalatiana » 05 janv. 2015, 19:59

ok, voila le code aprés correction!!
<?php
include ("header1.php");
?>
<?php
$hostdb = 'localhost';
$userdb = 'root';
$passdb = '';
$namedb = 'parcmfb';

try
   {
     $conn = new PDO("mysql:host=".$hostdb."; dbname=".$namedb."", $userdb, $passdb, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
     $conn->exec("SET CHARACTER SET utf8");
	}
catch (PDOException $e)
   {
     echo 'La base de donnée n\'est pas disponible';
    }
if(isset($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']))
{
$stmt=$conn->prepare("INSERT INTO responsable(NumRespo, NomRespo, MailRespo, TelRespo, Observation) VALUES ( ?, ?, ?, ?, ?)");
$stmt->execute(array($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']));
$stmt=$conn->prepare("INSERT INTO responsable(NumRespo, NomRespo, MailRespo, TelRespo, Observation) VALUES ( :NumRespo, :NomRespo, :MailRespo, :TelRespo, :Observation)");
$stmt->bindParam(':NumRespo', $NumRespo);
$stmt->bindParam(':NomRespo', $NomRespo);
$stmt->bindParam(':MailRespo', $MailRespo);
$stmt->bindParam(':TelRespo', $TelRespo);
$stmt->bindParam(':Observation', $Observation);
// $stmt->execute(array(':NumRespo' => $NumRespo, ':NomRespo' => $NomRespo, ':MailRespo' => $MailRespo, ':TelRespo' => $TelRespo, ':Observation' => $Observation));
var_dump($NumRespo); 
die();
    header ('Location: respo.php');
	exit;
}

else 
       {
        
$req = "SELECT * FROM responsable";
$res = $conn->query($req);
    print("<BR> ");
        foreach ($conn->query($req) as $row) 
        {
            print $row['NumRespo'] . "\t ";
            print $row['NomRespo'] . "\t";
            print $row['MailRespo'] . "\t";
            print $row['TelRespo'] . "\t";
            print $row['Observation'] ."<BR>";
        }
    print(" <BR> ");

$req = "SELECT * FROM responsable";
$res = $conn->query($req);
    while ($row = $res->fetch())
    {
    print $row['NumRespo'] . " " . $row['NomRespo'] . " " . $row['MailRespo'] ." " . $row['TelRespo'] . " " . $row['Observation'] ."<BR>";
    }
       }

    $conn->query("SELECT * FROM responsable");
?>

	    <form name="form" action="ajout1.php" method="POST" enctype="multipart/form-data" >
		        <fieldset>
		    <legend><em>Ajout d'un Responsable</em></legend>
			<table align="center">
			<tr>
			    </td>
				    <label for="ChampNum">Num&eacute;ro Responsable:</label>
				</td>
				<td>
					<input type="text" id="NumRespo" name="NumRespo" require/>
				</td>
			</tr>
			<tr>
				<td>
				    <label for="ChampNom">Nom Responsable:</label>
				</td>
				<td>
				    <input type="text" id="NomRespo" name="NomRespo" require/>
				</td>
		    </tr>
			<tr>
				<td>
				    <label for="ChampMail">Mail Responsable:</label>
				</td>
				<td>
				    <input type="text" id="MailRespo" name="MailRespo" require/>
				</td>
		    </tr>
			<tr>
				<td>
				    <label for="ChampTel">T&eacute;l&eacute;phone Responsable:</label>
				</td>
				<td>
				    <input type="text" id="TelRespo" name="TelRespo" require/>
				</td>
		    </tr>
		    <tr>
				<td>
				    <label for="Champobs">Observation:</label>
				</td>
				<td>
				    <input type="text" id="Observation" name="Observation" require/>
				</td>
		    </tr>
        <tr>
		<td></td>		
	<td>
	    <form action="ajout1.php" method="POST">
	        <input type="submit" name="bouton" value="Ajouter" onclick="alert('Ajout avec succes');" /> 
		    <input type="reset" name="bouton" value="Annuler" onclick="alert('Ajout annuler');" /> 
	    </form>
	</td>
			</tr>
		</table>
		</fieldset>
	</form>

<?php
include ("footer.php");
?>

Re: INSERT php PDO

par AB » 05 janv. 2015, 18:02

Malalatiana, c'est pas mon code qu'il faut montrer mais celui que tu as fais si tu veux qu'on puisse l'améliorer !
Et des images ne nous aident pas du tout pour te répondre, c'est ton code qu'on veut voir et précisément la partie que tu as modifiée et qui ne fonctionne pas comme tu veux.

Après le header de redirection il vaut toujours mieux mettre un "exit" :
if(isset($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']))
{
$stmt=$conn->prepare("INSERT INTO responsable(NumRespo, NomRespo, MailRespo, TelRespo, Observation) VALUES ( ?, ?, ?, ?, ?)");
$stmt->execute(array($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']));

header('Location: respo.php');
exit;
}

Re: INSERT php PDO

par Malalatiana » 05 janv. 2015, 17:55

ajout1.png
et ben voila l'image du probleme avec les information et le formulaire!! merci!!!

Re: INSERT php PDO

par Malalatiana » 05 janv. 2015, 17:50

Je ne vois pas où tu as défini les variables $NumRespo, $NomRespo, $MailRespo, $TelRespo et $Observation que tu utilise dans les bindParam. Tu aurais plus vite fait de faire :
if(isset($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']))
{
$stmt=$conn->prepare("INSERT INTO responsable(NumRespo, NomRespo, MailRespo, TelRespo, Observation) VALUES ( ?, ?, ?, ?, ?)");
$stmt->execute(array($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']));
}
merci ajouter marche maintenant mais il y a que elle ne se redirige plus vers header maintenant, et j'ai déjà placée header aprés la requête, je comprends pas!!

et puis les informations deja ajouter se montre avec le formulaire je comprend pourquoi si tu as une idée!!? s'il te plait!!

Re: INSERT php PDO

par AB » 05 janv. 2015, 05:24

Je ne vois pas où tu as défini les variables $NumRespo, $NomRespo, $MailRespo, $TelRespo et $Observation que tu utilise dans les bindParam. Tu aurais plus vite fait de faire :
if(isset($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']))
{
$stmt=$conn->prepare("INSERT INTO responsable(NumRespo, NomRespo, MailRespo, TelRespo, Observation) VALUES ( ?, ?, ?, ?, ?)");
$stmt->execute(array($_POST['NumRespo'],$_POST['NomRespo'],$_POST['MailRespo'],$_POST['TelRespo'],$_POST['Observation']));
}

Re: INSERT php PDO

par Malalatiana » 04 janv. 2015, 14:03

et il vaudrait mieux faire
header ('Location: respo.php');
après la requete sql plutôt qu'avant.
merci, header se trove deja aprés la requete et tout va mieux merci!!!

Re: INSERT php PDO

par Malalatiana » 04 janv. 2015, 14:02

Hello,
Déjà fait en sorte d'afficher les erreurs PDO
http://php.net/manual/fr/pdo.error-handling.php
$conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Oui on peut utiliser setAttribute mais c'est également correct comme il l'avait fait en passant un tableau comme paramètre dans la connexion. Et à partir de php 5.3.6 on peut également indiquer le charset donc on peut faire :
// mode d'erreurs
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			
// Indispensable pour ne pas avoir execute() qui formate en string avec un tableau en paramètre  (incompatible avec la clause limit). En mettant false on utilise l'émulation du sgbd qui se renseigne sur le type des formats demandés par la table.
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
			
//charset reconnu dans la connexion à partir de php 5.3.6 auquel cas on peut supprimer l'option MYSQL_ATTR_INIT_COMMAND ci-dessous (qui est préférable à une requête "SET CHARACTER SET utf8")
//$pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
			
$connexion  = new PDO('mysql:host='.$hostname.';dbname='.$database.';charset=utf8', $username, $password, $pdo_options);
Et je serais toi je suivrais l'exemple Exemple #2 Exécute une requête préparée avec un tableau de valeurs (paramètres de nom) plutot que de faire les variables 1 par 1
C'est vrai que c'est intéressant de connaître cette option :wink: (cela dit puisque c'est déjà fait individuellement avec bindParam il lui reste juste à utiliser le execute sans paramètre).

@Malalatiana le bindParam permet de renseigner individuellement le type des données en troisième paramètre (que tu ne renseigne pas) mais cela perd son intérêt si on utilise l'émulation du sgbd comme indiqué plus haut dans mon exemple de code qui désactive l'émulateur php.

Sinon évidemment le execute() est indispensable pour exécuter la requête préparée et comme l'a remarqué tof73, faudrait voir à ne pas faire une redirection avant l'exécution de ton insert.

Ensuite comme tu l'as fait pour ta connexion il faudrait mettre tes requêtes de la même façon dans des bloc try/catch pour intercepter et gérer les erreurs.

A savoir aussi que pour alléger ton code tu peux utiliser la fonction isset() avec plusieurs variables séparées par une virgule :
isset($a) && isset($b) && isset($c) == isset($a,$b,$c)
(Attention ce n'est pas valable pour empty())
j'ai donc utilisée execute comme tu l'avais dis et aprés ajout dans le formulaire j'ai obtenue les erreurs suivantes
PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'NumRespo' ne peut être vide (null) in C:\wamp\www\SMI\ajout1.php on line 28
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'NumRespo' ne peut être vide (null)' in C:\wamp\www\SMI\ajout1.php on line 28
alors que j'ai bien completée tout les champs du formulaire!!

Re: INSERT php PDO

par AB » 29 déc. 2014, 23:14

Hello,
Déjà fait en sorte d'afficher les erreurs PDO
http://php.net/manual/fr/pdo.error-handling.php
$conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Oui on peut utiliser setAttribute mais c'est également correct comme il l'avait fait en passant un tableau comme paramètre dans la connexion. Et à partir de php 5.3.6 on peut également indiquer le charset donc on peut faire :
// mode d'erreurs
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			
// Indispensable pour ne pas avoir execute() qui formate en string avec un tableau en paramètre  (incompatible avec la clause limit). En mettant false on utilise l'émulation du sgbd qui se renseigne sur le type des formats demandés par la table.
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
			
//charset reconnu dans la connexion à partir de php 5.3.6 auquel cas on peut supprimer l'option MYSQL_ATTR_INIT_COMMAND ci-dessous (qui est préférable à une requête "SET CHARACTER SET utf8")
//$pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
			
$connexion  = new PDO('mysql:host='.$hostname.';dbname='.$database.';charset=utf8', $username, $password, $pdo_options);
Et je serais toi je suivrais l'exemple Exemple #2 Exécute une requête préparée avec un tableau de valeurs (paramètres de nom) plutot que de faire les variables 1 par 1
C'est vrai que c'est intéressant de connaître cette option :wink: (cela dit puisque c'est déjà fait individuellement avec bindParam il lui reste juste à utiliser le execute sans paramètre).

@Malalatiana le bindParam permet de renseigner individuellement le type des données en troisième paramètre (que tu ne renseigne pas) mais cela perd son intérêt si on utilise l'émulation du sgbd comme indiqué plus haut dans mon exemple de code qui désactive l'émulateur php.

Sinon évidemment le execute() est indispensable pour exécuter la requête préparée et comme l'a remarqué tof73, faudrait voir à ne pas faire une redirection avant l'exécution de ton insert.

Ensuite comme tu l'as fait pour ta connexion il faudrait mettre tes requêtes de la même façon dans des bloc try/catch pour intercepter et gérer les erreurs.

A savoir aussi que pour alléger ton code tu peux utiliser la fonction isset() avec plusieurs variables séparées par une virgule :
isset($a) && isset($b) && isset($c) == isset($a,$b,$c)
(Attention ce n'est pas valable pour empty())

Re: INSERT php PDO

par tof73 » 29 déc. 2014, 14:34

et il vaudrait mieux faire
header ('Location: respo.php');
après la requete sql plutôt qu'avant.

Re: INSERT php PDO

par Elie » 29 déc. 2014, 11:32

Hello,

Déjà fait en sorte d'afficher les erreurs PDO
http://php.net/manual/fr/pdo.error-handling.php
$conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Je ne vois pas de execute() qui valide le prepare()
http://php.net/manual/fr/pdostatement.execute.php

Et je serais toi je suivrais l'exemple Exemple #2 Exécute une requête préparée avec un tableau de valeurs (paramètres de nom) plutot que de faire les variables 1 par 1

INSERT php PDO

par Malalatiana » 29 déc. 2014, 09:04

Bonjour, voilà mon code
<?php
include ("header1.php");
?>
<?php
$hostdb = 'localhost';
$userdb = 'root';
$passdb = '';
$namedb = 'parcmfb';

try
   {
     $conn = new PDO("mysql:host=".$hostdb."; dbname=".$namedb."", $userdb, $passdb, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
     $conn->exec("SET CHARACTER SET utf8");
	}
catch (PDOException $e)
   {
     echo 'La base de donnée n\'est pas disponible';
    }
	
if((isset($_POST['NumRespo'])&&isset($_POST['NomRespo'])&&isset($_POST['MailRespo'])&&isset($_POST['TelRespo'])&&isset($_POST['Observation'])))
		{
		header ('Location: respo.php');

$stmt=$conn->prepare("INSERT INTO responsable(NumRespo, NomRespo, MailRespo, TelRespo, Observation) VALUES ( :NumRespo, :NomRespo, :MailRespo, :TelRespo, :Observation)");
$stmt->bindParam(':NumRespo', $NumRespo);
$stmt->bindParam(':NomRespo', $NomRespo);
$stmt->bindParam(':MailRespo', $MailRespo);
$stmt->bindParam(':TelRespo', $TelRespo);
$stmt->bindParam(':Observation', $Observation);
        }

else 
       {
        
$req = "SELECT * FROM responsable";
$res = $conn->query($req);
    print("<BR> ");
        foreach ($conn->query($req) as $row) 
        {
            print $row['NumRespo'] . "\t ";
            print $row['NomRespo'] . "\t";
            print $row['MailRespo'] . "\t";
            print $row['TelRespo'] . "\t";
            print $row['observation'] ."<BR>";
        }
    print(" <BR> ");

$req = "SELECT * FROM responsable";
$res = $conn->query($req);
    while ($row = $res->fetch())
    {
    print $row['NumRespo'] . " " . $row['NomRespo'] . " " . $row['MailRespo'] ." " . $row['TelRespo'] . " " . $row['Observation'] ."<BR>";
    }
       }


?>

	    <form name="form" action="ajout1.php" method="POST" enctype="multipart/form-data" >
		        <fieldset>
		    <legend><em>Ajout d'un Responsable</em></legend>
			<table align="center">
			<tr>
			    </td>
				    <label for="ChampNum">Num&eacute;ro Responsable:</label>
				</td>
				<td>
					<input type="text" id="NumRespo" name="NumRespo" require/>
				</td>
			</tr>
			<tr>
				<td>
				    <label for="ChampNom">Nom Responsable:</label>
				</td>
				<td>
				    <input type="text" id="NomRespo" name="NomRespo" require/>
				</td>
		    </tr>
			<tr>
				<td>
				    <label for="ChampMail">Mail Responsable:</label>
				</td>
				<td>
				    <input type="text" id="MailRespo" name="MailRespo" require/>
				</td>
		    </tr>
			<tr>
				<td>
				    <label for="ChampTel">T&eacute;l&eacute;phone Responsable:</label>
				</td>
				<td>
				    <input type="text" id="TelRespo" name="TelRespo" require/>
				</td>
		    </tr>
		    <tr>
				<td>
				    <label for="Champobs">Observation:</label>
				</td>
				<td>
				    <input type="text" id="Observation" name="Observation" require/>
				</td>
		    </tr>
        <tr>
		<td></td>		
	<td>
	    <form action="ajout1.php" method="POST">
	        <input type="submit" name="bouton" value="Ajouter" onclick="alert('Ajout avec succes');" /> 
		    <input type="reset" name="bouton" value="Annuler" onclick="alert('Ajout annuler');" /> 
	    </form>
	</td>
			</tr>
		</table>
		</fieldset>
	</form>

<?php
include ("footer.php");
?>

et quand j'ajoute les informations ainsi completés dans le formulaire n'est pas renvoyé dans la base, si quelqu'un a une idée de ce qui se passe, plz!! :cry: :cry: