Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Comportamento strano array

    Ho scritto uno script che ha un comportamento un po' strano. Ho usato la funzione array_intersect per intersecare il risultato di due query. Tramite la funzione $risultato[$id] riesco a recuperare l'effettivo indice di una tabella di database. Quando però cerco di recuperare i record nella tabella usando questo come indice, questi record non vengono recuperati. Pensavo si trattasse di un problema di formato della variabile e ho provato a forzare a integer il valore con
    Codice PHP:
     $idc=$risultato[$id];
                                 
    settype($idc,integer); 
    ma stranamente la successiva query sembra non funzionare. Il listato completo è questo:
    Codice PHP:
    <?php
    session_start
    ();
    $utente="guest";
    $passwd="guest";
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">
    <head>
    <title> Visualizzazione congresso </title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
    <body>
    <form method="post" action="d_congresso.php">



    Congressi:

    <?php    
        $anno
    =$HTTP_POST_VARS["anno"];
        
    $luogo=$HTTP_POST_VARS["luogo"];
        
    $con=mysql_connect($host,$utente,$passwd) or die("Connessione non riuscita: " mysql_error());
        
    mysql_select_db("news") or die("Selezione del database non riuscita");
    if(
    $anno != ''){
                          
    $nca "SELECT * FROM congresso,evento WHERE  congresso.id_evento=evento.id_evento AND evento.Anno='$anno'";
                    
    $querya mysql_query($nca);
                    if(
    $rigaa mysql_fetch_array($querya)){
                                                              
    $ar1=array($rigaa["id_congresso"]);
                                                            }
                    while(
    $rigaa mysql_fetch_array($querya)){
                                                                  
    array_push($ar1,$rigaa["id_congresso"]);
                                                          }
                   }
    if(
    $luogo != ''){
                           
    $ncl "SELECT * FROM congresso,evento WHERE  congresso.Luogo='$luogo' AND congresso.id_evento=evento.id_evento";
                     
    $queryl mysql_query($ncl);
                     if(
    $rigal mysql_fetch_array($queryl)){
                                                               
    $ar2=array($rigal["id_congresso"]);
                                                            }
                     while(
    $rigal mysql_fetch_array($queryl)){
                                                                  
    array_push($ar2,$rigal["id_congresso"]);
                                                               }
                        }
    else if(
    $luogo == ''){
                           
    $ncl "SELECT * FROM congresso,evento";
                     
    $queryl mysql_query($ncl);
                     if(
    $rigal mysql_fetch_array($queryl)){
                                                              
    $ar2=array($rigal["id_congresso"]);
                                                            }
                     while(
    $rigal mysql_fetch_array($queryl)){
                                                                  
    array_push($ar2,$rigal["id_congresso"]);
                                                               }
                        }
    $risultato array_intersect($ar1,$ar2);
    $indici array_keys($risultato);
    ?>
    <select name="congresso">
    <?php
         $i
    =0;
         
    $id=$indici[$i];
         while(
    $risultato[$id]) {
                                 
    $idc=$risultato[$id];
                                 
    settype($idc,integer);
                                  
    $rcon =  "SELECT * FROM congresso WHERE  id_congresso='$idc'";
                                 
    $queryr mysql_query($rcon);
                                 
    $rigar mysql_fetch_array($queryr);
                                 
    $ide $rigar["id_evento"];
                                 
    settype($ide,integer);
                                 
    $rev =  "SELECT * FROM evento WHERE  id_evento='$ide'";
                                 
    $queryre mysql_query($rev);
                                 
    $rigare mysql_fetch_array($queryre);                                    
                                    echo 
    "<option value='" $idc "'>"  $idc "-" $rigare["$Titolo"] . "-" $rigare["$Anno"]. "-" $rigar["$Luogo"]. "-" $rigar["$Organizzazione"];
                                    echo 
    "</option>";
                                 
    $i=$i+1;
                                 
    $id=$indici[$i];
                                      }
    ?>
    </select>
    </p>


                  
    <input type="submit" value="Invia &gt;"/>
    </p>
    <?php    
        mysql_close
    ($con);
    ?>
    </form>
    </body>
    </html>
    Sapreste per cortesia dirmi dove è il problema?
    Grazie

  2. #2
    Innanzitutto devi inizializzare i due array: $ar1 e $ar2 altrimenti se non vi è nessun elemento in uno dei 2 poi l'istruzione array_intersect ti darebbe problemi. Quindi:

    <?php
    $anno=$HTTP_POST_VARS["anno"];
    $luogo=$HTTP_POST_VARS["luogo"];
    $con=mysql_connect($host,$utente,$passwd)
    or die("Connessione non riuscita: " . mysql_error());
    mysql_select_db("news") or die("Selezione del database non riuscita");

    $ar1 = array();
    $ar2 = array();


    Poi, questo codice:

    if($rigaa = mysql_fetch_array($querya)){
    $ar1=array($rigaa["id_congresso"]);
    }
    while($rigaa = mysql_fetch_array($querya)){
    array_push($ar1,$rigaa["id_congresso"]);
    }

    io lo sostituirei semplicemente con:

    while($rigaa = mysql_fetch_assoc($querya))
    {
    $ar1[] = $rigaa["id_congresso"];
    }

    Analogamente per l'array $ar2.


    Osservazione:
    quando scrivi:

    if ($luogo != '')
    else......

    Se il controllo va nell'else vuol dire che $luogo è SICURAMENTE uguale a ''

    quindi è inutile scrivere

    if ($luogo != '')
    else if ($luogo == '')

    basta appunto semplicemente fare:

    if ($luogo != '')
    else



    io, qui:

    $risultato = array_intersect($ar1,$ar2);
    $indici = array_keys($risultato);
    ?>
    <select name="congresso">
    <?php
    $i=0;
    $id=$indici[$i];
    while($risultato[$id]) {
    $idc=$risultato[$id];
    settype($idc,integer);
    $rcon = "SELECT * FROM congresso WHERE id_congresso='$idc'";

    farei:
    $risultato = array_intersect($ar1,$ar2);
    ?>

    <select name="congresso">

    <?php
    foreach($risultato as $id)
    {
    $rcon = "SELECT * FROM congresso WHERE id_congresso=$id";


    Sicuramente così il codice è + semplice e + pulito.
    Forse non c'è bisogno di fare settype...... penso che gli elementi siano già visti come interi.


    In quest'ultima linea di codice se hai notato:
    $rcon = "SELECT * FROM congresso WHERE id_congresso=$id";

    non ho messo ' prima e dopo $id anche perché si tratta di un intero e quindi non ve n'è bisogno.

    Da quello che ho capito, il tuo array $risultato dovrebbe essere vuoto.
    Quindi al limite fai una echo sizeof($risultato); per vedere se vi è almeno un elemento.

  3. #3
    $idc=$risultato[$id];
    settype($idc,integer);
    $rcon = "SELECT * FROM congresso WHERE id_congresso='$idc'";
    $queryr = mysql_query($rcon);
    $rigar = mysql_fetch_array($queryr);
    $ide = $rigar["id_evento"];
    settype($ide,integer);
    $rev = "SELECT * FROM evento WHERE id_evento='$ide'";
    $queryre = mysql_query($rev);
    $rigare = mysql_fetch_array($queryre);
    echo "<option value='" . $idc . "'>" . $idc . "-" . $rigare["$Titolo"] . "-" . $rigare["$Anno"]. "-" . $rigar["$Luogo"]. "-" . $rigar["$Organizzazione"];
    echo "</option>";
    $i=$i+1;
    $id=$indici[$i];

    Qui forse c'è un errore:

    cioé forse volevi scrivere $rigare['Anno'] e non $rigare['$Aanno'] così come anche $rigare["$Titolo"].......

  4. #4
    Ho analizzato meglio il codice. Scusa ma non sarebbe meglio fare:

    $anno=$HTTP_POST_VARS["anno"];
    $luogo=$HTTP_POST_VARS["luogo"];
    $con=mysql_connect($host,$utente,$passwd) or die("Connessione non riuscita: " . mysql_error());
    mysql_select_db("news") or die("Selezione del database non riuscita");

    //Ora ci costruiamo la query in base al valore delle var.li passate.

    $sql = "SELECT * FROM congresso A INNER JOIN evento B on A.id_evento=B.id_evento";

    $condition = "";

    if ($anno != '') $condition = "B.Anno=$anno";

    if ($luogo != '')
    {
    if ($condition == "") $condition = "A.Luogo=\"$luogo\"";
    else $condition .= "AND A.Luogo=\"$luogo\"";
    }

    if ($condition != "") $sql .= " WHERE " . $condition;

    //A questo punto eseguiamo la query:

    $query = @mysql_query($sql);

    echo "<SELECT NAME=\"congresso\">";

    while ($riga = @mysql_fetch_assoc($query))
    {
    //Ora ti prendi tutti i dati ke ti servono:
    $id = $riga['id_evento'];
    $anno = $riga['anno'];
    $titolo = stripslashes($riga['Titolo']);
    ...........

    //e ti completi la select
    echo "<OPTION VALUE='" . $id . "'>" . $id . "-" . $Titolo . "-" . $Anno. "-" .....................;
    echo "</OPTION>";
    }

    echo "</SELECT>";


    In tal modo accedi una sola volta al DB per eseguire una sola query ed oltre tutto non ti vai ad incasinare con l'array.

  5. #5
    Grazie per la risposta!
    Ho provato il listato modificato secondo la versione del tuo ultimo post e funziona perfettamente.
    Ti ringrazio anche per le idee su come semplificare e rendere il listato più efficiente. Mi sono molto utili anche perchè sto imparando il php proprio ora.
    Grazie di tutto.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.