Récuperation de donnée dans un tableau

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Récuperation de donnée dans un tableau

par valsteken » 12 mai 2008, 18:44

est-ce que ça veut dire que j'ai perdu mes catégories et mes produits, où bien c'est juste un bug, et je vais pouvoir tout reprendre ? Lorsque ça s'est passé, je faisait ça :
"J’ai modifié et supprimé certaines catégories
J’ai déplacé des articles/produits d’une catégorie à l’autre, jusqu’à certainement la mauvaise manipulation qui m’a donné cette erreur :
Vous pouvez voir les différents messages en vous connectant sur www.ventevin.com
Depuis, dans l’admin, je n’ai plus rien dans le catalogue."
qu'en pensez-vous ?
merci

par d0m » 12 mai 2008, 18:28

l'opérateur foreach s'applique sur un tableau de données. Si le message d'erreur
Invalid argument supplied for foreach()
apparait c'est que ta variable dans le foreach n'est pas un tableau.

Par déduction, l'erreur vient du fait que la variable $cat_subs1[$parentID] n'est pas un tableau.

Voyons alors comment tu construis ta variable $cat_subs1[$parentID].

Apparement c'est dans les lignes 92-94 que cela se passe.

voilà la boucle :
foreach($categories_start1 as $key => $value) { 
if(strstr($key, '_' . $parentID . '_E')) { 
$cat_subs1[$parentID][] = substr($key, 2, strpos($key, "_", 2) - 2); 
}
Tu mets donc un élement dans le tableau $cat_subs1[$parentID] tout en le construisant implicitement à 2 conditions :
1. que tu rentres dans la boucle foreach ligne 92
2. que la condition de la ligne 93 est vérifiée.

Il se peut donc si par exemple $categories_start1 est un tableau vide ou que strstr($key, '_' . $parentID . '_E') est faux que tu ne met jamais d'élément dans le tableau $cat_subs1[$parentID] par la ligne 94 et donc que celui ci n'est jamais créé.

Pour remédier à cela, pense à créer explicitement ton tableau vide au départ avant de vouloir y mettre des éléments :
//créer le tableau vide au départ
$cat_subs1[$parentID] = array();
//remplir le tableau
foreach($categories_start1 as $key => $value) { 
if(strstr($key, '_' . $parentID . '_E')) { 
$cat_subs1[$parentID][] = substr($key, 2, strpos($key, "_", 2) - 2); 
}

par valsteken » 12 mai 2008, 08:46

j'ai noté dans le fichier categories1_css.php print r devant ($cat...), soit la ligne 98 qui a le problème, c'est la deuxième partie avec foreach de ce fichier qui a le problème. ça n'a rien fait, je pense que je ne sais pas utiliser une fonction.
Voici de la ligne 92 à 99 :
foreach($categories_start1 as $key => $value) {
if(strstr($key, '_' . $parentID . '_E')) {
$cat_subs1[$parentID][] = substr($key, 2, strpos($key, "_", 2) - 2);
}
}

foreach ($cat_subs1[$parentID] as $key => $value) {
$categories = $categories_start1['S_' . $v . '_' . $parentID . '_E'];

par FredoMkb » 11 mai 2008, 12:13

Bonjour :)

Es-tu sûr que "$cat_subs1[$parentID]" est un tableau de données ?

Fais, juste avant la boucle "foreach" un simple "print_r($cat_subs1[$parentID]);" (sans les guillemets) pour afficher le contenu de cette variable... ensuite on avisera...

à+ :)

par valsteken » 11 mai 2008, 11:45

j'ai bien ce fichier, mais que dois-je faire sur cette ligne ?
voici la ligne 98
foreach ($cat_subs1[$parentID] as $key => $value) {

par d0m » 11 mai 2008, 11:42

tout est marqué dans le message d'erreur :
in /home/www/232bd9f90c8befa8003c8decaa6064fe/web/includes/boxes/categories1_css.php on line 98

par valsteken » 11 mai 2008, 10:55

Je suis novice en php, finalement, je ne comprends pas grand chose.
Que dois-je faire exactement, et, dans quel fichier.
Merci de ton aide

par d0m » 11 mai 2008, 09:34

salut,

l'erreur du foreach vient du fait que la variable sur laquelle tu l'appliques n'est pas un tableau.
Tu as surement un tableau de produit ou catégorie.
Comme ça à la première impression il semblerait que vu que tu n'as pas de catégorie, tu ne crées pas ton tableau et le foreach n'a donc rien à se mettre sous la dent.
Il faut gérer le cas où il n'y a pas de catégorie et donc créer un tableau vide au départ.

Le code PHP de cette ligne pourrait aider à t'en dire plus.

Re: Récuperation de donnée dans un tableau

par valsteken » 11 mai 2008, 09:26

Bonjour,
voilà que j'ai une erreur similaire, voir mon site www.ventevin.com
La première erreur est celle-ci Warning: Invalid argument supplied for foreach() in /home/www/232bd9f90c8befa8003c8decaa6064fe/web/includes/boxes/categories1_css.php on line 98
Voilà ce que j'étais en train de faire au moment où ça c'est produit :
J’ai modifié et supprimé certaines catégories
J’ai déplacé des articles/produits d’une catégorie à l’autre, jusqu’à certainement la mauvaise manipulation qui m’a donné cette erreur :
Vous pouvez voir les différents messages en vous connectant sur www.ventevin.com
Depuis, dans l’admin, je n’ai plus rien dans le catalogue.

Warning: Invalid argument supplied for foreach() in /home/www/232bd9f90c8befa8003c8decaa6064fe/web/includes/boxes/categories1_css.php on line 98

Warning: Invalid argument supplied for foreach() in /home/www/232bd9f90c8befa8003c8decaa6064fe/web/includes/boxes/categories9_css.php on line 51

…….

Merci de votre aide

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par guigui69 » 14 févr. 2008, 09:38

Merci pour ton aide je regarde et j'étudie ça, et je ferai un retour (car je pense que j'aurai des questions :) )

