Column ...cannot be null
Résolu/Fermé
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
-
4 août 2017 à 23:13
mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017 - 6 août 2017 à 22:45
mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017 - 6 août 2017 à 22:45
A voir également:
- Mysql column cannot be null
- The language dll vb6fr.dll could not be found - Forum Windows
- Outlook be - Forum Outlook
- Cannot find required map name - Forum BIOS
7 réponses
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
Ambassadeur
1 568
Modifié le 5 août 2017 à 17:08
Modifié le 5 août 2017 à 17:08
bonjour,
je trouve cette partie de code bizarre:
que veux-tu y faire exactement?
par ailleurs, je vois deux instructions qui assignent une valeur à $stock_reel. il est très possible, vu la logique de ton code, que tu n'exécutes aucune des deux, et donc que $stock_reel soit vide.
je suggère, aussi, de déplacer hors du foreach le prepare et bindparam de $toutes_tables.
je trouve cette partie de code bizarre:
foreach($toutes_tables as $table) { $stock_reel = $table['volume']; }
que veux-tu y faire exactement?
par ailleurs, je vois deux instructions qui assignent une valeur à $stock_reel. il est très possible, vu la logique de ton code, que tu n'exécutes aucune des deux, et donc que $stock_reel soit vide.
je suggère, aussi, de déplacer hors du foreach le prepare et bindparam de $toutes_tables.
jordane45
Messages postés
38446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
28 février 2025
4 739
5 août 2017 à 10:35
5 août 2017 à 10:35
Bonjour
Tu es récupères où te variables post ?
Que vaut $stock_reel ??
Car bon... le message d'erreur est pourtant clair et facile à comprendre. ...
Tu es récupères où te variables post ?
Que vaut $stock_reel ??
Car bon... le message d'erreur est pourtant clair et facile à comprendre. ...
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
5 août 2017 à 13:21
5 août 2017 à 13:21
Salut, oui le message est clair
je récupère ici:
je récupère ici:
<?php
include 'sqlconnect.php';
// On récupère tout le contenu de la table stock_antigel
$toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="stock_antigel.css" />
<title>Relevé de niveaux Stock Antigel</title>
</head>
<body>
<?php
include 'header.html';
include 'menu.html';
?>
<?php if(isset($toutes_donnees)): ?>
<form action="stock_antigel_update.php" method="post">
<p>
<?php foreach($toutes_donnees as $donnees): ?>
<input type="hidden" name="id<?php echo $donnees['id'];?>" value="<?php echo $donnees['id'];?>"/>
<label for="niveau_matiere_premiere"><?php echo $donnees['matiere_premiere'] . ' :'; ?></label> <input type="number" step="0.01" name="mesure_observee<?php echo $donnees['id']; ?>" id="mesure_observee" value="<?php echo $donnees['mesure_observee']; ?>"/><br /><br />
<?php endforeach; ?>
<input type="submit" value="Envoyer" />
</p>
</form>
<?php else: ?>
<p>Une erreur a eu lieu avec la base de donnée. Nous vous présentons nos excuses pour la gêne occasionnée.</p>
<?php endif; ?>
</body>
</html>
jordane45
Messages postés
38446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
28 février 2025
4 739
5 août 2017 à 13:43
5 août 2017 à 13:43
Ce n'est pas le même fichier... donc non.. ce n ai pas là que tu "récupères" le contenu de tes variables POST...
jordane45
Messages postés
38446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
28 février 2025
4 739
>
jordane45
Messages postés
38446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
28 février 2025
Modifié le 5 août 2017 à 13:44
Modifié le 5 août 2017 à 13:44
Quand je parle de récupérer. . Je veux dire lire la valeur de $_POST et mettre dans une variable pour l'utiliser ensuite dans tes requetes insert / update
jordane45
Messages postés
38446
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
28 février 2025
4 739
5 août 2017 à 13:45
5 août 2017 à 13:45
Regarde ici comment faire la recup proprement
https://forums.commentcamarche.net/forum/affich-37636387-php-notice-undefined-index
https://forums.commentcamarche.net/forum/affich-37636387-php-notice-undefined-index
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
Ambassadeur
1 568
5 août 2017 à 17:07
5 août 2017 à 17:07
le
fetchAll
est-il optionnel après un execute?
$toutes_tables->execute(); foreach($toutes_tables as $table)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
5 août 2017 à 21:04
5 août 2017 à 21:04
mon fichier index:
mon formulaire:
mon fichier de traitement avec mes derniers bricolages qui ne donnent rien de mieux par rapport à mon premier message...
$_POST["mesure_observee$id"] répond bien à mes attentes, il crée une boucle
https://img-19.ccm2.net/TomADgAKapBkLAIQ9xycYENnz5I=/0ea258a1368945dc8ade9c9bccf25bea/ccm-ugc/snapshot9.png
<?php
include 'header.html';
include 'sqlconnect.php';
?>
<?php
// On récupère tout le contenu de la table stock_antigel
$toutes_donnees = $bdd->query('SELECT * FROM stock_antigel ORDER BY stock_antigel.id ASC')->fetchAll();
?>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="stock_antigel.css" />
<title>Stock Antigel</title>
</head>
<body>
<h1>SUIVI STOCK ANTIGEL</h1>
<?php
include 'menu.html';
?>
<br>
<br>
<br>
<center>
<table>
<thead> <!-- En-tête du tableau -->
<tr class="couleur_tr">
<th>Matière première</th>
<th>Code Produit</th>
<th>Emplacement</th>
<th>Mesure observée</th>
<th>Stock réel</th>
<th>Niveau déclenchement appro</th>
<th>Niveau alarme</th>
</tr>
</thead>
<tfoot> <!-- Pied de tableau -->
<tr class="couleur_tr">
<th>Matière première</th>
<th>Code Produit</th>
<th>Emplacement</th>
<th>Mesure observée</th>
<th>Stock réel</th>
<th>Niveau déclenchement appro</th>
<th>Niveau alarme</th>
</tr>
</tfoot>
<?php foreach($toutes_donnees as $donnees): ?>
<tbody> <!-- Corps du tableau -->
<tr>
<td><?php echo $donnees['matiere_premiere'];?></td>
<td><?php echo $donnees['code_produit'];?></td>
<td><?php echo $donnees['emplacement'];?></td>
<td><?php echo $donnees['mesure_observee'];?></td>
<td><?php echo $donnees['stock_reel'];?></td>
<td><?php echo $donnees['niveau_appro'];?></td>
<td><?php echo $donnees['niveau_alarme'];?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</center>
</body>
</html>
mon formulaire:
<?php
include 'sqlconnect.php';
// On récupère tout le contenu de la table stock_antigel
$toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="stock_antigel.css" />
<title>Relevé de niveaux Stock Antigel</title>
</head>
<body>
<?php
include 'header.html';
include 'menu.html';
?>
<?php if(isset($toutes_donnees)): ?>
<form action="stock_antigel_update.php" method="post">
<p>
<?php foreach($toutes_donnees as $donnees): ?>
<input type="hidden" name="id<?php echo $donnees['id'];?>" value="<?php echo $donnees['id'];?>"/>
<label for="niveau_matiere_premiere"><?php echo $donnees['matiere_premiere'] . ' :'; ?></label> <input type="number" step="0.01" name="mesure_observee<?php echo $donnees['id']; ?>" id="mesure_observee" value="<?php echo $donnees['mesure_observee']; ?>"/><br /><br />
<?php endforeach; ?>
<input type="submit" value="Envoyer" />
</p>
</form>
<?php else: ?>
<p>Une erreur a eu lieu avec la base de donnée. Nous vous présentons nos excuses pour la gêne occasionnée.</p>
<?php endif; ?>
</body>
</html>
mon fichier de traitement avec mes derniers bricolages qui ne donnent rien de mieux par rapport à mon premier message...
<?php
//Rien de reçu => on bosse pas
if (!empty($_POST)) {
//Je mets tout dans un T/C
try {
//TOUJOURS ACTIVER LES EXCEPTIONS
$bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', 'lionel0769',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll();
$requeteUpdate = "UPDATE stock_antigel SET mesure_observee = :mesure_observee,stock_reel = :stock_reel WHERE id = :id";
$stmt = $bdd->prepare($requeteUpdate);
$stmt->bindParam(':mesure_observee', $mesure, PDO::PARAM_STR);
$stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_STR);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
foreach($toutes_donnees as $donnees){
$id = $donnees['id'];
$mesure = $_POST["mesure_observee$id"];
if($donnees['facteur_conversion_mesureareel'] != 0){
$stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];}
else{
$toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE hauteur = :hauteur");
$toutes_tables->bindParam(':hauteur',$mesure, PDO::PARAM_STR);
$toutes_tables->execute();
$mesure = $_POST["mesure_observee$id"];
foreach($toutes_tables as $table){
$stock_reel = $table->fetch(PDO::FETCH_ASSOC);
}}
if (!$stmt->execute()) {
throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')');
}
} //fin foreach
header('Location: index.php');
}catch (PDOException $pdoE) {
echo 'Exception PDO: '.$pdoE->getMessage();
} catch (Exception $e) {
echo 'Exception Autre: '.$e->getMessage();
}
}
?>
$_POST["mesure_observee$id"] répond bien à mes attentes, il crée une boucle
https://img-19.ccm2.net/TomADgAKapBkLAIQ9xycYENnz5I=/0ea258a1368945dc8ade9c9bccf25bea/ccm-ugc/snapshot9.png
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
1 568
Modifié le 5 août 2017 à 21:52
Modifié le 5 août 2017 à 21:52
ce serait beaucoup plus clair si tu choisissais de partager ton code comme du code "php", ainsi:
je suggère de déplacer hors du foreach le prepare et bindparam de $toutes_tables (les lignes 25 à 28).
la ligne 30 est inutile, tu l'as déjà fait en 20.
ne devrais-tu pas tester que la requête en ligne 29 te renvoie des données, et faire un traitement particulier sinon?
je pense que tu as deux soucis avec les lignes 31 à 33:
- tu n'utilises que la dernière valeur de $stock_reel, pourquoi?
- j'utilisation du fetch est bizarre; suggestion:
Tu pourrais aussi, quand tu as une exception, ajouter des print_r de $stock_reel, de $resultat_toutes_tables, de $table, de $toutes_donnees, de $donnees et de $_POST: cela t'aiderait beaucoup à comprendre ce qui se passe.
<?php //Rien de reçu => on bosse pas if (!empty($_POST)) { //Je mets tout dans un T/C try { //TOUJOURS ACTIVER LES EXCEPTIONS $bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', 'lionel0769',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll(); $requeteUpdate = "UPDATE stock_antigel SET mesure_observee = :mesure_observee,stock_reel = :stock_reel WHERE id = :id"; $stmt = $bdd->prepare($requeteUpdate); $stmt->bindParam(':mesure_observee', $mesure, PDO::PARAM_STR); $stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); foreach($toutes_donnees as $donnees){ $id = $donnees['id']; $mesure = $_POST["mesure_observee$id"]; if($donnees['facteur_conversion_mesureareel'] != 0){ $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];} else{ $toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE hauteur = :hauteur"); $toutes_tables->bindParam(':hauteur',$mesure, PDO::PARAM_STR); $toutes_tables->execute(); $mesure = $_POST["mesure_observee$id"]; foreach($toutes_tables as $table){ $stock_reel = $table->fetch(PDO::FETCH_ASSOC); }} if (!$stmt->execute()) { throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')'); } } //fin foreach header('Location: index.php'); }catch (PDOException $pdoE) { echo 'Exception PDO: '.$pdoE->getMessage(); } catch (Exception $e) { echo 'Exception Autre: '.$e->getMessage(); } } ?>
je suggère de déplacer hors du foreach le prepare et bindparam de $toutes_tables (les lignes 25 à 28).
la ligne 30 est inutile, tu l'as déjà fait en 20.
ne devrais-tu pas tester que la requête en ligne 29 te renvoie des données, et faire un traitement particulier sinon?
je pense que tu as deux soucis avec les lignes 31 à 33:
- tu n'utilises que la dernière valeur de $stock_reel, pourquoi?
- j'utilisation du fetch est bizarre; suggestion:
$toutes_tables->execute(); $resultat_toutes_tables=$toutes_tables->fetchAll(); foreach($resultat_toutes_tables as $table){ $stock_reel = $table['volume'];
Tu pourrais aussi, quand tu as une exception, ajouter des print_r de $stock_reel, de $resultat_toutes_tables, de $table, de $toutes_donnees, de $donnees et de $_POST: cela t'aiderait beaucoup à comprendre ce qui se passe.
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
>
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
5 août 2017 à 23:14
5 août 2017 à 23:14
<?php //Rien de reçu => on bosse pas if (!empty($_POST)) { //Je mets tout dans un T/C try { //TOUJOURS ACTIVER LES EXCEPTIONS $bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', 'lionel0769',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); //J'ai déplacé le prepare et le bindparam $toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE hauteur = :hauteur"); $toutes_tables->bindParam(':hauteur',$mesure, PDO::PARAM_STR); $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll(); $requeteUpdate = "UPDATE stock_antigel SET mesure_observee = :mesure_observee,stock_reel = :stock_reel WHERE id = :id"; $stmt = $bdd->prepare($requeteUpdate); $stmt->bindParam(':mesure_observee', $mesure, PDO::PARAM_STR); $stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); foreach($toutes_donnees as $donnees){ $id = $donnees['id']; $mesure = $_POST["mesure_observee$id"]; if($donnees['facteur_conversion_mesureareel'] != 0){ $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];} else{ $toutes_tables->execute(); // J'ai supprimé le deuxième $mesure //je change le fetch comme suggéré $resultat_toutes_tables=$toutes_tables->fetchAll(); foreach($resultat_toutes_tables as $table){ $stock_reel = $table['volume']; }} //je test si $toutes_tables est exécuté sinon message d'erreur if (!$stmt->execute() or !$toutes_tables->execute()) { throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')'); } } //fin foreach header('Location: index.php'); }catch (PDOException $pdoE) { echo 'Exception PDO: '.$pdoE->getMessage(); } catch (Exception $e) { echo 'Exception Autre: '.$e->getMessage(); } } ?>
Par contre je n'ai pas compris ce que tu dis comme quoi je n' utilise que la dernière valeur de $stock_reel
les print_r ils sont à mettre dans mon fichier html?
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
1 568
>
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
Modifié le 6 août 2017 à 00:00
Modifié le 6 août 2017 à 00:00
ton test or !$toutes_tables->execute() n'est pas correct. que doit-il se passer si la hauteur n'est pas présente dans la table table_stockage?
suggestion, avant la ligne 22, tu ajoutes
comprends-tu ce que font les instructions suivantes? à quoi servent-elles? pourquoi changer plusieurs fois la valeur de $stock_reel, sans l'utiliser entre chaque changement? peux-tu avoir plusieurs volumes pour la même hauteur dans la table table_stockage?
les print_r sont à mettre avec les echo en cas d'exception. regarde la documentation php. fais aussi print_r de $id. ou bien fais simplement
suggestion, avant la ligne 22, tu ajoutes
$stock_reel = NULL;, et avant la ligne 38, tu ajoutes:
if (is_null($stock_reel)) { throw new Exception('Pas trouvé $stock_reel (ID '.$id.')'); }
comprends-tu ce que font les instructions suivantes? à quoi servent-elles? pourquoi changer plusieurs fois la valeur de $stock_reel, sans l'utiliser entre chaque changement? peux-tu avoir plusieurs volumes pour la même hauteur dans la table table_stockage?
foreach($resultat_toutes_tables as $table){ $stock_reel = $table['volume']; }
les print_r sont à mettre avec les echo en cas d'exception. regarde la documentation php. fais aussi print_r de $id. ou bien fais simplement
print_r(get_defined_vars());
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
6 août 2017 à 08:28
6 août 2017 à 08:28
Salut et merci de ta patience...
Donc j'ai commencé à faire un print_r de toutes tables qui me renvoie rien
j'ai ensuite comme tu m'as dit ajouté le stock_reel = NULL; et la condition
qui me répond qu'il n'a pas trouvé id27 qui correspond à test
Pour le foreach, je parcours le tableau $resultat et j'affecte la valeur trouvé à $table sauf qu'effectivement je n'ai pas plusieurs volume pour la même hauteur donc je peux le supprimer, c'est bien ça ?
Donc j'ai commencé à faire un print_r de toutes tables qui me renvoie rien
j'ai ensuite comme tu m'as dit ajouté le stock_reel = NULL; et la condition
qui me répond qu'il n'a pas trouvé id27 qui correspond à test
Pour le foreach, je parcours le tableau $resultat et j'affecte la valeur trouvé à $table sauf qu'effectivement je n'ai pas plusieurs volume pour la même hauteur donc je peux le supprimer, c'est bien ça ?
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
1 568
6 août 2017 à 10:01
6 août 2017 à 10:01
ce serait plus clair si tu partageais le message d'erreur affiché, ainsi que ton code modifié, et l'affichage exact de tous les print_r.
bien sûr, continue à tester avec les mêmes données.
pour le moment, tu peux laisser le "foreach($resultat)".
tu n'as pas répondu à ceci: "que doit-il se passer si la hauteur n'est pas présente dans la table table_stockage?".
as-tu fait
bien sûr, continue à tester avec les mêmes données.
pour le moment, tu peux laisser le "foreach($resultat)".
tu n'as pas répondu à ceci: "que doit-il se passer si la hauteur n'est pas présente dans la table table_stockage?".
as-tu fait
print_r($_POST);? que vaut
$_POST["mesure_observee27"]? Cette valeur est-elle présente comme hauteur dans la table table_stockage?
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
>
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
6 août 2017 à 11:05
6 août 2017 à 11:05
si je laisse le foreach, j'obtiens la même erreur:
Exception PDO: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'stock_reel' cannot be null
donc avec ce code:
si j'enlève le foreach, l'erreur est:
Exception Autre: Pas trouvé $stock_reel (ID 27)
avec ce code:
D'ailleurs lorsque la valeur est 1.50 , j'ai bien une valeur pour stock_reel
Si la hauteur n'est pas présente dans la bdd je suppose que ça va me renvoyer une erreur, par contre 1,45 est bien dans la base de donnée
Je crois n' avoir rien oublié comme réponse à tes questions cette fois, désolé
Exception PDO: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'stock_reel' cannot be null
donc avec ce code:
<?php //Rien de reçu => on bosse pas if (!empty($_POST)) { //Je mets tout dans un T/C try { //TOUJOURS ACTIVER LES EXCEPTIONS $bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', 'lionel0769',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); //J'ai déplacé le prepare et le bindparam $toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE hauteur = :hauteur"); $toutes_tables->bindParam(':hauteur',$mesure, PDO::PARAM_STR); $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll(); $requeteUpdate = "UPDATE stock_antigel SET mesure_observee = :mesure_observee,stock_reel = :stock_reel WHERE id = :id"; $stmt = $bdd->prepare($requeteUpdate); $stmt->bindParam(':mesure_observee', $mesure, PDO::PARAM_STR); $stock_reel = NULL; $stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); foreach($toutes_donnees as $donnees){ $id = $donnees['id']; $mesure = $_POST["mesure_observee$id"]; if($donnees['facteur_conversion_mesureareel'] != 0){ $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];} else{ $toutes_tables->execute(); // J'ai supprimé le deuxième $mesure //je change le fetch comme suggéré $resultat_toutes_tables=$toutes_tables->fetchAll(); foreach($resultat_toutes_tables as $table){ $stock_reel = $table['volume']; if (is_null($stock_reel)) { throw new Exception('Pas trouvé $stock_reel (ID '.$id.')'); } }} //je test si $toutes_tables est exécuté sinon message d'erreur if (!$stmt->execute() or !$toutes_tables->execute()) { throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')'); } } //fin foreach header('Location: index.php'); }catch (PDOException $pdoE) { echo 'Exception PDO: '.$pdoE->getMessage(); } catch (Exception $e) { echo 'Exception Autre: '.$e->getMessage(); } } ?>
si j'enlève le foreach, l'erreur est:
Exception Autre: Pas trouvé $stock_reel (ID 27)
avec ce code:
<?php //Rien de reçu => on bosse pas if (!empty($_POST)) { //Je mets tout dans un T/C try { //TOUJOURS ACTIVER LES EXCEPTIONS $bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', 'lionel0769',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); //J'ai déplacé le prepare et le bindparam $toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE hauteur = :hauteur"); $toutes_tables->bindParam(':hauteur',$mesure, PDO::PARAM_STR); $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll(); $requeteUpdate = "UPDATE stock_antigel SET mesure_observee = :mesure_observee,stock_reel = :stock_reel WHERE id = :id"; $stmt = $bdd->prepare($requeteUpdate); $stmt->bindParam(':mesure_observee', $mesure, PDO::PARAM_STR); $stock_reel = NULL; $stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); foreach($toutes_donnees as $donnees){ $id = $donnees['id']; $mesure = $_POST["mesure_observee$id"]; if($donnees['facteur_conversion_mesureareel'] != 0){ $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];} else{ $toutes_tables->execute(); // J'ai supprimé le deuxième $mesure //je change le fetch comme suggéré $resultat_toutes_tables=$toutes_tables->fetchAll(); // foreach($resultat_toutes_tables as $table){ $stock_reel = $table['volume']; if (is_null($stock_reel)) { throw new Exception('Pas trouvé $stock_reel (ID '.$id.')'); } } //je test si $toutes_tables est exécuté sinon message d'erreur if (!$stmt->execute() or !$toutes_tables->execute()) { throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')'); } } //fin foreach header('Location: index.php'); }catch (PDOException $pdoE) { echo 'Exception PDO: '.$pdoE->getMessage(); } catch (Exception $e) { echo 'Exception Autre: '.$e->getMessage(); } } ?>
$_POST["mesure_observee27"]me renvoie 1.45
D'ailleurs lorsque la valeur est 1.50 , j'ai bien une valeur pour stock_reel
Si la hauteur n'est pas présente dans la bdd je suppose que ça va me renvoyer une erreur, par contre 1,45 est bien dans la base de donnée
Je crois n' avoir rien oublié comme réponse à tes questions cette fois, désolé
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
1 568
>
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
6 août 2017 à 11:23
6 août 2017 à 11:23
fais ainsi:
L'erreur "Pas trouvé $stock_reel" se produit parce que la hauteur n'est pas trouvée dans la bdd. Peut-être un problème d'arrondi?
foreach($resultat_toutes_tables as $table){ $stock_reel = $table['volume']; }} if (is_null($stock_reel)) { throw new Exception('Pas trouvé $stock_reel (ID '.$id.')'); } //je test si $toutes_tables est exécuté sinon message d'erreur if (!$stmt->execute() ) {
L'erreur "Pas trouvé $stock_reel" se produit parce que la hauteur n'est pas trouvée dans la bdd. Peut-être un problème d'arrondi?
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
>
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
Modifié le 6 août 2017 à 12:28
Modifié le 6 août 2017 à 12:28
https://img4.hostingpics.net/pics/368483snapshot9.png
C'est à dire problème d' arrondi?, ma valeur dans la bdd est bien 1.45 qui est bien égale à celle demandée
Est ce que ça pourrait être le type de mon champ hauteur qui est float?
https://img4.hostingpics.net/pics/469226snapshot11.png
Edit: effectivement en passant le type de float à double, ça résout le problème
C'est à dire problème d' arrondi?, ma valeur dans la bdd est bien 1.45 qui est bien égale à celle demandée
Est ce que ça pourrait être le type de mon champ hauteur qui est float?
https://img4.hostingpics.net/pics/469226snapshot11.png
Edit: effectivement en passant le type de float à double, ça résout le problème
yg_be
Messages postés
23482
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 mars 2025
1 568
>
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
6 août 2017 à 12:27
6 août 2017 à 12:27
peut-être ainsi?
$toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE ROUND(hauteur , 2) = ROUND(:hauteur , 2) ");
mc69360
Messages postés
19
Date d'inscription
vendredi 4 août 2017
Statut
Membre
Dernière intervention
9 août 2017
6 août 2017 à 22:45
6 août 2017 à 22:45
ok , merci
Modifié le 5 août 2017 à 20:10
En fait dans un formulaire je récupère une hauteur
$mesure = $_POST["mesure_observee$id"];
avec cette mesure(qui a pour champ hauteur), je voudrais récupérer une valeur(volume) dans une autre table (table_stockage)
5 août 2017 à 20:30
suggestions et questions supplémentaires:
- cela n'a pas de sens de mettre les instructions suivantes dans un foreach:
- ajoute , et partage le résultat.
- que veux-tu obtenir avec ? peut-être ?
- ajoute des instructions "echo" pour vérifier que ton programme se comporte comme tu veux.
- partage le code html source de la page affichée
5 août 2017 à 21:27