Importez un texte dans une bdd en le changant toutes les 3 fois

Mammouth du PHP | 643 Messages

01 nov. 2016, 20:05

Bonjour tout le monde,
Voilà je vous expose mon problème je souhaite integrer un texte en bdd, mais je souhaite que le texte s'integrer toutes les 3 fois.
J'ai l'idée mais ça coince, exemple:

on intégrer mon premier texte, pour la premiere ville
ensuite le deuxiéme texte pour la seconde ville
ensuite le troisième texte pour la 3 eme ville et on recommence l'opération
1er texte pour la 4 eme ville ....

Mais je ne vois pas comment faire ce système:
voilà ce que j'ai:
<?php
// Importation de texte différents toutes les 3 fois
$texte_city = [];
$texte_city[0] = 'texte 1';
$texte_city[1] = 'texte 2';
$texte_city[2] = 'texte 2';


// Insertion
$req = $bdd->prepare("INSERT INTO `city` (description) VALUES ('$description')");
$req->execute(array(
              'description' => $texte_city
               )) or die('Problème lors de l\'insertion');
     
?>
Merci à vous

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

01 nov. 2016, 20:27

Bonjour,

Avant de le faire avec ton insertion en BDD, essaye juste de le faire avec une boucle et du texte (echo)
Ça te permettra de tester et debuguer + facilement.

Tu auras besoin de faire une boucle sur l'ensemble de tes villes donc soit avec un while, for, foreach... en fonction de comment sont récupérées les villes.
Et ensuite, pour détecter le passage à 3, ce que je ferrais c'est de noter le texte que tu as utilisé précédemment et donc tu utilises le suivant (ou le 1er si tu étais au 3ème)
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 643 Messages

01 nov. 2016, 21:29

J'ai donc quelquechose comme ça maintenant :
// Importation de texte différents toutes les 3 fois
	$texte_city = 'texte 1';

	// Selection des champs et de la tablr
	$sql = 'SELECT name FROM city LIMIT 0,15';
	$req = $bdd->query($sql);

	// On affiche les infos
	while($ligne = $req->fetch(PDO::FETCH_ASSOC)){  
	echo $texte_city.' - '.$ligne['name'].'<br>';
	
	}
J'ai pas trop compris l'histoire de :
Et ensuite, pour détecter le passage à 3, ce que je ferrais c'est de noter le texte que tu as utilisé précédemment et donc tu utilises le suivant (ou le 1er si tu étais au 3ème)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 nov. 2016, 01:59

Effectivement, il manquait une partie : "noter dans une variable" :-)

En clair :
- avant ta boucle while :
1) tu crées un tableau (par exemples $tablo_textes) avec les 3 valeurs des textes que tu veux mettre.
2) tu crées une variable (par exemple $id_texte) qui aura pour valeur 0

- dans ta boucle,
1) tu affiches le texte $tablo_textes[$id_texte], à noter que j'avais initialisé la variable $id_texte à 0 car les index d'un tableau commences à 0
2) tu incrémentes $id_texte de 1 et si après l'avoir incrémenté il est > 2 alors tu le remets à 0

Est-ce que c'est + clair pour toi ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 643 Messages

02 nov. 2016, 21:50

Quelque chose comme:
Je me retrouve avec une erreur:

Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\dev\texte-opti.php on line
22
$texte=array();  // On cree un tableau avec nos textes
$texte[1] = 'texte 1';
$texte[2] = 'texte 2';
$texte[3] = 'texte 3';
  
// Selection des champs et de la table
$sql = 'SELECT name FROM city'; // on recupere tous les ids de la table
$req = $bdd->query($sql);
  
  // On insere les infos
$i=1;
while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ // on parcourt toutes les entrees de la table
  $req = "UPDATE city SET description = '".$texte[$i]."' WHERE name= '".$ligne['name']."'";
  echo $req;
  $bdd->query($req)or die('Problème lors de l\'insertion');
   if($i < 3){ // si on est pas encore au 3eme texte on passe au texte suivant
      $i++;
   }
   else{ // sinon on revient au premier
      $i = 1;
   }
}

?>
Je ne vois pas trop à quoi ca correspond :/

Mammouth du PHP | 2703 Messages

02 nov. 2016, 22:12

$req = $bdd->query($sql);
$req = "UPDATE city SET description = '".$texte[$i]."' WHERE name= '".$ligne['name']."'";

Mammouth du PHP | 643 Messages

03 nov. 2016, 08:16

Re,
J'ai n'ai donc plus de problème mais je vois qu'en affichant ma requete c'est toujours la même qui s'éxécute à savoir sur la première ville de la bdd et c'est tout....
// Selection des champs et de la table
$sql = 'SELECT name FROM city'; // on recupere tous les ids de la table
$req = $bdd->query($sql);

while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ // on parcourt toutes les entrees de la table

$i=1;
$texte=array();  // On cree un tableau avec nos textes
$texte[1] = 'texte 1';
$texte[2] = 'texte 2';
$texte[3] = 'texte 3';

$req = "UPDATE city SET description = '".$texte[$i]."' WHERE name= '".$ligne['name']."'";
 echo $req;
  $req = $bdd->query($sql);
   if($i < 3){ // si on est pas encore au 3eme texte on passe au texte suivant
      $i++;
   }
   else{ // sinon on revient au premier
      $i = 1;
   }
}

Mammouth du PHP | 1967 Messages

03 nov. 2016, 09:42

si tu utilise le même nom de variable dans la condition de ta boucle et au sein de celle-ci, seule la première itération fonctionnera normalement.
Il faut que tu change un des 2 noms de variable $req

Il faut aussi que tu définisse ton $i = 0 avant ta boucle sinon tu le redéfini à chaque itération et donc il ne variera pas. test textes peuvent aussi être défini avant la boucle

petit plus, tu peux éviter toute la partie avec un if $i> 3 en le laissant incrémenter simplement et en prenant le modulo 3 de $i
$i % 3 vaut 0 pour tous les multiple de 3, 1 pour tous les nombres multiple de 3 + 1 et 2 pour les multiples de 3 + 2
les multiple de 3 + 3 sont des multiple de 3 donc le modulo vaut 0. c'est bien plus clair dans un code, et plus facile à maintenir par la suite si un jour tu as 4 textes
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 643 Messages

03 nov. 2016, 22:09

Re,
Bon ca y'est on vas finir pas y arrivé il est vrai qu'en sortant de la boucle c'est déjà mieux :)
Mais je fait un echo de la req pour voir et les résultat semble correct mais en bdd ca ne s'importe pas et la je ne vois pas pourquoi.
Exemple de retour de la requete:
UPDATE city SET description = 'texte 1' WHERE name= 'test'
UPDATE city SET description = 'texte 2' WHERE name= 'Ambérieux-en-Dombes'
UPDATE city SET description = 'texte 3' WHERE name= 'Ambléon'
.....

Donc mon code:
// Selection des champs et de la table
$sql = 'SELECT name FROM city'; // on recupere tous les ids de la table
$req = $bdd->query($sql);

$i=1;

$texte=array();  // On cree un tableau avec nos textes
$texte[1] = 'texte 1';
$texte[2] = 'texte 2';
$texte[3] = 'texte 3';

while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ // on parcourt toutes les entrees de la table



$import = "UPDATE city SET description = '".$texte[$i]."' WHERE name= '".$ligne['name']."'";
 echo $import.'<br>';
  $import = $bdd->query($sql);
   if($i < 3){ // si on est pas encore au 3eme texte on passe au texte suivant
      $i++;
   }
   else{ // sinon on revient au premier
      $i = 1;
   }
}
Merci à vous encore

Mammouth du PHP | 1967 Messages

04 nov. 2016, 09:01

$import = "UPDATE city SET description = '".$texte[$i]."' WHERE name= '".$ligne['name']."'";
echo $import.'<br>';
$import = $bdd->query($sql);

Changer le nom de ta variable de requète c'est un bon début, mais si tu envoi à ta base de donnée la requète de sélection tu n'enregistre rien c'est sur.
$import = $bdd->query($import);
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube