Boucle php comment faire ?

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 : Boucle php comment faire ?

par bart0356 » 05 juin 2009, 12:13

  $sous_tot = str_split($tab_custom[value], 7);
  print_r ($sous_tot);
Donne :
Array ( [0] => 19.5000 ) Array ( [0] => 4.8750 ) Array ( [0] => 7.8953 ) Array ( [0] => 22.5203 ) Array ( [0] => 3.3842 ) Array ( [0] => 1.2900 )
Comment faire désormais pour récuperer chacune des valeurs ?

par momox » 05 juin 2009, 12:07

str_split est une bonne idée je pense ;)
Si tes parties de chaine font la même longueur c'est une bonne solution ;)

par bart0356 » 05 juin 2009, 12:00

explode à besoin d'un délimiteur, la j'en ai pas

Peut être split_str(); ?

Je fais des tests.

par momox » 05 juin 2009, 11:54

explode() ?

par bart0356 » 05 juin 2009, 11:40

Super merci,

Maintenant partie deux du problème :
$result_osc = mysql_query("select * from orders o left join orders_total ot on o.orders_id = ot.orders_id")or die(mysql_error()); // on récupéré les anciennes données 
Le problème est que la table orders_total est composées comme ça :

rders_total_id orders_id title text value class sort_order
33136 6676 Total de ma commande : 19,50 € 19.5000 ot_subtotal 760
33137 6676 Vous bénéficiez d’un code Avantage ou d’un coupon ... <b>-4,88&nbsp;€</b> 4.8750 ot_coupon 765
33138 6676 Livraison Directe (Livraison directe à votre domic... 7,90&nbsp;€ 7.8953 ot_shipping 770
33139 6676 Total à payer : <b>22,52&nbsp;€</b> 22.5203 ot_total 800
33140 6676 Dont TVA: 3,38&nbsp;€ 3.3842 ot_tax 820
33141 6676 dont TVA (sur frais de port): 1,29&nbsp;€ 1.2900 ot_tax 820

Alors du coup quand je veux récuperer les valeurs
$tab_custom[value]
J'obtient :
19.50004.87507.895322.52033.38421.2900

En fait toute les valeurs de ma table à la suite

Ayant besoin de chaque valeur séparément pour les insérer dans la nouvelle table je me demandé si il existait une fonction pour les séparer les unes des autres

du genre :
$tab_custom[value][1]
qui me renverrait
19.5000
Et me permettrait ainsi d'insérer les données correctement dans ma nouvelle base.

Une idée ?

par sadeq » 05 juin 2009, 11:16

Ok, mais j'ai quelques modif à te proposer pour éviter d'utiliser trop de variables et de concaténations inutiles. Cela optimise légèrement car c'est fait dans une boucle qui répète plusieurs fois les mêmes instructions.

Voici le correctif:
//TRANSFERT DES ADRESSES
$result_osc = mysql_query("select * from address_book ad left join customers c on ad.customers_id = c.customers_id"); // on récupéré les anciennes données 

while ($tab_custom=mysql_fetch_array($result_osc)) // on boucle tant qu'il y a des entrées
{
   //print_r ($tab_custom);

   // On insère les données dans la nouvelle base
  if (mysql_query("INSERT INTO `"._DB_PREFIX_ ."address` (id_address, id_country, id_state, 
id_customer, id_manufacturer, id_supplier, alias, company, lastname, firstname, address1, 
address2, postcode,city, other, phone, phone_mobile, date_add, date_upd, active, deleted) 
VALUES ('".$tab_custom[address_book_id]."', '8', '0', '".$tab_custom[customers_id]."','0','0',
'mon adresse','','".$tab_custom[entry_firstname]."', '".$tab_custom[entry_lastname]."', 
'".$tab_custom[entry_street_address]."', '".$tab_custom[entry_suburb]."', 
'".$tab_custom[entry_postcode]."','".addslashes($tab_custom['entry_city'])."', '', '".$tab_custom[customers_telephone]."', 
'".$tab_custom[customers_fax]."','".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."', '1', '0' )") )
{ 
    echo 'Client &nbsp' . $tab_custom[customers_id] .'&nbsp transféré avec succès <br /><br />'; 
}
else  
{ 
    echo 'Erreur: ' . mysql_error(); 
}

} // et on boucle sur le suivant 

par bart0356 » 05 juin 2009, 10:50

Merci Sadeq,

J'avoue ne pas avoir vu mon erreur mais j'ai beaucoup de mal n'ayant que pour connaissance PHP les tutos du net.

En tout cas maintenant celà fonctionne à merveille et je t'en remercie vivement.

Voici le code complet fonctionnel, si jamais quelqu'un y voit des améliorations à apporter
//TRANSFERT DES ADRESSES
$result_osc = mysql_query("select * from address_book ad left join customers c on ad.customers_id = c.customers_id"); // on récupéré les anciennes données 

while ($tab_custom=mysql_fetch_array($result_osc)) // on boucle tant qu'il y a des entrées
{
   $address = addslashes($tab_custom['entry_city']); // évite les problèmes d'apostrophe dans les adresses
   $date = date("Y-m-d"); // date du jour
$heure = date("H:i:s"); // heure du jour
$date_jour = $date .'&nbsp;'. $heure; // les 2 concaténés
   
   //print_r ($tab_custom);

   // On insère les données dans la nouvelle base
  $up=mysql_query("INSERT INTO `"._DB_PREFIX_ ."address` (id_address, id_country, id_state, 
id_customer, id_manufacturer, id_supplier, alias, company, lastname, firstname, address1, 
address2, postcode,city, other, phone, phone_mobile, date_add, date_upd, active, deleted) 
VALUES ('".$tab_custom[address_book_id]."', '8', '0', '".$tab_custom[customers_id]."','0','0',
'mon adresse','','".$tab_custom[entry_firstname]."', '".$tab_custom[entry_lastname]."', 
'".$tab_custom[entry_street_address]."', '".$tab_custom[entry_suburb]."', 
'".$tab_custom[entry_postcode]."','".$address."', '', '".$tab_custom[customers_telephone]."', 
'".$tab_custom[customers_fax]."','".$date_jour."', '".$date_jour."', '1', '0' )") or die(mysql_error());

echo 'client' .'&nbsp' . $tab_custom[customers_id] .'&nbsp' .'transféré avec succès';
echo '<br><br>';

} // et on boucle sur le suivant 

par sadeq » 05 juin 2009, 10:27

Le problème est que ta boucle exécute à chaque tour la même requête SELECT : c'est pourquoi, elle ne traite que le premier à tout les coups.

En fait, la boucle que tu as conçu n'est pas valide car tu n'as même pas besoin de la baser sur le
nombre d'enregistrements à faire migrer. Tu aurais dû exécuter le SELECT des adresses avant la
boucle, puis parcourir la liste du résultat et faire l'insertion dans la nouvelle base.

Voici comment:
$result_osc = mysql_query("select * from address_book"); // on récupéré les anciennes données 

while ($tab_custom=mysql_fetch_array($result_osc)) // on boucle tant qu'il y a des entrées
{
   $address = addslashes($tab_custom['entry_city']); // évite les problèmes d'apostrophe dans les adresses

   // On insère les données dans la nouvelle base
  $up=mysql_query("INSERT INTO `"._DB_PREFIX_ ."address` (id_address, id_country, id_state, 
id_customer, id_manufacturer, id_supplier, alias, company, lastname, firstname, address1, 
address2, postcode,city, other, phone, phone_mobile, date_add, date_upd, active, deleted) 
VALUES ('".$tab_custom['address_book_id']."', '8', '0', '".$tab_custom['customers_id']."','0','0',
'mon adresse','','".$tab_custom['entry_firstname']."', '".$tab_custom['entry_lastname']."', 
'".$tab_custom['entry_street_address']."', '".$tab_custom['entry_suburb']."', 
'".$tab_custom['entry_postcode']."','".$address."', '', '".$tab_custom2['customers_telephone']."', 
'".$tab_custom2['customers_fax']."','".$date_jour."', '".$date_jour."', '1', '0' )") or die(mysql_error());

} // et on boucle sur le suivant

Si t'as souvent des problèmes de "duplicate Key" avec INSERT tu peux utiliser sa variante REPLACE qui évite ce cas.

Boucle php comment faire ?

par bart0356 » 05 juin 2009, 09:21

Bonjour à tous et à toutes,

Nouvellement arrivé dans le monde du PHP j'essaie depuis plusieurs jours de créer un petit script qui récupère des données depuis une base SQL pour les copier dans une autre ( les données étant
pratiquement identique, seule les intitulés de champ changent)

Il s'agit d'une migration de base de données e-commerce.

J'ai à peu prêt reussi mon code qui fonctionne lors que la première base contient une entrée seulement, les choses se compliquent lorsque les bases sont + remplies, en effet une seule entrée
est prise en compte et ensuite j'ai un duplicate content.

Je pense qu'il s'agit d'une erreur mon script et je sollicite votre aide.

Le code est certainement très basique et non optimisé, j'apprends sur le tas et n'ai aucune formation de php.

Voici donc ce que j'ai reussi à faire



$i = 0;

  $comptage = mysql_query("select COUNT(*) from address_book"); // on compte les entrées dans adress_book qui est ma table de base
  $total = mysql_fetch_row($comptage); // array

while ($i <= $total[0]) // on boucle tant qu'il y a des entrées
{




 $result_osc = mysql_query("select * from address_book"); // on recupere les anciennes données 
   $tab_custom=mysql_fetch_array($result_osc); // array
   

$address = addslashes($tab_custom['entry_city']); // évite les problèmes d'apostrophe dans les adresses

// On insère les données
 
$up=mysql_query("INSERT INTO `"._DB_PREFIX_ ."address` (id_address, id_country, id_state, 
id_customer, id_manufacturer, id_supplier, alias, company, lastname, firstname, address1, 
address2,postcode,city, other, phone, phone_mobile, date_add, date_upd, active, deleted) VALUES('".$tab_custom[address_book_id]."', '8', '0', '".$tab_custom[customers_id]."','0','0',
'mon adresse','','".$tab_custom[entry_firstname]."', '".$tab_custom[entry_lastname]."', 
'".$tab_custom[entry_street_address]."', '".$tab_custom[entry_suburb]."', 
'".$tab_custom[entry_postcode]."','".$address."', '', '".$tab_custom2[customers_telephone]."', 
'".$tab_custom2[customers_fax]."','".$date_jour."', '".$date_jour."', '1', '0' )") or die(mysql_error());

$i++; // et on boucle sur le suivant
       }

Eventuellement j'ai trouvé une solution provisoire qui est de rajouter cette ligne :
$del=mysql_query("DELETE FROM address_book LIMIT 1") or die(mysql_error());
dans la boucle, ce qui a pour conséquence de supprimer une entrée à chaque fois et du coup le traitement se fait, mais je suis sur qu'il y a beaucoup plus simple.

Merci d'avance

Cordialement,