Merci

guigui69

par Truc » 13 févr. 2008, 18:18

La difficulté que tu rencontres est que tu affiches tous les champs sur la page et lorsque tu valides le formulaire tu ne sais pas quelles données ont été modifiées et donc tu dois toutes les mettre à jour.

Le plus simple est d'effectuer une requête par produit :
foreach ($_POST['id'] as $key => $id)
{ 
     $sql = "UPDATE ... SET  nom_m = '".$_POST['nom_m'][$key]."' WHERE code_m = ".$id;
     //exécution requete
     ...
}

par guigui69 » 13 févr. 2008, 17:22

Alors en fait,

1/ Je récupérer depuis ma base les informations suivante:
code_m, nom_m, pu_m, coef_mat_pdr, pu_mat_pdt

J'affiche les informations récupérées de ma base sous forme de tableau (table).A l'intérieur des colonnes (td) de ce tableau j'ai mis des champs "inputs" pour pouvoir modifier les valeurs.

2/ Je modifie par exemple le prix (pu_m) ou coefficient (coef_mat_pdr), cela me calcul automatiquement le total (pu_m*coef_mat_pdr) dans la case input pu_mat_pdt (grâce au code javascript).

3/ après avoir mise à jour des prix et le coefficient (et donc pas conséquence aussi le pu_mat_pdt) dans ce tableau, je voudrait renvoyer les modifications dans ma base (UPDATE).

Merci pour ton aide

guigui69

-----------------------------------------------------------------------------

MAJ

Je vient de modifier mon code:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title> Réalisation commande fournisseur</title>
<script language="javascript">
function calculTotal(pNum){
document.getElementById('pu_mat_pdr'+pNum).value =  parseFloat(document.getElementById('pu'+pNum).value * document.getElementById('coef_mat_pdr'+pNum).value);
}
</script>
<style type="text/css" title="mes_styles" media="all">

</style>
</head>
<body>
<?php

