• User

    Più record dalla stessa colonna

    Salve a tutti, dopo aver cercato su google in lungo e in largo, e studiato sui testi, non riesco a trovare la soluzione al mio problema, spero mi possiate aiutare. Sto costruendo un sito in cui ho necessità di far ruotare 12 articoli random in altrettante pagine, l'ideale sarebbe che cambiassero ogni giorno, cioè come scatta la mezzanotte, ovviamente evitando di avere risultati duplicati in qualche pagina. Il database è molto semplice, in quando vi sono due colonne, uno con gli id e un altro con gli articoli, che man mano si ingrandisce con l'inserimento di nuovi, la struttura l'ho fatta con gli include.
    Se ho ben capito mysql_fetch_assoc mi ritorna un array associativo e prende massimo un record, mysql_fetch_rows un array numerico e sempre massimo un record e quindi ho deciso di usare mysql_fetch_array. Ho usato while perché da quello che ho capito è la soluzione raccomandata. Vi posto il codice:

    $query = "SELECT articolo FROM sapevi_che ORDER BY RAND () LIMIT 12";
    //Esecuzione della query
    $result = mysql_query( $query );
    if(!$result){
    die ("Non ho potuto interrogare il database: <br />". mysql_error());
    }
    while ($result_row = mysql_fetch_array($result, MYSQL_NUM)){
    echo $result_row[0];
    echo $result_row[1];
    echo $result_row[2];
    echo $result_row[3];
    echo $result_row[4];
    echo $result_row[5];
    echo $result_row[6];
    echo $result_row[7];
    echo $result_row[8];
    echo $result_row[9];
    echo $result_row[10];
    echo $result_row[11];

    Il codice è questo, il primo problema è che i risultati me li da tutti su echo $result_row[0], se ci faccio un eco me li da tutti e 12 mentre se provo con gli altri array non mi restituisce niente, insomma vorrei 12 risultati diversi richiamabili con ogni voce dell'array, dopo questo vorrei cercare di passare i risultati tra le pagine. Vorrei usare una soluzione il più semplice possibile cercando di capire anche. La struttura è tutta impostata con gli include.

    Grazie a tutti anticipatamente :ciaosai:


  • User

    Ragazzi nessuno che mi riesce a dare una mano? Capisco che è un problema forse di non semplice risoluzione, ma anche qualche consiglio per indirizzarmi è ben accetto:bho:


  • User Attivo

    Ciao jak,
    Ci sono due argomenti sui quali voglio risponderti:
    1)Forse non hai capito bene come una query prende i dati... puoi postarmi uno screenshot del tuo database... oppure lo scrivi giù qui graficamente?
    2)Vediamo se ho capito bene. In ogni pagina ci dovrà essere un articolo random, preso da una lista di 12 dal db. Se al posto di cambiare ogni giorno venisse random ogni volta che carichi la pagina andrebbe bene lo stesso?


  • User

    Ciao meis, allora il database l'ho fatto con phpmyadmin ed è semplicissimo, ci sono 2 colonne, una con gli id univoci primary_key e la seconda con gli articoli, il nome della prima colonna è "id" e il nome della seconda colonna è "articolo", non posso postare lo screenshot perché non sono abilitato a farlo.

    1. Si penso che non mi è chiaro bene come prendere più di una riga dalla stessa colonna e poi metterli in un array, in quanto ho capito che la mia soluzione funziona se dovrei prendere più colonne ma sempre una riga alla volta, mentre ora mi da 12 righe tutte nel primo array.
    2. Si hai capito perfettamente, ad ogni pagina ci deve essere un articolo random diverso dall'altro, ma non dovrebbe cambiare ad ogni refresh della pagina perché non deve dare l'idea di una cosa meccanica, meglio sarebbe se riuscissi ad automatizzare il tutto affinché questa randomizzazione avvenga ogni giorno.

  • User Attivo

    Potresti farti una tabella (chiamala, per esempio, "data_articoli") con un campo int ("id", auto_increment)date ("data") e uno int ("id_articolo").
    [PHP]
    $query_long = "SELECT MAX(id) AS highest_id FROM data_articoli";
    $result_long = mysql_fetch_array($query_long);
    $query = "SELECT * FROM data_articoli WHERE id = '".$result_long['highest_id']."'";
    $result = mysql_fetch_array($query);
    if(date(Y-m-d) != $result['data'])
    {
    $query2 = "SELECT * FROM sapevi_che ORDER BY RAND () LIMIT 12";
    while ($result2 = mysql_fetch_array($query2))
    {
    $ids[] = $result2['articolo'];
    }
    $id = mt_rand(0,11);
    mysql_query("INSERT INTO data_articoli VALUES ('', 'date(Y-m-d)', '".$ids[$id]."')");
    $query3 = "SELECT * FROM sapevi_che WHERE id = '".$ids[$id]."'";
    $result3 = mysql_fetch_array($query3);
    echo $result3['articolo'];
    }
    else
    {
    $query2 = "SELECT * FROM sapevi_che WHERE id = '".$result['id_articolo']."'";
    $result2 = mysql_fetch_array($query2);

    echo $result2['articolo'];
    }
    [/PHP]

    Non l'ho testato, ma ti spiego un po' come funziona.
    Le prime quattro righe cercano nella tabella data_articoli la riga con il massimo id, quindi l'ultima inserita, se è auto-increment.
    Se la data collegata a questo record non è di oggi, seleziona un articolo a caso e va ad inserire un nuovo record, poi lo stampa a video, altrimenti stampa a video quello della data di oggi senza ulteriori problemi.
    Probabilmente questo piccolo script potrebbe esistere anche con meno righe di codice, ma l'ho fatto di fretta 😄
    Dimmi se funziona, e se non funziona, dimmi che errori ti dà.
    Ciao!


  • User Attivo

    @jak08 said:

    Se ho ben capito...

    La tua tabella ha 2 campi: id e articolo.
    Con mysql_fetch_array hai il valore di id in $result_row[0] o in $result_row['id'] e il valore articolo in $result_row[1] o in $result_row['articolo']
    Con mysql_fetch_assoc hai il valore id solo in $result_row['id] e il valore articolo solo in $result_row['articolo']

    Chiaro?


  • User

    Meis grazie ma non è proprio la soluzione che cercavo, tigrone fin qua ci siamo e mi è tutto chiaro, mi spiego meglio perché forse non mi sono spiegato bene oppure cerco una soluzione che non si può implementare diciamo abbastanza facilmente, cerco di superare uno scoglio alla volta così almeno capisco anche qualcosa. Il mio problema è al momento uno soltanto, prelevare più record dalla stessa colonna e assegnarci una variabile (array) ad ogni record in modo da poterli visualizzare dove mi servono, in quanto con le soluzioni sopra proposte e anche dalla tua spiegazione ad ogni array viene associato un risultato ma dalle diverse colonne, non dalla stessa. Mi è venuta un'idea, forse dovrei porre il limit della query ad 1 e poi iterare la query per 12 volte operando anche un confronto con il record appena preso in modo che non siano duplicati, se si può fare. Non so se ho detto una c.....a oppure è una soluzione praticabile.

    Grazie a tutti.


  • User Attivo

    @jak08 said:

    tigrone fin qua ci siamo e mi è tutto chiaro...
    Non mi pare visto che, secondo il codice che hai scritto nel post di apertura, si deduce che la tua tabella abbia almeno 12 colonne...
    Evidentemente, come dice meis, non hai capito come si estraggono i dati dal database...
    Forse sarebbe meglio che ti studiassi meglio questa parte altrimenti non capiresti i suggerimenti.
    Senza offesa eh? :wink3: