PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 Re : Forum Général PHP » Ordonner un tableau multidimentionnel avec array multisort » 09-03-2012 08:40:52

Merci JC pour ce commentaire... Je devrais peut être simplifier le code pour une plus grande lisibilité. La procédure dure bien 3 minutes, mais s’exécute de nuit, donc notre serveur est plutôt libre à ce moment là...

Je sais bien qu'il y'a une doc pour cette fonction, je pensai l'utiliser correctement (avec ce que j'ai compris de la doc) mais apparement non.

Si je fais appel au forum c'est pour une aide et non un constat...

Ci-dessous, un morceau de code pour comprendre un peu plus comment je charge mes valeurs


<?php

$produit[1][grossiste]="Electrozonic";
$produit[1][reference]="puce mémoire nand";
$produit[1][venduesous1j]=2;
$produit[1][venduesous7j]=6;
$produit[1][venduesous31j]=18;

$produit[2][grossiste]="Electrozonic";
$produit[2][reference]="puce mémoire nor";
$produit[2][venduesous1j]=1;
$produit[2][venduesous7j]=3;
$produit[2][venduesous31j]=4;

$produit[4][grossiste]="ABzonic";
$produit[4][reference]="puce mémoire flash";
$produit[4][venduesous1j]=25;
$produit[4][venduesous7j]=57;
$produit[4][venduesous31j]=120;


?>
 

Comment je peux utilsier array_multisort ou une autre fonction afin d'obtenir un classement d'abord par grossiste, et ensuite par ventesous7j et ensuite ventesous1j ?

J'espère que c'est un peu plus compréhensible maintenant...

#2 Forum Général PHP » Ordonner un tableau multidimentionnel avec array multisort » 09-03-2012 08:40:52

rick's
Réponses : 4

Bonjour,

J'ai créé une petite appli PHP qui me permet de générer un rapport de stock quotidien. Le rapport est fonctionnel, mais si j'applique le array_multisort (actuellement commenté), tout se mélange, et je n'ai plus rien qui ne correspond à plus rien... Savez vous à quoi c'est du?

<?php

header('Refresh: 3000');

require($hostFullPath."required.php");
require($includePath."mailheaders.php");


// VERIFICATION DE LA NECESSITE D'ENVOYER UNE NEWSLETTER DE STOCK
// type=1 -> Journaliere
// type=2 -> Semaine
// type=3 -> Mensuelle

//Array multisort pour les mails : [url]http://php.net/manual/en/function.array-multisort.php[/url]

$sqlDailyNewsletter='SELECT id FROM merp_productstocknewsletters WHERE type=1 AND date>=DATE_ADD(NOW( ),INTERVAL -1 DAY)';
$reqDailyNewsletter = mysql_query($sqlDailyNewsletter) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlDailyNewsletter);
$rowDailyNewsletter = mysql_fetch_array($reqDailyNewsletter);
if ($rowDailyNewsletter['id'])
  $dailyNewsletter="DON'T NEED"; 

if ($magentoDBLinkActive) {

  //Tache de fond à réaliser régulirègement
   
  $sqlEstimates="SELECT
    sales_flat_invoice.entity_id AS invoiceNumber,
    sales_flat_order.entity_id,
    sales_flat_order.increment_id,
    sales_flat_invoice.created_at,
    base_shipping_invoiced,
    tax_invoiced,
    base_total_invoiced_cost,
    total_invoiced,
    sales_flat_order_grid.total_paid,
    billing_name
  FROM
    sales_flat_order,
    sales_flat_order_grid,
    sales_flat_invoice
  WHERE
    sales_flat_order.entity_id=sales_flat_order_grid.entity_id
    AND sales_flat_order.entity_id=sales_flat_invoice.order_id
    AND sales_flat_invoice.entity_id IS NOT NULL
    AND sales_flat_order.entity_id NOT IN (SELECT estimateId FROM merp_invoices WHERE orderFrom=2)
    AND sales_flat_invoice.created_at>'2010'
  ORDER BY sales_flat_invoice.entity_id ASC"
;

  $sqlMagentoInvoices=$sqlEstimates;
  $reqMagentoInvoices = mysql_query($sqlMagentoInvoices) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlMagentoInvoices);
  while ($rowMagentoInvoices = mysql_fetch_array($reqMagentoInvoices)) {

    /*
    // Pour rattraper les ventes de 2010
    if (substr($rowMagentoInvoices[created_at],0,4)==2010)
      $rowMagentoInvoices[created_at]="2010-12-31";
    */

    // de payment_method à payment_identification il manque les informations à trouver dans la bdd magento
    if ($rowMagentoInvoices[total_paid]!=0.000)
      mysql_query('INSERT INTO merp_payment VALUES ("","'.$rowMagentoInvoices[created_at].'","'.$rowMagentoInvoices[entity_id].'","","'.$_SESSION['userId'].'","'.$magentoDefaultPaymentMethod.'",'.$magentoDefaultPaymentBank.',"'.$rowMagentoInvoices[billing_name].'","FACTURE : '.$rowMagentoInvoices[invoiceNumber].'","'.$rowMagentoInvoices[total_paid].'","2",0)');


    if ($rowMagentoInvoices[total_invoiced]==$rowMagentoInvoices[total_paid])
      $accountancyBalanced=1;
    else
      $accountancyBalanced=0;
     
    mysql_query('INSERT INTO merp_invoices VALUES ("","'.$today.'","'.$rowMagentoInvoices[entity_id].'","'.$_SESSION['userId'].'",2,"'.$accountancyBalanced.'","")');

  }


  // DEDUCTION DU STOCK MAGENTO DANS L'HISTORIQUE DE MERP

  $sqlForThisProduct='SELECT DISTINCT entity_id AS productId, value AS reference, qty AS stock FROM catalog_product_entity_varchar, cataloginventory_stock_item WHERE attribute_id='.$productNameAttributeId.' AND product_id=entity_id ORDER BY entity_id DESC, qty ASC, product_id DESC';
  $reqForThisProduct = mysql_query($sqlForThisProduct) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProduct);
  while ($rowForThisProduct = mysql_fetch_array($reqForThisProduct)) {
    $sqlForThisProductHistory="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' ORDER BY date DESC, id DESC";
    $reqForThisProductHistory = mysql_query($sqlForThisProductHistory) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistory);
    $rowForThisProductHistory = mysql_fetch_array($reqForThisProductHistory);
   
    if ($rowForThisProduct['stock']!=$rowForThisProductHistory['stockNumber'])
      mysql_query('INSERT INTO merp_productstockshistory VALUES ("","'.$today.'",2,'.$rowForThisProduct['productId'].',"0","","2",'.$rowForThisProduct['stock'].')');

    if (empty($dailyNewsletter)) {
      $magentoProductReference[$rowForThisProduct['productId']]=$rowForThisProduct['reference'];
      $magentoProductStock[$rowForThisProduct['productId']]=$rowForThisProduct['stock'];
   
      $sqlForThisProductHistoryDaily="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -1 DAY) ORDER BY date DESC, id DESC";
      $reqForThisProductHistoryDaily = mysql_query($sqlForThisProductHistoryDaily) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryDaily);
      $rowForThisProductHistoryDaily = mysql_fetch_array($reqForThisProductHistoryDaily);
      $magentoProductSelledThisDay[$rowForThisProduct['productId']]=$rowForThisProductHistoryDaily['stockNumber']-$rowForThisProduct['stock'];
     
      //
      if ($magentoProductSelledThisDay[$rowForThisProduct['productId']]>0)
        $magentoDailyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$magentoProductSelledThisDay[$rowForThisProduct['productId']]),2);

      $sqlForThisProductHistoryWeekly="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -7 DAY) ORDER BY date DESC, id DESC";
      $reqForThisProductHistoryWeekly = mysql_query($sqlForThisProductHistoryWeekly) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryWeekly);
      $rowForThisProductHistoryWeekly = mysql_fetch_array($reqForThisProductHistoryWeekly);
      $magentoProductSelledThisWeek[$rowForThisProduct['productId']]=$rowForThisProductHistoryWeekly['stockNumber']-$rowForThisProduct['stock'];
     
      if ($magentoProductSelledThisWeek[$rowForThisProduct['productId']]>0)
        $magentoWeeklyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$magentoProductSelledThisWeek[$rowForThisProduct['productId']]),2);

      $sqlForThisProductHistoryMonthly="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -30 DAY) ORDER BY date DESC, id DESC";
      $reqForThisProductHistoryMonthly = mysql_query($sqlForThisProductHistoryMonthly) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryMonthly);
      $rowForThisProductHistoryMonthly = mysql_fetch_array($reqForThisProductHistoryMonthly);
      $magentoProductSelledThisMonth[$rowForThisProduct['productId']]=$rowForThisProductHistoryMonthly['stockNumber']-$rowForThisProduct['stock'];
     
      // Plus nécessaire de calculer, car on utilise l'autonomie moyenne jour + semaine / 2
      //if ($magentoProductSelledThisMonth[$rowForThisProduct['productId']]>0)
      //  $magentoMonthlyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$magentoProductSelledThisMonth[$rowForThisProduct['productId']]),2);

      $magentoStockAutonomy[$rowForThisProduct['productId']]=round((($magentoDailyStockAutonomy[$rowForThisProduct['productId']]+$magentoWeeklyStockAutonomy[$rowForThisProduct['productId']])/2),1);
    }
  }
}

// Compilation du tableau pour els articles de la base ERP
if (empty($dailyNewsletter)) {
  $sqlForThisProduct='SELECT DISTINCT merp_products.id AS productId, reference, stock FROM merp_products, merp_productstockshistory WHERE merp_products.id=merp_productstockshistory.productId AND productType=1 AND (date<=DATE_ADD(NOW( ),INTERVAL -30 DAY) OR stock>=1) ORDER BY stock ASC, reference ASC, date DESC LIMIT 500';
  $reqForThisProduct = mysql_query($sqlForThisProduct) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProduct);
  while ($rowForThisProduct = mysql_fetch_array($reqForThisProduct)) {
    $sqlForThisProductHistory="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='1' ORDER BY date DESC, id DESC";
    $reqForThisProductHistory = mysql_query($sqlForThisProductHistory) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistory);
    $rowForThisProductHistory = mysql_fetch_array($reqForThisProductHistory);
   
    $merpProductReference[$rowForThisProduct['productId']]=$rowForThisProduct['reference'];
    $merpProductStock[$rowForThisProduct['productId']]=$rowForThisProduct['stock'];
   
    $sqlForThisProductHistoryDaily="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -1 DAY) ORDER BY date DESC, id DESC";
    $reqForThisProductHistoryDaily = mysql_query($sqlForThisProductHistoryDaily) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryDaily);
    $rowForThisProductHistoryDaily = mysql_fetch_array($reqForThisProductHistoryDaily);
    $merpProductSelledThisDay[$rowForThisProduct['productId']]=$rowForThisProductHistoryDaily['stockNumber']-$rowForThisProduct['stock'];
   
    if ($merpProductSelledThisDay[$rowForThisProduct['productId']]>0)
      $merpDailyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$merpProductSelledThisDay[$rowForThisProduct['productId']]),2);

    $sqlForThisProductHistoryWeekly="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -7 DAY) ORDER BY date DESC, id DESC";
    $reqForThisProductHistoryWeekly = mysql_query($sqlForThisProductHistoryWeekly) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryWeekly);
    $rowForThisProductHistoryWeekly = mysql_fetch_array($reqForThisProductHistoryWeekly);
    $merpProductSelledThisWeek[$rowForThisProduct['productId']]=$rowForThisProductHistoryWeekly['stockNumber']-$rowForThisProduct['stock'];
   
    if ($merpProductSelledThisWeek[$rowForThisProduct['productId']]>0)
      $merpWeeklyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$merpProductSelledThisWeek[$rowForThisProduct['productId']]),2);

    $sqlForThisProductHistoryMonthly="SELECT stockNumber FROM merp_productstockshistory WHERE productId=".$rowForThisProduct['productId']." AND productType='0' AND date<=DATE_ADD(NOW( ),INTERVAL -30 DAY) ORDER BY date DESC, id DESC";
    $reqForThisProductHistoryMonthly = mysql_query($sqlForThisProductHistoryMonthly) or die("Erreur SQL : ".mysql_error()."<br />Requête : ".$sqlForThisProductHistoryMonthly);
    $rowForThisProductHistoryMonthly = mysql_fetch_array($reqForThisProductHistoryMonthly);
    $merpProductSelledThisMonth[$rowForThisProduct['productId']]=$rowForThisProductHistoryMonthly['stockNumber']-$rowForThisProduct['stock'];
    if ($merpProductSelledThisMonth[$rowForThisProduct['productId']]>0)
      $merpMonthlyStockAutonomy[$rowForThisProduct['productId']]=round(($rowForThisProduct['stock']/$merpProductSelledThisMonth[$rowForThisProduct['productId']]),2);

    $merpStockAutonomy[$rowForThisProduct['productId']]=round((($merpDailyStockAutonomy[$rowForThisProduct['productId']]+$merpWeeklyStockAutonomy[$rowForThisProduct['productId']]+$merpDailyStockAutonomy[$rowForThisProduct['productId']])/3),1);
  }
 
  //array_multisort($magentoProductSelledThisWeek, SORT_DESC, $magentoStockAutonomy, SORT_ASC, $magentoProductStock, SORT_DESC, $magentoProductReference, SORT_ASC, $magentoProductReference);
  foreach($magentoProductReference as $key => $value) {
    if ($magentoProductSelledThisMonth[$key]!=0 && $magentoProductSelledThisWeek[$key]!=0 && $magentoProductSelledThisDay[$key]!=0)
      $magentoProductChangeForDailyNewsletter .= '<tr><td>'.$value.' ('.$key.')</td><td>'.$magentoProductSelledThisMonth[$key].'</td><td>'.$magentoProductSelledThisWeek[$key].'</td><td>'.$magentoProductSelledThisDay[$key].'</td><td>'.$magentoStockAutonomy[$key].'</td><td>'.$magentoProductStock[$key].'</td></tr>';
  }

  //array_multisort($merpProductSelledThisWeek, SORT_DESC, $merpStockAutonomy, SORT_ASC, $merpProductStock, SORT_DESC, $merpProductReference, SORT_ASC, $merpProductReference);
  foreach($merpProductReference as $key => $value) {
    if ($merpProductSelledThisMonth[$key]!=0 && $merpProductSelledThisWeek[$key]!=0 && $merpProductSelledThisDay[$key]!=0)
      $merpProductChangeForDailyNewsletter .= '<tr><td>'.$value.' ('.$key.')</td><td>'.$merpProductSelledThisMonth[$key].'</td><td>'.$merpProductSelledThisWeek[$key].'</td><td>'.$merpProductSelledThisDay[$key].'</td><td>'.$merpStockAutonomy[$key].'</td><td>'.$merpProductStock[$key].'</td></tr>';
  }

  $tabHeader ='<table><tr><td><b>Reference (id)</b></td><td><b>Vendu(s) (m)</b></td><td><b>Vendu(s) (7j)</b></td><td><b>Vendu(s) (j)</b></td><td><b>Autonomie</b></td><td><b>En Stock</b></td>';
  $tabFooter ='</table><br /><br />';
  $messageSubject="Rapport journalier de sortie de stock";
  $message ="Bonjour<br>";
  $message .="-------------------------------------------- <br><br>";
  $message .="Ce message vous informe des produits vendus depuis hier<br /><br />";
  $message .="BASE Magento".$tabHeader.$magentoProductChangeForDailyNewsletter.$tabFooter;
  $message .="BASE ERP".$tabHeader.$merpProductChangeForDailyNewsletter.$tabFooter;
  $message .="</table><br /><br /><b>Cordialement, l'équipe $ASociete</b>";
 
  $messageReadyToSend=$message_header_start.$message.$message_header_end;

  mail($mailBuyerManager, $messageSubject, $messageReadyToSend, $mailheaders);
  mysql_query('INSERT INTO merp_productstocknewsletters VALUES ("","'.$today.'","1","'.$mailBuyerManager.'")');
}

mysql_close();

echo 'SYNCHRO EFFECTUÉE';

?>

#4 Re : Forum Général PHP » Soucis avec un tableau multi dimensionnel » 13-02-2012 19:18:58

Je comprends pas cette nécessité ni vraiment la solution proposé (désolé)...


Normalement si j'ai 3 paiements tels que :
Especes 100
Cheque 120
Cheque 130

Le tableau devrait être compilé de la sorte :

[Espece][0]=100
[Cheque][0]=120
[Cheque][1]=130


non?

#5 Re : Forum Général PHP » Soucis avec un tableau multi dimensionnel » 13-02-2012 19:18:58

Maljuna Kris a écrit :

Alors il te faut imbriquer 2 foreach.
Pour comprendre en détail fait un print_var($paymentTab) et regarde le résultat.

Ce qui est bizarre, c'est que ma première boucle foreach devrait me sortir tout les moyens de paiements (Cheque, Especes, etc...) à partir du moment ou ils sont compris dans la requête. Hors là, je n'ai qu'une seul méthode qui en ressort...

Le array_sum me permet théoriquement de faire la somme de tout les paiements d'une même méthode (et ça fonctionne, vu que j'arrive à avoir mon bon total de paiement par chèque...), Mais il ne me sors pas les espèces, les financements, etc..

