Bonjour,

Je rencontre un petit problème avec mon code.

Ce que je fais

Je cherche à envoyer des données dans une base de donnée

Code du Formulaire

<body>
    <h1>Ajouter des données</h1>
    <form action="insertionnet.php" method="post">

    <!-- 1 question du questionaire choix nom --> 
    <p>
        <label for="id">Nom</label>
        <select name="id">
    <option>Alain Davi</option>
    <option>Léa Damery</option>
  </select>
    </p>
    <!-- Collecte Date et Heure  --> 

    <p>
        <label for="cf">Chambre Froide :</label>
        <select name="cf">
    <option>Oui</option>
    <option>Non</option>
  </select>
    </p>
    <p>
        <label for="pat">Frigo Patisserie :</label>
        <select name="pat">
    <option>Oui</option>
    <option>Non</option>
  </select>
    </p>
    <p>
        <label for="pcf">Poste Chambre Froide :</label>
        <select name="pcf">
    <option>Oui</option>
    <option>Non</option>
  </select>
    </p>
    <p>
        <label for="frno">Piano:</label>
        <select name="frno">
    <option>Oui</option>
    <option>Non</option>
  </select>
    </p>
    <p>
        <label for="tc">Table Chaude :</label>
        <select name="tc">
    <option>Oui</option>
    <option>Non</option>
  </select>
    </p>
    <p>
        <label for="tcc">Poste Patisserie :</label>
        <select name="tcc">
    <option>Oui</option>
    <option>Non</option>
  </select>
    </p>
    <p>
        <label for="spat">Plonge :</label>
        <select name="spat">
    <option>Oui</option>
    <option>Non</option>
  </select>
    </p>
    <p>
        <label for="plg">Remise :</label>
        <select name="plg">
    <option>Oui</option>
    <option>Non</option>
  </select>
    </p>
    <p>
        <label for="rem">Sol :</label>
        <select name="rem">
    <option>Oui</option>
    <option>Non</option>
  </select>
    </p> 

   <!-- Envoyer --> 

<p> <input type="submit" value="Envoyer">
</p>

Code de l'envoie en base de donnée

<?php
//collecte des info + transmission bdd
$user='root';
$pass='';
$host='localhost';
$dbname='net';
$id=$_POST['id'];
$cf=$_POST['cf'];
$pat=$_POST['pat'];
$frno=$_POST['frno'];
$tc=$_POST['tc'];
$tcc=$_POST['tcc'];
$spat=$_POST['spat'];
$plg=$_POST['plg'];
$rem=$_POST['rem'];
$sol=$_POST['sol'];

$conn = new mysqli ($host, $user, $pass, $dbname);

if(mysqli_connect_error()){
    die('Connect Error ('.mysqli_connect_errno().')'
    .mysqli_connect_error());
}

else{
  $sql3 = "INSERT INTO net (id,cf,pat,pcf,frno,tc,tcc,spat,plg,rem,sol) values ('$id','$cf','$pat','$frno','$tc','$tcc','$spat','$plg','$rem','$sol')";
  if ($conn->query($sql3)){
    echo "Succes";}

    else{
        echo "Error :".$sql3."<br>".$conn->error;
}
}
$conn->close();

L'erreur reçue

Error :INSERT INTO net (id,cf,pat,pcf,frno,tc,tcc,spat,plg,rem,sol) values ('','','','','','','','','','')
Column count doesn't match value count at row 1

Capture de la table

https://drive.google.com/file/d/1Eq5HAZVngmszqb16H9HITLc3PVAy6fSg/view?usp=sharing

Merci de votre aide

3 réponses


Carouge10
Réponse acceptée

Bonsoir,
Il faudra penser à préparée ta requêtes pour éviter les injections SQL
Ton erreur viens du faite que tes options n'ont pas de "value"

Cybercraft
Réponse acceptée

Je rajoute également, que tu as 10 valeurs pour 11 colonnes à modifier. il te manque $pcf, si je comprend bien.

Je me doute bien que ce doit être un test ou un excercice pour tester une connection DB... Mais faites un effort :

  • Créer une classe DAO (une classe qui va gérer vos accés DB)
  • Créer une classe Model pour datamapper votre table "net"
  • Préparer vos requêtes avant de les éxécuter.

Je fais un exemple ici: (non-testé)...

DAO : DatabaseAccessObject.php :

<?php

class DatabaseAccessObject extends \mysqli
{
    /**
     * Creates a prepared query, binds the given parameters and returns the result of the executed
     * {@link \mysqli_stmt}.
     * @param string $query
     * @param array $args
     * @return bool|\mysqli_result
     */
    public function queryPrepared($query, array $args)
    {
        $stmt   = $this->prepare($query);
        $params = [];
        $types  = array_reduce($args, function ($string, &$arg) use (&$params) {
            $params[] = &$arg;
            if (is_float($arg))         $string .= 'd';
            elseif (is_integer($arg))   $string .= 'i';
            elseif (is_string($arg))    $string .= 's';
            else                        $string .= 'b';
            return $string;
        }, '');
        array_unshift($params, $types);

        call_user_func_array([$stmt, 'bind_param'], $params);

        $result = $stmt->execute() ? $stmt->get_result() : false;

        $stmt->close();

        return $result;
    }
}

Model : NetModel.php

<?php

class NetModel implements \ArrayAccess
{    
    private $id;
    private $cf;
    private $pcf;
    private $pat;
    private $frno;
    private $tc;
    private $tcc;
    private $spat;
    private $plg;
    private $rem;
    private $sol;

    public function __construct(array $properties)
    {

        foreach ($properties as $key => $property)
        {
            if(property_exists($this, $key)) {
                $this->$key = $property;
            }
        }
    }

    public function offsetExists($offset)
    {
        if(property_exists($this, $offset))
        {
            return true;
        }
        return false;
    }

    public function offsetGet($offset)
    {
        if(property_exists($this, $offset))
        {
            return $this->$offset;
        }
        return null;
    }

    public function offsetSet($offset, $value)
    {
        if(property_exists($this, $offset))
        {
            $this->$offset = $value;
        }
    }

    public function offsetUnset($offset)
    {
        if(property_exists($this, $offset))
        {
            $this->$offset = null;
        }
    }

    // Getters & Setters (a faire toi-même)
}

Persistance (insertionnet.php) :

// Cette partie là pourrait se mettre dans un fichier non-accesible par le navigateur. genre un config.php qui n'est pas dans le DocumentRoot.

$user='root';
$pass='';
$host='localhost';
$dbname='net';

try {
    $conn = new DatabaseAccessObject($host, $user, $pass, $dbname);
    $netInstance = new NetModel($_POST);
    $conn->queryPrepared(INSERT INTO net (id,cf,pat,pcf,frno,tc,tcc,spat,plg,rem,sol) values (?), implode(",", $netInstance));
} catch ($e) {
    echo $e->getMessage();
} finally {
    $conn->close();
}    

A tester, mais je ferai un truc dans ce goût là.

Ok merci