Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25

Discussione: cicli for annidati

  1. #1

    cicli for annidati

    ciao,

    pagina form :

    <select name="comune[]" multiple="multiple">
    <select name="ambito[]" multiple="multiple">

    nello script di controllo:

    $comune = $_POST['comune'];
    $ambito = $_POST['ambito'];

    Il contenuto di questi array che possono essere di dimensioni differenti, li dovrei ciclare per inserire i dati in una tabella

    INSERT INTO tbl_relazioni ( id_ambito, id_comune ) VALUES ( ........ );

    se ho capito bene dovrei usare 2 cicli for annidati. Ma come si fa? :master:

    grazie per l'aiuto

  2. #2
    per inserire un array in un campo del db (per quanto io ne sappia) occorre trasformarli in stringhe; i miei studi (limitati sul tema) mi hanno fatto conoscere due funzioni:
    -implode()
    - serialize()

  3. #3
    mah...
    se avessi solo 1 array da ciclare sarebbe così:

    if (isset($_POST['ambito'])) {
    foreach ($_POST['ambito'] as $value) {
    $strSQL = "INSERT INTO tbl_associazioni ( id_ambito ) VALUES ( '$value')";

    $result = dbQuery($strSQL);


    ma se ne ho 2 ?

  4. #4
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Per prima cosa devi sapere bene che query devi generare e come sono messi i dati che ti arrivano.

    A volte come sono i dati non lo si puo' sapere a priori quindi e' buona norma usare la funzione var_dump per controllare come sono i dati.

    Inoltre e' buona norma studfiare bene come funzionano le tecnologie e se vai nel sito di mysql sicuramente torverai un sacco di incofmrazioni su come fare le query di inseriemnto anche con piu' righe in una unica query.
    In soldoni cmq sql supporta i seguenti tipi di inserimento dati per righe multiple :

    1 -
    insert into table (campo1,cmapo2,campo3) values( 'valore0.1' , 'valore0.2' , 'valore0.3' ) ;
    insert into table (campo1,cmapo2,campo3) values( 'valore1.1' , 'valore1.2' , 'valore1.3' ) ;
    etc...

    2 -
    insert into table (campo1,cmapo2,campo3)
    values( 'valore0.1' , 'valore0.2' , 'valore0.3' ) ,
    values( 'valore1.1' , 'valore1.2' , 'valore1.3' ) ,
    values( 'valore2.1' , 'valore2.2' , 'valore2.3' ) ;

    Quindi puoi tranqullamente sfruttare la seconda soluzione se devi inserire molte righe insieme.
    Facendo cmq attenzione ai tempi di esecuzione, se fossero troppo elevati riceversti un errore tipo : "Mysql has gone away". Ossia la connesione e' stata terminata. Ma succede quando hai davvero troppi dati da inserire e quindi sfori il tempo max di connessione

    Poi per controllare come e che dati ti arrivano io di solito scrivo 4 semplici righe di codice :
    echo "<pre>" ;
    var_dump($variabile);
    echo "</pre>";
    die();

    Cosi' puoi controllare che dati ti arrivano.

    Ultima cosa, a mio avviso e' buona norma evitare (per quanto possibile) i cicli annidati, nel tuo caso puoi risolverti al cosa con cicli lineari eseguiti in sequenza.

    Ciauz.

  5. #5
    Originariamente inviato da Virus_101
    Per prima cosa devi sapere bene che query devi generare e come sono messi i dati che ti arrivano.
    la query è sempre la stessa: INSERT INTO tbl_associazioni ( id_ambito, id_comune ) VALUES ( '$valore1', '$valore2')";

    A volte come sono i dati non lo si puo' sapere a priori quindi e' buona norma usare la funzione var_dump per controllare come sono i dati.
    in che senso? Dalla pagina form l'unica cosa da fare è selezionare dalla combo il numero di comuni e ambiti e inviarli allo script che controlla l'inserimento nel DB, quindi l'unica cosa che può variare è la dimensione dell'array


    Ultima cosa, a mio avviso e' buona norma evitare (per quanto possibile) i cicli annidati, nel tuo caso puoi risolverti al cosa con cicli lineari eseguiti in sequenza.
    Cioè? posso fare 1 ciclo foreach come ho scritto sopra, separato per ogni array? ma cosi mi da errore SQL di inserimento.

    non mi è chiaro come fare l'inserimento... :master:

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Ti faccio un esempio su cui lavorare :

    $maxFields = 6 ;

    $arr = array(
    "campo1" => "dato1" ,
    "campo2" => "dato2" ,
    "campo3" => "dato3" ,
    "campo4" => "dato4" ,
    "campo5" => "dato5"
    )


    $query = " insert into mytable(campo1,campo2,campo3,campo4,campo5,campo6) " ;
    $values = "" ;

    for( $i = 0 ; $i<$maxFields ; $i++ )
    {
    if( $arr[$i] )
    $values .= " '".$v."' , " ;
    else
    $values .= " '' , " ;
    }
    if( !$values )
    { die("Inserire almeno 1 valore"); }

    $values = substr( $values , 0 , strrpos($values,",") ) ;
    $query .= " values ".$values ;

    echo $query ;

  7. #7
    Codice PHP:
    if (isset($_POST['comune']) && isset($_POST['ambito'])) {

     
    $comune  $_POST['comune'];        
     
    $ambito  $_POST['ambito']; 

     
    $maxFields ;  
    $arr = array( "id_ambito" => "$ambito
                  
    "id_comune" => "$comune"  );   

    $query "INSERT INTO tbl_relazioni(id_ambito, id_comune)"
    $values "" ;  
        for( 
    $i $i<$maxFields $i++ ) { 
              if( 
    $arr[$i] ) $values .= " '".$v."' , " 
         else 
    $values .= " '' , " ; } 

    if( !
    $values ) { 
    die(
    "Inserire almeno 1 valore"); }  
    $values substr$values strrpos($values,",") ) ; 
    $query .= " values ".$values ;  
    $result dbQuery($query);      

    header("Location: index.php");     }  } 

    mi da alcuni errori:

    Undefined offset: 0 in C:\Program Files\htdocs\....\processProduct.php on line 101

    la riga 101 è questa: if( $arr[$i] )

    e poi di conseguenza un errore di sql

  8. #8
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Si vero perche' nn e' detto che $arr contenga tutti i valori dovresti aggiungre un controllo
    sulla dimensione dell'array scansionato.
    Codice PHP:

    for( $i $i<$maxFields $i++ ) 

              if(  
    $i<count($arr) && $arr[$i] )
                   
    $values .= " '".$v."' , " 
              else 
                   
    $values .= " '' , " 


  9. #9
    Non capisco...

    continua a darmi errore.

    Codice PHP:
    if (isset($_POST['comune']) && isset($_POST['ambito'])) {                
    $comune  $_POST['comune'];        
    $ambito  $_POST['ambito'];  

    $maxFields ;  
    $arr = array( "id_ambito" => "$ambito
                      
    "id_comune" => "$comune"  );   
    $query "INSERT INTO tbl_relazioni(id_ambito, id_comune)"
    $values "" ;  
    for( 
    $i $i<$maxFields $i++ )  {            
       if(  
    $i<count($arr) && $arr[$i] )                
       
    $values .= " '".$v."' , " ;            
    else                 
    $values .= " '' , " ;  } 
    if( !
    $values ) { 
    die(
    "Inserire almeno 1 valore"); }  
    $values substr$values strrpos($values,",") ) ; 
    $query .= " values ".$values ;  $result dbQuery($query);      

    header("Location: index.php");     } 
    Notice: Undefined offset: 0 in C:\Program Files\htdocs\....\processProduct.php on line 101

    ma cosa vuol dire "undefined offset"?

  10. #10
    Utente di HTML.it L'avatar di brodik
    Registrato dal
    Jan 2009
    Messaggi
    764
    ma perchè metti la variabile
    $maxFields = 6;
    quando hai solo due campi nel tuo script?

    a questo punto farei:

    Codice PHP:
    $arr = array( "id_ambito" => "$ambito
                      
    "id_comune" => "$comune"  );
    $maxFields count($arr);

    for( 
    $i $i<$maxFields $i++ )  { 
    eXvision

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.