If (isset($_POST['update']))
{

echo "testazerty";
$values = array();



foreach ($_POST['id'] as $tableau)
{

echo $tableau;
echo '<br>';

}

}
else
{


$id_four=$_POST['founisseurchoisis'];
//echo $id_four;
$server="*******";
$user="*******";
$pass="******";
$db="pdr";
mysql_connect($server,$user,$pass) or die('erreur de connexion');
mysql_select_db($db) or die ('impossible de se connecter a la base');



$sql = "SELECT code_m, nom_m, pu_m, coef_mat_pdr, pu_mat_pdr FROM matiere WHERE id_matiere_type='2' ORDER BY nom_m;";
    $req = mysql_query($sql) or die('3/Erreur SQL !'.$sql.'<br>'.mysql_error()); 
	
$res = mysql_num_rows($req);

    if($res==0)  
        {
        echo '<font color="red">D&eacute;sol&eacute;, aucune matiere est attribue a ce fournisseur.</font>';
        echo '<INPUT TYPE="BUTTON" VALUE=" Retour "onClick="history.back()">';
		echo '<br>';
		}
		
   else
   {
   //echo $res;
  
   echo '<form name="enr" method="post" id="enr" action="modcoef2.php">';
   echo '<table id="tableau" BORDER=1>';
   //echo '<tr>';
   //echo '<td><u>description du Produit:</u></td><td><u>Prix unitaire:</u></td><td><u>coef_mat_pdr:</u></td><td><u>pu_mat_pdr:</u></td>';
	
   $nb = 0;
   while ( $ligne = mysql_fetch_array( $req ))
   { $nb =$nb+1 
   
   
   ?>
   
	
	<tr>
	<td><input type="hidden" name="id[]" id="id<?php echo $nb;?>"					value="<?php echo $ligne["code_m"]; ;?>"></td>
	<td><input type="text" name="nom_m[]" id="nom_m<?php echo $nb;?>" 				value="<?php echo $ligne["nom_m"]; ?>" size="60" onkeyup="calculTotal(<?php echo $nb;?>)"></td>
	<td><input type="text" name="pu[]" id="pu<?php echo $nb;?>" 					value="<?php echo $ligne["pu_m"]; ?> " size="9" onkeyup="calculTotal(<?php echo $nb;?>)"></td>
	<td><input type="text" name="coef_mat_pdr[]" id="coef_mat_pdr<?php echo $nb;?>"	value="<?php if ($ligne["coef_mat_pdr"] != null) {echo $ligne["coef_mat_pdr"];} else { echo "0";}; ?> " size="9" onkeyup="calculTotal(<?php echo $nb;?>)"></td>
	<td><input type="text" name="pu_mat_pdr[]" id="pu_mat_pdr<?php echo $nb;?>"		value="<?php if ($ligne["pu_mat_pdr"] != null) {echo $ligne["pu_mat_pdr"];} else { echo "0";}; ?> " size="9" > &euro; </td>
	</tr>
	<?php
	}

	echo '</form>';
	
	echo '<input type="submit" id="update" name="update" value="Update" />';
	}

	}
	echo '<pre>' . print_r($_POST, true) . '</pre>';
	?>



</body>
</html>
	
Quand je fait update il me sort ceci:
Array
(
    [update] => Update
    [id] => Array
        (
            [0] => 70
            [1] => 62
            [2] => 63
            [3] => 65
            [4] => 66
            [5] => 67
            [6] => 64
            [7] => 68
            [8] => 69
        )

    [nom_m] => Array
        (
            [0] => eau
            [1] => Farine  T65 Sans Fèves Viennoi
            [2] => Farine Crc Vrac Silo Viennoise
            [3] => Farine De Son Micronisé T80
            [4] => Farine Seigle T170
            [5] => Farine T55 Ep
            [6] => Farine Viennoiserie 25 Kg
            [7] => Sel Fin 
            [8] => Sucre 
        )

    [pu] => Array
        (
            [0] => 0.00280 
            [1] => 0.34500 
            [2] => 40.20000 
            [3] => 0.52220 
            [4] => 0.70560 
            [5] => 0.32620 
            [6] => 0.50910 
            [7] => 0.10800 
            [8] => 0.99000 
        )

    [coef_mat_pdr] => Array
        (
            [0] => 0 
            [1] => 0 
            [2] => 0 
            [3] => 0 
            [4] => 0 
            [5] => 0 
            [6] => 0 
            [7] => 0 
            [8] => 0 
        )

    [pu_mat_pdr] => Array
        (
            [0] => 0 
            [1] => 0 
            [2] => 0 
            [3] => 0 
            [4] => 0 
            [5] => 0 
            [6] => 0 
            [7] => 0 
            [8] => 0 
        )

)
Est ce que cela semble bon, si oui est-il possible de faire fusionner ces tableau pour que je puisse après rajouter dans ma base ou bien ce n'est pas recommandé? Ou bien une autre méthode plus simple?

Merci d'avance pour votre aide

guigui69

par Truc » 13 févr. 2008, 17:10

Est ce que j'ai pris la bonne méthode pour rajouter les donnée dans ma base avec foreach ?
On va repartir de ça...
Que veux tu faire au juste, tu disposes de quoi ?

par guigui69 » 13 févr. 2008, 16:33

Merci pour ta réponse.

