par
ynx » 30 déc. 2015, 15:57
Ton formulaire étant sur la même page que son traitement PHP, il est donc correct de laisser l'attribut action du formulaire vide.
Une bonne pratique est d'avoir tous les traitements php au début de ton code avant le code html et ne garder dans le code html que les instructions php utilisées pour l'affichage. Le code php gérant la validation du formulaire peut donc être déplacé au début de ton script.
Concernant le code gérant la validation du formulaire, les variables $Host, $Db et $tab n'étant utilisée qu'une seule fois, on peut donc directement saisir leur valeur dans l'instanciation de la classe inserer (on gagne quelques lignes). L'objet inserer n'étant utilisé que lorsque le formulaire est validé, il n'est donc pas nécessaire de l'instancier à chaque chargement de la page mais uniquement lorsque $_POST['valider'] est défini (à la validation du formulaire). Enfin comme indiqué dans un précédent message, la boucle sur la variable $_POST est inutile, autant utiliser cette variable directement.
Donc le code suivant :
$Host = 'localhost';
$Db = 'baseadsl';
$tab = 'nvllinstallation';
$values = array();
$insert = new inserer($Host, $Db, $tab);
if(isset($_POST['valider'])) {
foreach ($_POST as $field => $val){
$values[] = $val ;
}
$insert->insert($values);
}
peut être simplifié comme ceci :
if(isset($_POST['valider'])) {
$insert = new inserer('localhost', 'baseadsl', 'nvllinstallation');
unset($_POST['valider']);
$insert->insert($_POST);
}
Puisque les paramètres POST sont directement utilisés dans la méthode insert() pour générer la requête sql, j'ai ajouté une instruction pour supprimer le paramètre $_POST['valider'] car celui-ci n'est surement pas utilisé pour la requête sql.
N'ayant pas accès à ta base de données et n'ayant pas le code html généré de ton formulaire, j'ai donc ajouté des input d'exemples pour tester. J'ai également remplacer l'appel de la méthode ShowFields() par des données fictives et ajouter un var_dump() de la requête préparée pour le débug dans le fichier classInsertion.php.
formulaire.php
<?php
error_reporting(E_ALL);
include_once 'fonctions.php';
require_once 'classInsertion.php';
//connexion_DB('BASE_TEST');
$id_label = 1;
$_ENV['id_label'] = $id_label;
if(isset($_POST['valider'])) {
$insert = new inserer('localhost', 'baseadsl', 'nvllinstallation');
unset($_POST['valider']);
$insert->insert($_POST);
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scol=1.0 " >
<Link rel="stylesheet" href="styleOnglet.css" type="text/css" media="screen" />
<title>Nvll Installation Adsl</title>
</head>
<body>
<div id="wrapper">
<header>
<a href="#"><img src="LOGO_200x151.jpg"/></a>
</header>
<nav>
<ul>
<li><a href="#">A propos</a></li>
<li class='active'><a href="#">Installation</a></li>
<li><a href="../Acceuil_Instal/essai1.html">Acceuil</a> </li>
</ul>
</nav>
<section>
<aside>
<h1>Nouvelle installation Adsl</h1>
<form method="POST" action="">
<fieldset>
<legend>Traitement</legend>
<?php
$nomT = "adsl";
$traitement = "Nouvelle installation";
update();
include 'testUpdate.php';
echo affiche_label($traitement, $nomT) ;
traitement($nomT, $traitement) ;
?>
<!-- exemple d'input -->
<input type="text" name="field1" />
<input type="text" name="field2" />
<input type="text" name="field3" />
<input type="submit" name="valider" value="Ajouter"/>
</fieldset>
</form>
</aside>
</section>
<footer>
<h1>Pieds de page</h1>
</footer>
</div>
<script type="text/javascript" src="select2.min.js"/>
</body>
</html>
classInsertion.php
<?php
class inserer {
protected $DbHost;
protected $DbName;
protected $DbUser = 'root';
protected $DbPass = '';
protected $Table;
protected $dsn;
public function __construct($Host, $Db, $tab) {
$this->setDbHost($Host);
$this->setDbName($Db);
$this->setTable($tab);
}
public function setDbHost($host) {
$this->DbHost = $host;
}
public function setDbName($name) {
$this->DbName = $name;
}
public function setTable($tab) {
$this->Table = $tab;
}
public function setDsn() {
$this->dsn = "mysql:host=" . $this->DbHost . ";dbname=" . $this->DbName;
}
public function ShowFields() {
$fafn = array();
//global $dbh;
try {
$dbh = new PDO("mysql:host=$this->DbHost;dbname=$this->DbName", $this->DbUser, $this->DbPass, array(PDO::ATTR_PERSISTENT => true));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec('SET NAMES utf8');
} catch (Exception $e) {
die('Erreur de connexion : ' . $e->getMessage());
}
$sql = 'SHOW COLUMNS from ' . $this->Table;
$result = $dbh->prepare($sql);
$result->execute();
while ($ult = $result->fetch(PDO::FETCH_ASSOC)) {
if ($ult['Field'] == 'id') {
$rep = $ult['Field'];
} else {
$fafn[] = $ult['Field'];
}
}
return $fafn;
}
public function insert($values = array()) {
try {
$dbh = new PDO("mysql:host=$this->DbHost;dbname=$this->DbName", $this->DbUser, $this->DbPass, array(PDO::ATTR_PERSISTENT => true));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec('SET NAMES utf8');
} catch (Exception $e) {
die('Erreur de connexion : ' . $e->getMessage());
}
// test
//$retour = $this->ShowFields();
$retour = array('champBDD1', 'champBDD2', 'champBDD3');
foreach ($retour as $fil => $val)
$index[$val] = '';
foreach ($values as $field => $v)
$ins[] = ':name_' . $field;
$ins = implode(',', $ins);
$fields = implode(',', array_keys($index));
$sql = "INSERT INTO " . $this->Table . " ($fields) VALUES ($ins)";
// debug
var_dump($sql);
exit();
$sth = $dbh->prepare($sql);
foreach ($values as $f => $v) {
$sth->bindValue(':name_' . $f, $v);
}
$sth->execute();
}
}
Dans mon test, je suppose que la méthode ShowFields() nous retourne un tableau contenant le nom des 3 champs de la table sql (champBDD1, champBDD2, champBDD3). En validant le formulaire après avoir saisie des valeurs dans les input d'exemples field1, field2 et field3, j'obtiens bien la requête suivante :
INSERT INTO nvllinstallation (champBDD1,champBDD2,champBDD3) VALUES (:name_field1,:name_field2,:name_field3)
A toi ensuite de vérifier que l'ordre des champs du formulaire correspond bien à l'ordre des champs en bdd afin que la requête soit correcte.
Ton formulaire étant sur la même page que son traitement PHP, il est donc correct de laisser l'attribut action du formulaire vide.
Une bonne pratique est d'avoir tous les traitements php au début de ton code avant le code html et ne garder dans le code html que les instructions php utilisées pour l'affichage. Le code php gérant la validation du formulaire peut donc être déplacé au début de ton script.
Concernant le code gérant la validation du formulaire, les variables $Host, $Db et $tab n'étant utilisée qu'une seule fois, on peut donc directement saisir leur valeur dans l'instanciation de la classe inserer (on gagne quelques lignes). L'objet inserer n'étant utilisé que lorsque le formulaire est validé, il n'est donc pas nécessaire de l'instancier à chaque chargement de la page mais uniquement lorsque $_POST['valider'] est défini (à la validation du formulaire). Enfin comme indiqué dans un précédent message, la boucle sur la variable $_POST est inutile, autant utiliser cette variable directement.
Donc le code suivant :
[php]$Host = 'localhost';
$Db = 'baseadsl';
$tab = 'nvllinstallation';
$values = array();
$insert = new inserer($Host, $Db, $tab);
if(isset($_POST['valider'])) {
foreach ($_POST as $field => $val){
$values[] = $val ;
}
$insert->insert($values);
}[/php]
peut être simplifié comme ceci :
[php]if(isset($_POST['valider'])) {
$insert = new inserer('localhost', 'baseadsl', 'nvllinstallation');
unset($_POST['valider']);
$insert->insert($_POST);
}[/php]
Puisque les paramètres POST sont directement utilisés dans la méthode insert() pour générer la requête sql, j'ai ajouté une instruction pour supprimer le paramètre $_POST['valider'] car celui-ci n'est surement pas utilisé pour la requête sql.
N'ayant pas accès à ta base de données et n'ayant pas le code html généré de ton formulaire, j'ai donc ajouté des input d'exemples pour tester. J'ai également remplacer l'appel de la méthode ShowFields() par des données fictives et ajouter un var_dump() de la requête préparée pour le débug dans le fichier classInsertion.php.
formulaire.php
[php]<?php
error_reporting(E_ALL);
include_once 'fonctions.php';
require_once 'classInsertion.php';
//connexion_DB('BASE_TEST');
$id_label = 1;
$_ENV['id_label'] = $id_label;
if(isset($_POST['valider'])) {
$insert = new inserer('localhost', 'baseadsl', 'nvllinstallation');
unset($_POST['valider']);
$insert->insert($_POST);
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scol=1.0 " >
<Link rel="stylesheet" href="styleOnglet.css" type="text/css" media="screen" />
<title>Nvll Installation Adsl</title>
</head>
<body>
<div id="wrapper">
<header>
<a href="#"><img src="LOGO_200x151.jpg"/></a>
</header>
<nav>
<ul>
<li><a href="#">A propos</a></li>
<li class='active'><a href="#">Installation</a></li>
<li><a href="../Acceuil_Instal/essai1.html">Acceuil</a> </li>
</ul>
</nav>
<section>
<aside>
<h1>Nouvelle installation Adsl</h1>
<form method="POST" action="">
<fieldset>
<legend>Traitement</legend>
<?php
$nomT = "adsl";
$traitement = "Nouvelle installation";
update();
include 'testUpdate.php';
echo affiche_label($traitement, $nomT) ;
traitement($nomT, $traitement) ;
?>
<!-- exemple d'input -->
<input type="text" name="field1" />
<input type="text" name="field2" />
<input type="text" name="field3" />
<input type="submit" name="valider" value="Ajouter"/>
</fieldset>
</form>
</aside>
</section>
<footer>
<h1>Pieds de page</h1>
</footer>
</div>
<script type="text/javascript" src="select2.min.js"/>
</body>
</html>[/php]
classInsertion.php
[php]<?php
class inserer {
protected $DbHost;
protected $DbName;
protected $DbUser = 'root';
protected $DbPass = '';
protected $Table;
protected $dsn;
public function __construct($Host, $Db, $tab) {
$this->setDbHost($Host);
$this->setDbName($Db);
$this->setTable($tab);
}
public function setDbHost($host) {
$this->DbHost = $host;
}
public function setDbName($name) {
$this->DbName = $name;
}
public function setTable($tab) {
$this->Table = $tab;
}
public function setDsn() {
$this->dsn = "mysql:host=" . $this->DbHost . ";dbname=" . $this->DbName;
}
public function ShowFields() {
$fafn = array();
//global $dbh;
try {
$dbh = new PDO("mysql:host=$this->DbHost;dbname=$this->DbName", $this->DbUser, $this->DbPass, array(PDO::ATTR_PERSISTENT => true));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec('SET NAMES utf8');
} catch (Exception $e) {
die('Erreur de connexion : ' . $e->getMessage());
}
$sql = 'SHOW COLUMNS from ' . $this->Table;
$result = $dbh->prepare($sql);
$result->execute();
while ($ult = $result->fetch(PDO::FETCH_ASSOC)) {
if ($ult['Field'] == 'id') {
$rep = $ult['Field'];
} else {
$fafn[] = $ult['Field'];
}
}
return $fafn;
}
public function insert($values = array()) {
try {
$dbh = new PDO("mysql:host=$this->DbHost;dbname=$this->DbName", $this->DbUser, $this->DbPass, array(PDO::ATTR_PERSISTENT => true));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec('SET NAMES utf8');
} catch (Exception $e) {
die('Erreur de connexion : ' . $e->getMessage());
}
// test
//$retour = $this->ShowFields();
$retour = array('champBDD1', 'champBDD2', 'champBDD3');
foreach ($retour as $fil => $val)
$index[$val] = '';
foreach ($values as $field => $v)
$ins[] = ':name_' . $field;
$ins = implode(',', $ins);
$fields = implode(',', array_keys($index));
$sql = "INSERT INTO " . $this->Table . " ($fields) VALUES ($ins)";
// debug
var_dump($sql);
exit();
$sth = $dbh->prepare($sql);
foreach ($values as $f => $v) {
$sth->bindValue(':name_' . $f, $v);
}
$sth->execute();
}
}[/php]
Dans mon test, je suppose que la méthode ShowFields() nous retourne un tableau contenant le nom des 3 champs de la table sql (champBDD1, champBDD2, champBDD3). En validant le formulaire après avoir saisie des valeurs dans les input d'exemples field1, field2 et field3, j'obtiens bien la requête suivante :
[sql]INSERT INTO nvllinstallation (champBDD1,champBDD2,champBDD3) VALUES (:name_field1,:name_field2,:name_field3)[/sql]
A toi ensuite de vérifier que l'ordre des champs du formulaire correspond bien à l'ordre des champs en bdd afin que la requête soit correcte.