Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Consulenza su query

  1. #1

    Consulenza su query

    ciao a tutti sono un allegro principiante del php.

    Dovete sapere che stò cercando di creare un sito di annunci basato su 2 tabelle:

    - Annunci
    - Foto

    E' un sistema fatto in modo che un utente previa registrazione invia il suo annuncio (memorizzato nella tabella annunci) e fare un album fotografico illimitato (le foto sono memorizzate nella tabella foto)

    Vorrei visualizzare gli annunci di 10 in 10 a pagina facendo vedere insieme a ogni annuncio una delle foto in relazione (se c'è). Sono arrivato a questa conclusione:

    Ora questo codice...

    codice:
    <?
    $query = "SELECT * FROM annunci";
    $result = mysql_query($query, $db);
    while($row = mysql_fetch_array($result)){
    echo ($row['titolo'])."
    ";
    echo ($row['annuncio'])."
    ";
    
    
    $foto = "SELECT foto FROM foto WHERE annuncio_id = ".$row[id]." ORDER BY foto_id DESC";
    $res = mysql_query($foto)or die( "Errore: " . mysql_error() );
     if ( mysql_num_rows($res) == 0 ){
       echo "niente immagine";
     }
     else{
       $data = mysql_fetch_object($res);
    
      echo "[img]/foto/".$data[[/img]";
     }	
    
    }
    
    ?>
    ....fà 2 select la prima per gli annunci
    e la seconda è nel ciclo di visualizzazione in modo che per ogni annuncio ci sia l'eventuale foto inserita

    Secondo voi del forum di gran lunga + esperti di me :-) facendo in questo modo rischio di appesantire il sito con queste 11 query a pagina?? o eventualmente c'è un modo + veloce o con una sintassi migliore?? oppure va bene e me stò a fà le cosidette "seghe mentali"??

    Grazie della pazienza se siete arrivati a leggere fin qui. Attendo commenti
    CIAOOO

  2. #2
    Innanzitutto qui c'è un errore:

    $data = mysql_fetch_object($res);

    echo "[img]/foto/".$data[[/img]";


    se in data metti il risultato sottoforma di oggetto, allora devi dopo fare:

    echo "[img]/foto/" .$data -> foto . "[/img]";


    Oppure devi fare:

    $data = mysql_fetch_assoc($res);

    echo "[img]/foto/".$data[[/img]";


    Poi, anziché usare $row = mysql_fetch_array($result)

    che ti restituisce un array sia associativo che numerico puoi usare:

    $row = mysql_fetch_assoc($result) che ti dà solo un array associativo.

    Infine, perché non usi mysqli visto che dà + affidabilità e miglioramento di prestazioni rispetto a mysql?

  3. #3
    Già hai ragione.. l'errore è stata una svista forse causata dall'ora tarda!!!

    usavo anche lì mysql_fetch_array.

    Domandina da pivello:
    Ma in quali situazioni conviene usare assoc, fetch_array o fetch_object??
    Per esempio se devo estrarre un solo record mi conviene fetch_assoc??

    Per mysqli , ho letto che è un'estensione del php 5 però purtroppo sono su hosting aruba che se non sbaglio ha installato php 4.4 e qualcosa..

  4. #4
    Originariamente inviato da lurulu
    Ma in quali situazioni conviene usare assoc, fetch_array o fetch_object??
    Per esempio se devo estrarre un solo record mi conviene fetch_assoc??
    mysql_fetch_assoc() è la stessa cosa che mysql_fetch_array() con MYSQL_ASSOC come secondo parametro opzionale.

    Come ho detto prima se usi mysql_fetch_array($riga) senza specificare il 2° parametro allora ti da un array sia associativo che numerico.
    Se ad es. la tua riga di tabella ha 2 campi: id e nome

    array associativo vuol dire che l'indice dell'array è il nome del campo, quindi $riga['id'] per accedere ad id.

    array numerico vuol dire che l'indice dell'array è la posizione del campo nell'ordine con cui tu li hai letti dal DB. Quindi se la tua select era SELECT id, nome .........

    allora $riga[0] prende il campo id

    Se la tua select fosse stata SELECT nome, id ......... allora $riga[0] identificava il campo nome.

    E' ovvio che se tu usi la dicitura $riga['id'] puoi usare mysql_fetc_assoc oppure mysql_fetch_array($riga, MYSQL_ASSOC)

    in tal modo risparmi memoria e guadagni qualcosina in terrmini di prestazioni.


    fetch_object restituisce un oggetto e la sua gestione è sicuramente + complessa rispetto ad un array. Quindi secondo me conviene sempre mysql_fetch_assoc a meno che non si vuole adottare uno stile di programmazione orientato ad oggetti.

    Stiamo comunque parlando di tempi molto irrisori quindi puoi usare indifferentemente fetch_assoc o fetch_object.


    Per mysqli , ho letto che è un'estensione del php 5 però purtroppo sono su hosting aruba che se non sbaglio ha installato php 4.4 e qualcosa..
    Hai ragione, pazienza! Non ti resta ke aspettare ke arubi aggiorni la versione di php.

  5. #5
    Ho capito gianf_ , grazie 1000 per le delucidazioni.

    Un'ultima cosa ti volevo chiedere:

    Sò che limitare il numero di query è sempre cosa buona e giusta ma c'è un limite di query nelle pagine? Cioè: una decina di query a pagina sono una cosa "normale" per mysql?

    Rallenterebbe un pò l'esecuzione?

    e grazie ancora!

  6. #6
    Dipende sempre dalla quantità di dati presenti nelle tabelle coinvolte nelle query.
    Caso mai il problema sarebbe nella memoria del server che deve visualizzare un certo ammontare di dati e il tempo di esecuzione max di uno script.
    Per intenderci, devi vedere la configurazione in php.ini

    ;;;;;;;;;;;;;;;;;;;
    ; Resource Limits ;
    ;;;;;;;;;;;;;;;;;;;

    max_execution_time = 30 ; Maximum execution time of each script, in seconds
    max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
    memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)


    Se 8M sono pochi puoi sempre aumentare. E' vero che su hosting non lo puoi fare, però puoi sempre provare con il comando ini_set()... non si sa mai.

    Cmq per le ottimizzazioni delle query, se ti scarichi il manuale di MySQL lì ci sono delle dritte.

    Ciao.

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.