Justement j'avais mis print_r ... pour voir, mais rien n'était envoyer :(

J'ai fait la modification au niveau de mon tableau

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title> Réalisation commande fournisseur</title>
<script language="javascript">
function calculTotal(pNum){
document.getElementById('pu_mat_pdr'+pNum).value =  parseFloat(document.getElementById('pu'+pNum).value * document.getElementById('coef_mat_pdr'+pNum).value);
}
</script>
<style type="text/css" title="mes_styles" media="all">

</style>
</head>
<body>
<?php
$pu_mat_pdr= $_POST['pu_mat_pdr'];
$pu= $_POST['pu'];
$coef_mat_pdr= $_POST['coef_mat_pdr'];
//echo $test2;
If (isset($_POST['update']))
{

echo "testazerty";
$values = array();
//$update= $POST['enr'];

foreach ($_POST['tableau'] as $tableau)
{

$values[] = '(' . $nom_m . ', ' . $pu_m . ', ' . $coef_mat_pdr . ', ' .$pu_mat_pdr. ')';

}

}
else
{


$id_four=$_POST['founisseurchoisis'];
//echo $id_four;
$server="*********";
$user="*********";
$pass="********";
$db="pdr";
mysql_connect($server,$user,$pass) or die('erreur de connexion');
mysql_select_db($db) or die ('impossible de se connecter a la base');



$sql = "SELECT nom_m, pu_m, coef_mat_pdr, pu_mat_pdr FROM matiere WHERE id_matiere_type='2' ORDER BY nom_m;";
    $req = mysql_query($sql) or die('3/Erreur SQL !'.$sql.'<br>'.mysql_error()); 
	
$res = mysql_num_rows($req);

    if($res==0)  
        {
        echo '<font color="red">D&eacute;sol&eacute;, aucune matiere est attribue a ce fournisseur.</font>';
        echo '<INPUT TYPE="BUTTON" VALUE=" Retour "onClick="history.back()">';
		echo '<br>';
		}
		
   else
   {
   //echo $res;
  
   echo '<form name="enr" method="post" id="enr" action="modcoef2.php">';
   echo '<table id="tableau" BORDER=1>';
   //echo '<tr>';
   //echo '<td><u>description du Produit:</u></td><td><u>Prix unitaire:</u></td><td><u>coef_mat_pdr:</u></td><td><u>pu_mat_pdr:</u></td>';
	
   $nb = 0;
   while ( $ligne = mysql_fetch_array( $req ))
   { $nb =$nb+1 
   
   
   ?>
   
	
	<tr>
	<td><input type="text" id="nom_m[]" value="<?php echo $ligne["nom_m"]; ?>" size="60" onkeyup="calculTotal(<?php echo $nb;?>)"></td>
	<td><input type="text" id="pu[]" value="<?php echo $ligne["pu_m"]; ?> " size="9" onkeyup="calculTotal(<?php echo $nb;?>)"></td>
	<td><input type="text" id="coef_mat_pdr[]" value="<?php if ($ligne["coef_mat_pdr"] != null) {echo $ligne["coef_mat_pdr"];} else { echo "0";}; ?> " size="9" onkeyup="calculTotal(<?php echo $nb;?>)"></td>
	<td><input type="text" id="pu_mat_pdr[]" value="<?php if ($ligne["pu_mat_pdr"] != null) {echo $ligne["pu_mat_pdr"];} else { echo "0";}; ?> " size="9" > &euro; </td>
	</tr>
	<?php
	}
	//echo '<input type="submit" id="update" name="update" value="Update" />';
	}
	}
	print_r($_POST)
	?>


<input type="submit" id="update" name="update" value="Update" />
</body>
</html>
	
J'ai toujours une erreur pour foreach.
Si jamais ça fonctionne avec cette solution le problème c'est que ma partie java script ne va plus fonctionner, étant donnée quel utilisait les numéros en $nb.

Merci d'avance pour ton aide.

guigui69

par Truc » 13 févr. 2008, 15:34

oui j'ai rajouté ceci

Code : Tout sélectionner

print_r($_POST)
pour voir si il y avait des donnée envoyé.
Et donc pourquoi ne pas t'en servir pour analyser ?

tu remarqueras que tu n'as pas de de variable $_POST['tableau'] !

Tes champs portent tous un nom différent tu ne peux donc pas récupérer de tel manière.
Il te faut modifier les attributs id de la sorte :
... id="pu[]" ...
sans $nb et avec []

ainsi tu récupères 3 variables $_POST['pu'], $_POST['coef_mat_pdr'] et $_POST['pu_mat_pdr']