boucle pour variable préparée

kilabcom
Invité n'ayant pas de compte PHPfrance

27 juin 2011, 20:07

bonjour,

la probleme doit etre simple pour vous désolé :oops: mais j'ai un code du style :


$reqimport = $bdd->prepare(' INSERT INTO communes(indexfrais, societe, datefrais, nature, projet, typeTVA, montantHT, montantTVA, montantTTC)
VALUES(:Nchamps1, :Nchamps2, :Nchamps3, :Nchamps4, :Nchamps5, :Nchamps6, :Nchamps7, :Nchamps8, :Nchamps9)');
$reqimport->execute (array (
'Nchamps1' => $liste[0],
'Nchamps2' => $liste[1],
'Nchamps3' => $liste[2],
'Nchamps4' => $liste[3],
'Nchamps5' => $liste[4],
'Nchamps6' => $liste[5],
'Nchamps7' => $liste[6],
'Nchamps8' => $liste[7],
'Nchamps9' => $liste[8]
)
);

la question est comment pourrais faire une boucle pour les Nchamps et les $liste qui varient en quantité ??

merci beaucoup pour vos réponses et pour votre aide.
ki.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 juin 2011, 21:15

Je vois pas bien ce que tu veux faire (si c'est la chaine sql que tu veux générer ou le tableau de valeur ou autre chose), mais tu peux par exemple construire ton tableau de valeurs comme ceci :
$tab = array();
for ($i=0 ; $i < 10 ; $i++) {
   $tab['Nchamps' . ($i+1)] => $liste[$i]; // on construit la chaine de l'index en concaténant le libellé et le numéro
}

print_r($tab); // voir le tableau généré
Par contre, d'un point de vue maintenance c'est pas ce qu'il y a de mieux... en effet, il est difficile de savoir si ton montant HT se trouve bien dans le champ numéro 7 ou 8 ..
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 209 Messages

28 juin 2011, 07:10

Tu peux aussi regarder du coté des paramètres anonymes :
$bdd->prepare(' INSERT INTO communes(indexfrais, societe, datefrais, nature, projet, typeTVA, montantHT, montantTVA, montantTTC)
VALUES(?,?,?)');
$reqimport->execute ($liste)

--
Eric

kilabcom
Invité n'ayant pas de compte PHPfrance

29 juin 2011, 14:09

parametres anonymes pas mal mais ça marche comment ..?

en attendant j'ai tenté ça mais je n'ai même pas de message d'erreur ça marche pas ...:
	$req = 'INSERT INTO communes(indexfrais, societe, datefrais, nature, projet, typeTVA, montantHT, montantTVA, montantTTC)
		VALUES(';

	$myFields = array 	(
		'Nchamps1' => $liste[0],
		'Nchamps2' => $liste[1],
		'Nchamps3' => $liste[2],
		'Nchamps4' => $liste[3],
		'Nchamps5' => $liste[4],
		'Nchamps6' => $liste[5],
		'Nchamps7' => $liste[6],
		'Nchamps8' => $liste[7],
		'Nchamps9' => $liste[8]
						); 

	foreach($myFields as $k => $v) { $req .= ':'.$k.', '; } // reprend le array et vire pour creer les values de la requete.

	$req=substr($req, 0, strlen($req)-2); // on dégage la dernière virgule 
	$req .= ')'; // on ferme la requête
	
	$reqimport = $bdd->prepare('$req');
	$reqimport->execute($myFields);

ViPHP
ViPHP | 2577 Messages

29 juin 2011, 14:28

Les méthodes errorcode et errorinfo peuvent t'indiquer de quoi il retourne

Petit nouveau ! | 3 Messages

30 juin 2011, 18:17

error mode tres bonne suggestion ... merci mais ça me creer un autre probleme j'ai fait :
$req = 'INSERT INTO communes(indexfrais, societe, datefrais, nature, projet, typeTVA, montantHT, montantTVA, montantTTC)
		VALUES(';

	$myFields = array 	(
		'Nchamps1' => $liste[0],
		'Nchamps2' => $liste[1],
		'Nchamps3' => $liste[2],
		'Nchamps4' => $liste[3],
		'Nchamps5' => $liste[4],
		'Nchamps6' => $liste[5],
		'Nchamps7' => $liste[6],
		'Nchamps8' => $liste[7],
		'Nchamps9' => $liste[8]
						); 

	foreach($myFields as $k => $v) { $req .= ':'.$k.', '; } // reprend le array et vire pour creer les values de la requete.

	$req=substr($req, 0, strlen($req)-2); // on dégage la dernière virgule 
	$req .= ')'; // on ferme la requête
	
	$reqimport = $bdd->prepare('$req');
	$reqimport->execute($myFields);
	$reqimport-->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
mais j'ai un message du genre :
Fatal error: Call to undefined function setAttribute() in C:\wamp\www\xxxx\xxxx\xxx.php on line 157

pourtant je suis en wampserver 2.0 avec php 5.3.5
comprends pas 8-|

Eléphant du PHP | 171 Messages

30 juin 2011, 18:50

Yop !

Alors je comprend tout à fait ce que tu souhaites faire.
En fait déjà au niveau de ta requête tu t'embête pour rien avec ton substr. Autant tout faire dans la boucle, en incrémentant par exemple une variable $i ca donnerait genre ca :
$i = 0;
foreach($myFields as $k => $v)
{
    if($i > 0)
        $req .= ",:$k";
    else
        $req .= ":$k";
    $i++;
}
Ensuite, faire ca : $reqimport = $bdd->prepare('$req'); :shock: ne sert à rien à part dire que tu veux préparer la requête $req littéralement ^^ Bonne chance :) Enlève donc ces guillemets autour de $req.
$reqimport--> devient plutôt $reqimport->


Mais pourquoi pas une solution qui conviendrait aussi très bien à ton problème ^^ : vos-contributions/bindvalue-sur-tableau-t259264.html

Voilà, ça devrait allé mieux là ?
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Petit nouveau ! | 3 Messages

30 juin 2011, 19:10

t'es au top !!! merci ... :D ça marche d'enfer ton histoire ... =D>
pour info tu sais comment je peux brancher la dedans un errormode ?
j'arrive pas a trouver une syntaxe qui fonctionne ?

Eléphant du PHP | 171 Messages

30 juin 2011, 20:49

Tu veux dire dans mon bindArrayValue ou la méthode que je t'ai corrigé avec la boucle ?
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Petit nouveau ! | 3 Messages

01 juil. 2011, 02:43

dans la version corrigée ... :mrgreen: