[PHP] Controllare condizione ciclo While

nonsochisono

Nuovo Utente
23 Ago 2012
7
0
1
PHP:
function desc_caratteristica_ditta()
            {
?>
<body>
    <div id="div2">
        <form action="NextFile.php" method="post">
            <table border="2px" cellspacing="0px";>
                <tr>
                    <th>Codice caratteristica_ditta</th>
                    <th>Descrizione caratteristica_ditta WINFARM </th>
                    <th>Cod Magento</th>
                    <th>Descrizione caratteristica_ditta Magento </th>
                </tr>
                <?php
                $db = new PDO ( "mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD );
                $querycaratteristica_ditta="SELECT caratteristica_ditta  FROM importaditte2 GROUP BY caratteristica_ditta ORDER BY caratteristica_ditta";
                $stm4=$db->prepare($querycaratteristica_ditta);
                $stm4->execute();
                $totale4 = $stm4->rowCount();
                echo 'sono presenti: '.$totale4.' prodotti con caratteristica_ditta',"<br />" ;
                $i=1;

                    while($row5 = $stm4->fetch(PDO::FETCH_ASSOC))
                {
                    $caratteristica_ditta = $row5['caratteristica_ditta'];
                    $dcaratteristica_ditta=$row5['caratteristica_ditta']; //caratteristica_ditta
                    $querycaratteristica_ditta3="SELECT * FROM TS011 WHERE FDI_T004 = '$dcaratteristica_ditta'";
                    $stm7=$db->prepare($querycaratteristica_ditta3);
                    $stm7->execute();
                    $row7 = $stm7->fetch(PDO::FETCH_ASSOC);
                    $risultato_desc_caratteristica_ditta1=$row7['FDI_T005'];  codice caratteristica_ditta                                                     
             
                    $dcaratteristica_ditta=$row5['caratteristica_ditta']; //caratteristica_ditta
                    $querycaratteristica_ditta2="SELECT * FROM caratteristica_ditta2 WHERE caratteristica_ditta = '$dcaratteristica_ditta'";
                    $stm5=$db->prepare($querycaratteristica_ditta2);
                    $stm5->execute();
                    $row6 = $stm5->fetch(PDO::FETCH_ASSOC);
                    $risultato_desc_caratteristica_ditta=$row6['caratteristica_ditta'];
                    if (! empty ( $risultato_desc_caratteristica_ditta )) {
                $conteggio = 0;
                continue;
                    }
                    else {
                $conteggio = 1;                 
                    }
                ?>
                <tr>
                    <td  >
                        <input type="text" size="10" name="first<?php echo $i; ?>" value= "<?php echo $caratteristica_ditta; ?>" />
                    </td>
                    <td>
                        <input  type="text" size="50" name="second<?php echo $i;?>"value= "<?php echo $risultato_desc_caratteristica_ditta1 ?>" />
                    </td>
                    <td>
                        <input type="text" size="10" name="third<?php echo $i;?>" />
                    </td>
                    <td>
                        <input type="text" size="70" name="forth<?php echo $i;?>" value= "<?php echo 'Default Category/' ?>" />
                    </td>
                </tr>
                <?php         
                $i++;
                }         
                ?>
            </table>
            <input  type="submit" value="Submit"/>
        </form>
    </div>
    <?php
    if ( $conteggio == 0) {
    echo 'Devi aggiornare caratteristica_ditta';
    }
    else ( $conteggio == 1 ) {
    echo 'aaaaaaaaaaaaaaaaaaaaaa';
    ?>
    <br/><br/>
    <script
    src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script type="text/javascript">
                            $(document).ready(function() {
                            $("table").remove();
                            $("input").remove();
                            });
    </script>
    <br/><br/>
    -->
            </body>
            </html>
                    }
            }
Premetto che non sono un professionista ma programmo per diletto.
Quello che devo fare è un pochettino complesso per me. Con la prima query prelevo informazioni di una ditta raggruppate per questa caratteristica, poi verifico questa caratteristica sul database collegato a questa caratteristica e dovrò inserirla se non è presente nel terzo database che fungerà da tabella di scambio.
Il tutto lo mando con il post alla seconda pagina.
Mi funziona tutto tranne per il controllo finale, non riesco a capire come faccio a determinare nella prima condizione if , se e quando si verifica else
forse sono stato un pò contorto
sicuramente
 
Ultima modifica:

nonsochisono

Nuovo Utente
23 Ago 2012
7
0
1
PHP:
            while($row5 = $stm4->fetch(PDO::FETCH_ASSOC))
                {

                                        ........
                                                prelevo variabile database

                                    ::::::::::
                    }
                    else {
                        $conteggio = 1;
                        //$conteggio = 1;
                    }

                        ?>
                                            TABELLA........
                           
                       $i++;

                }
           
                        ALL'ESTERNO DEL CICLO

                   if ( $conteggio == 0) {

                           echo 'Devi aggiornare .......;

                   }

                       else  {
                        echo 'Tutti gli ...............';
                     ?>


                      }
semplifico un conto e verificare con if all'interno del ciclo, fin qui tutto bene
ma all'esterno del ciclo come faccio? vorrei vedere se almeno una condizione si è verificata una vola
grazie
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
while($row5 = $stm4->fetch(PDO::FETCH_ASSOC))
{

........
prelevo variabile database

::::::::::
}
else {
$conteggio = 1;
//$conteggio = 1;
}

?>
TABELLA........

$i++;

}

ALL'ESTERNO DEL CICLO

if ( $conteggio == 0) {

echo 'Devi aggiornare .......;

}

else {
echo 'Tutti gli ...............';
?>
Dichiara conteggio fuori il ciclo while, cosi:
PHP:
$conteggio=0;
while(......){.....}
if($conteggio){
//conteggio == 1
}else{
//conteggio == 0
}
Altra nota, opterei per metodi che effettuano le operazione che servono... Questa modalità seppur semplice molto spesso induce ad errori. Potresti vedere come implementare (non necessariamente una "classe") delle funzioni che facciano quello che a te serve passando le variabili corrette riusciresti a spezzare la logica in tante piccole parti, questo conviene per fare debug e per controllare meglio il flusso d'elaborazione dati.
 

nonsochisono

Nuovo Utente
23 Ago 2012
7
0
1
ma io verifico la variabile prelevata dal database all'interno del ciclo se è true allora $conteggio =0, altrimenti =1; Fin qui tutto ok
il problema che una volta finito il ciclo io voglio sapere se per esempio il flusso del programma è passato almeno una volta da else.
Ma questo non lo posso sapere perchè $conteggio prende il valore dell'ultimo passaggio.
Non so se mi sono spiegato
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
while($row5 = $stm4->fetch(PDO::FETCH_ASSOC))
{
$caratteristica_ditta = $row5['caratteristica_ditta'];
$dcaratteristica_ditta=$row5['caratteristica_ditta']; //caratteristica_ditta
$querycaratteristica_ditta3="SELECT * FROM TS011 WHERE FDI_T004 = '$dcaratteristica_ditta'";
$stm7=$db->prepare($querycaratteristica_ditta3);
$stm7->execute();
$row7 = $stm7->fetch(PDO::FETCH_ASSOC);
$risultato_desc_caratteristica_ditta1=$row7['FDI_T005']; codice caratteristica_ditta

$dcaratteristica_ditta
=$row5['caratteristica_ditta']; //caratteristica_ditta
$querycaratteristica_ditta2="SELECT * FROM caratteristica_ditta2 WHERE caratteristica_ditta = '$dcaratteristica_ditta'";
$stm5=$db->prepare($querycaratteristica_ditta2);
$stm5->execute();
$row6 = $stm5->fetch(PDO::FETCH_ASSOC);
$risultato_desc_caratteristica_ditta=$row6['caratteristica_ditta'];
if (! empty (
$risultato_desc_caratteristica_ditta )) {
$conteggio = 0;
continue;
}
else {
$conteggio = 1;
}
?>
Allora per fare quello che chiedi se ho capito bene..... ti serve sapere il numero di volte?
Allora prima del while:
PHP:
$conta_conteggio=[];
//altra notazione dove in num è incrementale di conteggio e items sono gli obj aggiornati
$conta_conteggio_uno=['num'=>0,'items'=>[]];
while(.....){
//tutto il tuo codice
if (! empty ( $risultato_desc_caratteristica_ditta )) {
                $conteggio = 0;
                continue;
                    }
                    else {
                $conteggio = 1; 
          //per assurdo credo che ci sia almeno un ID quindi (obj), dove row7['ID'] sarebbe l'identificativo.... naturalmente devi adattarlo.
          $conta_conteggio[]=['conteggio'=>1,'element'=>$row7['ID']];
               $conta_conteggio_uno['num']++;
              $conta_conteggio_uno['items'][]=$row7['ID'];
                    }
}
//siamo fuori dal ciclo
//numero di volte che sei entrato in conteggio prima versione
echo count($conta_conteggio);
//numero di volte seconda versione
echo $conta_conteggio_uno['num'];

//per vedere gli obj aggiornati o cmq sia processati
//prima versione
foreach($conta_conteggio as $key=>$value){
     echo $value['element'].' -';
}
//seconda versione
print_r($conta_conteggio_uno['items']);
non resta che scegliere quello che ti serve sempre se ho centrato il problema.
 

nonsochisono

Nuovo Utente
23 Ago 2012
7
0
1
PHP:
        <?php


                            while($row5 = $stm4->fetch(PDO::FETCH_ASSOC))
                {
                                    CICLO WHILE
                                    ......
                                    PRELEVO VARIABIL  $risultato_desc_caratteristica_ditta

                        //QUESTO IF TUTTO OK SE è PIENA LA VARIABILE SALTA
                            //        ALTRIMENTI  PRELEVO I DATI PER LA MIA TABELLA
                    if (! empty ( $risultato_desc_caratteristica_ditta )) {
                $conteggio = 0;
                continue; 
                    }
                    else {
                $conteggio = 1;                       
                    }
                ?>


                                    TABELLA  QUI TUTTO OK

                           
                $i++;
                }               
                ?>
            </table>
            <input  type="submit" value="Submit"/>
        </form>
    </div>


                            <?php
                            //IL PROBLEMA SORGE QUI


                            if ( $conteggio == 0) {
                            echo 'Devi aggiornare caratteristica_ditta';
                            }
                            else {
                            echo 'aaaaaaaaaaaaaaaaaaaaaa';
                           
                            }
Dove sorge il problema è perchè io voglio sapere all'esterno del ciclo while se la condizione else interna è stata eseguita almeno una volta.
la variabile $conteggio purtroppo all'esterno non è utilizzabile in quanto memorizza il valore dell'ultimo passaggio all'interno di While
spero di essere stato più chiaro
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
Hai provato il codice?
Dove sorge il problema è perchè io voglio sapere all'esterno del ciclo while se la condizione else interna è stata eseguita almeno una volta.
Infatti è stata dichiarata una var di tipo array fuori dal ciclo che memorizza il numero di volte e gli items che sono stati aggiornati e/o che comunque sia la condizione "$conteggio=1" sia vera.
$conta_conteggio=[];
//altra notazione dove in num è incrementale di conteggio e items sono gli obj aggiornati
$conta_conteggio_uno=['num'=>0,'items'=>[]];
Questo si trova fuori il while
if (! empty ( $risultato_desc_caratteristica_ditta )) {
$conteggio = 0;
continue;
}
else {
$conteggio = 1;
//per assurdo credo che ci sia almeno un ID quindi (obj), dove row7['ID'] sarebbe l'identificativo.... naturalmente devi adattarlo.
$conta_conteggio[]=['conteggio'=>1,'element'=>$row7['ID']];
$conta_conteggio_uno['num']++;
$conta_conteggio_uno['items'][]=$row7['ID'];
}
}
Questo il tuo codice con il conteggio interno al while con le due variabili conta_conteggio e conta_conteggio uno che saranno valorizzate ad ogni iterazione in cui conteggio sia uno....

Quale parte fuori al while non funziona?
//siamo fuori dal ciclo
//numero di volte che sei entrato in conteggio prima versione

echo count($conta_conteggio);
//numero di volte seconda versione
echo $conta_conteggio_uno['num'];

//per vedere gli obj aggiornati o cmq sia processati
//prima versione

foreach($conta_conteggio as $key=>$value){
echo
$value['element'].' -';
}

//seconda versione
print_r($conta_conteggio_uno['items']);