#6 Re : Forum Général PHP » Soucis avec un tableau multi dimensionnel » 13-02-2012 19:18:58

Parce qu'en fait j'ai besoin de parcourir chaque paiement (j'ai modifié le code avant de le mettre sur le forum). Et je voulais en profiter pour mettre tout ça dans un tableau et que ça m'évite une seconde requête...

#7 Forum Général PHP » Soucis avec un tableau multi dimensionnel » 13-02-2012 19:18:58

rick's
Réponses : 9

Bonjour à tous,


Je vous explique mon petit souci, je souhaite incrémenter un tableau multidimensionnel, pour ensuite en récupérer les valeurs et en faire la somme par méthode de paiement... Vous y verrez certainement mieux avec un bout de code.

  $sqlPayment = "SELECT Date, Mode, NumIden, Montant FROM merp_payment WHERE estimateId='$estimateId'";
  $reqPayment = mysql_query($sqlPayment) or die("Erreur SQL : ".mysql_error()."<br>Requête : $sqlPayment");
  while ($rowPayment = mysql_fetch_array($reqPayment)) {
    $paymentTab[$rowPayment['Mode']][] = $rowPayment['Montant'];
  }


    foreach($paymentTab AS $paymentMethod => $amount) {
      $paymentInfo=$paymentMethod." - ".array_sum($amount)."<br />";
    }

Mais dans ce cas, il ne me retourne que les paiements du premier mode de paiement rencontré sad


Vous avez une idée?

++

#8 Re : Forum Général PHP » Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09 » 03-05-2010 20:01:42

Eh bé comme ça, ça fonctionne... Allez comprendre...

$periodStart=$_COOKIE['yearToWork']."-".$exerciceStartMonth;
$periodEnd=$exerciceNextYear."-".$exerciceEndMonth;

$sqlReports="SELECT * FROM reports WHERE period BETWEEN '".$periodStart."' AND '".$periodEnd."' ORDER BY period";
$reqReports = mysql_query($sqlReports) or die("Erreur SQL : ".mysql_error()."<br>Requête : ".$sqlReports);
while ($rowReports = mysql_fetch_array($reqReports)) {
   //...
}

#9 Re : Forum Général PHP » Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09 » 03-05-2010 20:01:42

Même problème avec

SELECT * FROM reports WHERE period BETWEEN STR_TO_DATE('2010-04') AND STR_TO_DATE('2010-12') ORDER BY period

...

#10 Re : Forum Général PHP » Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09 » 03-05-2010 20:01:42

Salut,

je rentre juste de déplacement et ouahaou, qu'elle activité tongue

le $sqlReport me donne : SELECT * FROM reports WHERE period BETWEEN '2010-04' AND '2010-12' ORDER BY period

Le concepteur c'est moi tongue et on peut pas me viré je suis mon propre patron tongue

à l'origine je souhaitai définir un mois, c'est pour ça que j'ai pris ce type d'enregistrement, qui me semblai sur le coup plus approprié...


la date est sous forme yyyy-mm

Merci de vous êtes tous attardé à mon soucis (qui persistent)

#12 Re : Forum Général PHP » Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09 » 03-05-2010 20:01:42

xTG a écrit :

Essayes d'intervertir tes quotes. Les doubles quotes influent peut être sur l'exploitation de la date par le sgbd.

Changement effectué, rien de mieux....

#13 Re : Forum Général PHP » Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09 » 03-05-2010 20:01:42

Salut Majuna,

voici ma requête exacte :

$sqlReports='SELECT * FROM reports WHERE period BETWEEN "'.$_COOKIE['yearToWork'].'-'.$exerciceStartMonth.'" AND "2010-12" ORDER BY period';

elle ne me retourne rien, malgrès la présence de mes enregistrements

Cordialement,
Eric

#14 Forum Général PHP » Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09 » 03-05-2010 20:01:42

rick's
Réponses : 20

Bonjour,

Je souhaite sélectionner tous les enregistrements d'une table se situant entre deux date du type énoncé dans le sujet.

je ne peux pas changer la syntaxe de ces enregistrements et dans la base le type est de forme varchar.

J'ai essayé plusieurs possibilités sans succès (en utilisant les opérateur >= et =< ainsi que la commande between), mais rien de tout ça fonctionne...

Avez vous une idée?

Cordialement,
Eric

Pied de page des forums

Propulsé par FluxBB