Problème requete mysql

Par ThéoDavi, il y a 5 ans


Les bases HTML/CSS
Base de données MySQL

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

ThéoDavi, il y a 5 ans

Ok merci

Carouge10, il y a 5 ans

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, il y a 5 ans

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à.