[RESOLU] Aucune réaction sur la base de donnée

Eléphanteau du PHP | 16 Messages

29 déc. 2015, 13:19

Bonjour!! j'ai 2 pages dont l'un contient un formulaire de traitement (plusieurs champs input text) et l'autre contient une class en php qui traite l'insertion des données dans une base. La classe génère une requête insert into dynamique et elle marche si je la test mais mon problème est que les données venant du formulaire ne sont pas insérer dans la base après avoir cliqué un bouton "Ajouter". Voici les codes sources :
class.php

Code : Tout sélectionner

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()); } $retour = $this->ShowFields(); 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)"; $sth = $dbh->prepare($sql); foreach ($values as $f => $v) { $sth->bindValue(':name_' . $f, $v); } $sth->execute(); } }

formulaire.php

Code : Tout sélectionner

include_once 'class.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); }
Quelqu'un pour m'aider? svp :priere:
Cordialement

Mammouth du PHP | 2703 Messages

29 déc. 2015, 15:04

if(isset($_POST['valider']))
{
echo "on est ici";

est-ce que cela affiche bien "on est ici" après avoir cliqué sur le bouton ajouter ?

Eléphanteau du PHP | 16 Messages

29 déc. 2015, 15:27

Mercie pour ta réponse (<form method="POST" action="">) mais sa ne s'affiche pas :?

ynx
Mammouth du PHP | 586 Messages

29 déc. 2015, 15:35

Salut,

Si le message proposé par or 1 ne s'affiche pas c'est que ton formulaire ne contient aucun champ avec un attribut name égal à 'valider'. Peux tu montrer le code html de ton formulaire ?
Attention également à ta boucle foreach dans le fichier formulaire.php, sans accolades seule la première ligne après l'instruction foreach est répétée, ta méthode insert() n'est donc appelée qu'une seule fois dans ton code actuel et pas à chaque tour de boucle.

Bonne journée

Eléphanteau du PHP | 16 Messages

29 déc. 2015, 16:02

voici le champ du bouton <input type="submit" name="valider" value="Ajouter"/> et la variable passer en paramètre dans insert est supposer être un array car la fonction insert de la class reçoit un array comme paramètre

ynx
Mammouth du PHP | 586 Messages

29 déc. 2015, 16:40

Étrange. As tu essayer d'afficher le contenu de la variable $_POST dans le fichier formulaire.php pour vérifier que tu reçois bien les paramètre attendus (dont le paramètre 'valider') ? Ton formulaire est bien sur le même fichier (formulaire.php) ? Sinon il faut renseigner l'attribut action de la balise form.

Effectivement pour la paramètre de la fonction insert() je comprend mieux, mais dans ce cas ne faudrait-il pas utiliser la variable $values comme un tableau ? Par exemple pour l'affectation :
foreach ($_POST as $field => $val)
    $values[] = $val;
D'après ton code le tableau attendu en paramètre de la méthode insert doit posséder le nom des colonnes en clé du tableau, l'affectation devrait donc ressembler à (si les champs du formulaire sont identiques aux champs de la bdd) :
foreach ($_POST as $field => $val)
    $values[$field] = $val;
// ce qui revient à faire $values = $_POST;
// autant directement utiliser la variable $_POST

Eléphanteau du PHP | 16 Messages

30 déc. 2015, 08:34

Je suis encore Débutant en php et je ne comprend pas comment puis je affiché les contenu de $_POST dans la paramètre "valider" comme tu le dit et mon action sur le formulaire est vide <form method="POST" action="">...Peut tu m'éclairé un peut plus stp :oops:

Eléphanteau du PHP | 16 Messages

30 déc. 2015, 08:51

J'ai essayer d'afficher les $_POST et sa s'affiche bien et quand je met ceci <form method="POST" action="class.php"> et que je met un var_dump de mes $_POST dans class.php sa s'affiche aussi....

ynx
Mammouth du PHP | 586 Messages

30 déc. 2015, 10:29

Parfait les paramètres POST sont donc correctement transmis. Il faut par contre que tu renseignes le fichier formulaire.php dans l'attribut action de ton formulaire puisque c'est bien ce fichier qui va gérer le traitement du formulaire html (formulaire.php faisant lui même appel au fichier class.php).

Eléphanteau du PHP | 16 Messages

30 déc. 2015, 10:53

j'ai essayer ce que tu a dit et je suis redirigé vers une page vierge et actualisons ma Bd l'insertion que j'ai fait n'est pas insérer :?

ynx
Mammouth du PHP | 586 Messages

30 déc. 2015, 12:28

Peux tu stp nous poster le code html de ton formulaire et tes codes php s'ils ont été modifiés ?

Eléphanteau du PHP | 16 Messages

30 déc. 2015, 13:38

Code : Tout sélectionner

<?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; ?> <!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) ; //array_keys($_POST) ; ?> <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"/> <?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 ; } var_dump ($values); //var_dump ($_POST); $insert->insert($values); } ?> <?php deconnexion_DB(); ?> </body> </html>

ynx
Mammouth du PHP | 586 Messages

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.

Eléphanteau du PHP | 16 Messages

30 déc. 2015, 16:19

Je te suis vraiment reconnaissant et merci beaucoup pour ton aide!!! Sa marche nickel =D> !!!!