Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15

Discussione: commento altri profili

  1. #11
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    72
    ciao grazie per l'aiuto che mi stai dando, quindi io che devo fare?, fammi sapere ok?, ciao

  2. #12
    finalmente ci sono riuscito! ho aggiunto un campo alla tabella che si chiama livello e in pratica è un numero progressivo che è uguale a 0 per i post (o commenti principali, come li vuoi chiamare) e aumenta, quindi ad esempio 1 è un figlio di 0 e 2 è un figlio di un e così via..

    Codice PHP:
    <?php 
    require_once('connect-inc.php');
    //userid della bacheca su cui stiamo commentando
    $user_id_bacheca 0;
    //prende tutti i commenti dal database
    $result mysql_query("SELECT * FROM comment WHERE bacheca = '$user_id_bacheca' ORDER BY padre"); 
    while(
    $row mysql_fetch_assoc($result)){
        
    //crea un'array con tutti i contenuti dei commenti che si puo' richiamare dall'id del commento
        
    $content[$row['comment_id']] = $row['content'];
        
    //crea un'array con chiavi progressive che contiene solo gli id dei commenti
        
    $commenti[] = $row['comment_id'];
        
    //crea un'array per determinare il padre di un commento sapendo il suo id
        
    $padre[$row['comment_id']] = $row['padre'];
        
    //se il commento ha come padre -1 e quindi è un post lo aggiunge a un'altra array che verrà usata in seguito per scrivere i commenti
        
    if($row['padre'] == -1){
            
    //array che chiamo main proprio perché contiene solo i commenti principali
            
    $main_array[] = $row['comment_id'];
        }
        
    //crea un'array che permette di ricavare il livello di un commento sapendo il suo id
        
    $livello[$row['comment_id']] = $row['livello'];
    }
    //crea un'array vuota degli id già fatti.. verrà usata in seguito
    $id_fatti = array();
    //per ogni elemento dell'array commenti esegue il codice
    foreach($commenti as $id){
        
    //crea un'array vuota temporanea che conterrà gli id di tutti i "parenti" del commento.. cioè del bisnonno, del nonno, del padre e infine il suo
        
    $temp = array();
        
    //inizia un ciclo infito per determinare tutti i parenti del commento
        
    while(true){
            
    //aggiuge con chiave progressiva all'array temp il valore dell'id che all'inizio è quello del commento stesso ma poi viene cambiato con quello del padre
            
    $temp[] = $id;
            
    //se il padre è -1 vuol dire che si e' arrivati alla fine dell'"albero genealogico" e quindi ferma il ciclo
            
    if($padre[$id] == -1){
                break;
            }else{
                
    //altrimenti l'id da esaminare alla successiva esecuzione diventa quello del padre
                
    $id $padre[$id];
            }
        }
        
    //trova la chiave dell'ultimo "parente", quindi del commento principale che è il padre, il generatore di tutti e viene ricavato per ultimo perché si va all'indietro nel tempo
        
    $max count($temp) - 1;
        
    //per ogni parente prende l'id e..
        
    foreach($temp as $id){
            
    //se non è ancora stato analizzato..
            
    if(!$id_fatti[$id]){
                
    //salva nell'array il messaggio, cioè il contenuto di quel commento.. in seguito sarà possibile richiamarlo conoscendo l'id del commento principale ($temp[$max]) e il suo livello ($livello[$id]) e siccome è una variabile progressiva si potrà usare un foreach per ricavare tutti i messaggi di un certo livello di un certo commento principale
                
    $messaggio[$temp[$max]][$livello[$id]][] = $content[$id];
                
    //aggunge il commento all'array degli id fatti così non lo ripeterà più
                
    $id_fatti[$id] = true;
            }
        }
    }
    /* questa è la parte che dovrà visualizzare i messaggi
    puoi creare delle classi di css diverse per ogni livello diverso oppure evidenziarli come ho fatto io mettendo degli spazi davanti
    */

    //determino il livello massimo prendendo il livello della prima riga ottenuta da questa query (e' il massimo livello perche' li ordino per livello decrescente)
    $maxlevel mysql_result(mysql_query("SELECT livello FROM comment ORDER BY livello DESC"), 0"livello");
    //per ogni commento dell'array main_array (cioe dei commenti principali o post) prende l'id
    foreach($main_array as $id){
        
    //inizia un ciclo che verra' ripetuto per ogni livello da 0 a maxlevel
        
    for($i 0$i <= $maxlevel$i++){
            
    //calcola il numero di spazi da mettere davanti a ogni commento di questo livello
            
    $spazi str_repeat("&emsp;&emsp;"$i);
            
    //siccome il livello massimo e' il massimo di tutti i commenti, ma alcuni post potrebbero fermarsi a livelli piu' bassi, il foreach cerchererbbe di leggere un'array che non esiste e ritornerebbe errore.. con questo if si evita questo inconveniente
            
    if(isset($messaggio[$id][$i])){
                
    //per ogni messaggio appartenente al post principale ($id) e al livello ($i) ricava il testo
                
    foreach($messaggio[$id][$i] as $testo){
                    
    //scrive il testo con davanti gli spazi
                    
    echo $spazi.$testo."
    "
    ;
                }
            }
        }
    }
    ?>
    questo è il codice già commentato. ora ti posto anche il dump di phpmyadmin che contiene già un po' di record così provi a guardarli e capisci meglio come funziona. infine ti metto uno screen di come risulta il tutto a lavoro finito con quei record che vedrai nel dump

    dump MySQL:
    codice:
    -- phpMyAdmin SQL Dump
    -- version 3.3.7
    -- http://www.phpmyadmin.net
    --
    -- Host: localhost
    -- Generato il: 14 lug, 2013 at 01:06 PM
    -- Versione MySQL: 5.1.61
    -- Versione PHP: 5.2.17
    
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    
    --
    -- Database: `u150831342_html`
    --
    
    -- --------------------------------------------------------
    
    --
    -- Struttura della tabella `comment`
    --
    
    CREATE TABLE IF NOT EXISTS `comment` (
      `comment_id` int(5) NOT NULL AUTO_INCREMENT,
      `user_id` int(5) NOT NULL,
      `bacheca` int(5) NOT NULL,
      `content` varchar(255) COLLATE latin1_general_ci NOT NULL,
      `padre` int(5) NOT NULL,
      `livello` int(5) NOT NULL,
      PRIMARY KEY (`comment_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=7 ;
    
    --
    -- Dump dei dati per la tabella `comment`
    --
    
    INSERT INTO `comment` (`comment_id`, `user_id`, `bacheca`, `content`, `padre`, `livello`) VALUES
    (1, 1, 0, 'Commento prova primo', -1, 0),
    (2, 1, 0, 'Commento prova secondo', -1, 0),
    (3, 3, 0, 'Figlio del secondo', 2, 1),
    (4, 1, 0, 'Secondo figlio del secondo', 2, 1),
    (5, 2, 0, 'Figlio del PRIMO', 1, 1),
    (6, 1, 0, 'Nipote del secondo', 4, 2);
    come vedi:
    - comment_id è un auto increment e non ci interessa
    - user_id può cambiare perché non deve per forza essere fisso.. è l'id di chi ha scritto il commento
    - bacheca è sempre uguale perché tutti questi commenti sono stati scritti sullo stesso profilo
    - content puoi capire cosa sia
    - padre è l'id del commento al livello appena sopra, quello a cui abbiamo risposto. se è -1 è un post, non ha commenti sopra di sé
    - livello l'ho spiegato prima

    screen:


    ah un'ultima cosa.. non mi sono mai posto il problema dell'ordine perché con me ha funzionato, cioè i commenti sullo stesso livello appartenenti allo stesso padre sono in ordine cronologico, ma se avrai problemi aggiungi il timestamp quando inserisci nel database e poi li ordini in base a quello crescente.. così puoi anche fare tipo effetto facebook "xx secondi fa"

    spero di esserti stato d'aiuto, se ti serve ancora una mano chiedi.. visto che non frequento molto spesso il forum puoi anche mandarmi una mail, se ti interessa ti mando un messaggio privato ok?
    ciao

  3. #13
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    72
    ciao grazie mille per l'aiuto, si mi interessa lasciami la mail ok?, ho provato ma mi da errore a queste 3 righe:
    Codice PHP:
    if($padre[$id] == -1){ 
    Codice PHP:
    $id $padre[$id]; 
    Codice PHP:
    if(!$id_fatti[$id]){ 
    la pagina l'ho modificata cosi:

    Codice PHP:
    if(isset($_GET['user']) && !empty($_GET['user'])){
    $user=$_GET['user'];
    } else {
    $user=$_SESSION['user_id'];
    }
    $my_id=$_SESSION['user_id'];

    $id_utente getuser($user'id');
    $nome getuser($user'nome');
    $cognome getuser($user'cognome');
    $foto getuser($user'foto');
    $username=getuser($user'username');
    $user_id=getuser($user'user_id'); 
    Codice PHP:
    if(isset($_POST['submit']))
    {
        if(empty(
    $_SESSION['content'] ) ||
          
    strcmp($_SESSION['content'], $_POST['content']) != 0)
        {
            
    //$errors .= "\n The captcha code does not match!";
        
    }
        
        if(empty(
    $errors))
        {
            
    //require_once('connection.php');
             
            
    $content=$_POST['content'];
            
    $commentid=$_POST['commentid'];
            
            
    mysql_query("INSERT INTO comment(user_id, nome, cognome, content, foto, comsubid)VALUES('$my_id', '$nome', '$cognome', '$content', '$foto', '$commentid')");
        }

    Codice PHP:
    //userid della bacheca su cui stiamo commentando 
    $user_id_bacheca = 0; 
    //prende tutti i commenti dal database 
    $result = mysql_query("SELECT * FROM comment WHERE bacheca = '$user_id_bacheca' ORDER BY padre");  
    while($row = mysql_fetch_assoc($result)){ 
        //crea un'array con tutti i contenuti dei commenti che si puo' richiamare dall'id del commento 
        $content[$row['comment_id']] = $row['content']; 
        //crea un'array con chiavi progressive che contiene solo gli id dei commenti 
        $commenti[] = $row['comment_id']; 
        //crea un'array per determinare il padre di un commento sapendo il suo id 
        $padre[$row['comment_id']] = $row['padre']; 
        //se il commento ha come padre -1 e quindi è un post lo aggiunge a un'altra array che verrà usata in seguito per scrivere i commenti 
        if($row['padre'] == -1){ 
            //array che chiamo main proprio perché contiene solo i commenti principali 
            $main_array[] = $row['comment_id']; 
        } 
        //crea un'array che permette di ricavare il livello di un commento sapendo il suo id 
        $livello[$row['comment_id']] = $row['livello']; 

    //crea un'array vuota degli id già fatti.. verrà usata in seguito 
    $id_fatti = array(); 
    //per ogni elemento dell'array commenti esegue il codice 
    foreach($commenti as $id){ 
        //crea un'array vuota temporanea che conterrà gli id di tutti i "parenti" del commento.. cioè del bisnonno, del nonno, del padre e infine il suo 
        $temp = array(); 
        //inizia un ciclo infito per determinare tutti i parenti del commento 
        while(true){ 
            //aggiuge con chiave progressiva all'array temp il valore dell'id che all'inizio è quello del commento stesso ma poi viene cambiato con quello del padre 
            $temp[] = $id; 
            //se il padre è -1 vuol dire che si e' arrivati alla fine dell'"albero genealogico" e quindi ferma il ciclo 
            if($padre[$id] == -1){ 
                break; 
            }else{ 
                //altrimenti l'id da esaminare alla successiva esecuzione diventa quello del padre 
                $id = $padre[$id]; 
            } 
        } 
        //trova la chiave dell'ultimo "parente", quindi del commento principale che è il padre, il generatore di tutti e viene ricavato per ultimo perché si va all'indietro nel tempo 
        $max = count($temp) - 1; 
        //per ogni parente prende l'id e.. 
        foreach($temp as $id){ 
            //se non è ancora stato analizzato.. 
            if(!$id_fatti[$id]){ 
                //salva nell'array il messaggio, cioè il contenuto di quel commento.. in seguito sarà possibile richiamarlo conoscendo l'id del commento principale ($temp[$max]) e il suo livello ($livello[$id]) e siccome è una variabile progressiva si potrà usare un foreach per ricavare tutti i messaggi di un certo livello di un certo commento principale 
                $messaggio[$temp[$max]][$livello[$id]][] = $content[$id]; 
                //aggunge il commento all'array degli id fatti così non lo ripeterà più 
                $id_fatti[$id] = true; 
            } 
        } 

    /* questa è la parte che dovrà visualizzare i messaggi 
    puoi creare delle classi di css diverse per ogni livello diverso oppure evidenziarli come ho fatto io mettendo degli spazi davanti 
    */ 

    //determino il livello massimo prendendo il livello della prima riga ottenuta da questa query (e' il massimo livello perche' li ordino per livello decrescente) 
    $maxlevel = mysql_result(mysql_query("SELECT livello FROM comment ORDER BY livello DESC"), 0, "livello"); 
    //per ogni commento dell'array main_array (cioe dei commenti principali o post) prende l'id 
    foreach($main_array as $id){ 
        //inizia un ciclo che verra' ripetuto per ogni livello da 0 a maxlevel 
        for($i = 0; $i <= $maxlevel; $i++){ 
            //calcola il numero di spazi da mettere davanti a ogni commento di questo livello 
            $spazi = str_repeat("&emsp;&emsp;", $i); 
            //siccome il livello massimo e' il massimo di tutti i commenti, ma alcuni post potrebbero fermarsi a livelli piu' bassi, il foreach cerchererbbe di leggere un'array che non esiste e ritornerebbe errore.. con questo if si evita questo inconveniente 
            if(isset($messaggio[$id][$i])){ 
                //per ogni messaggio appartenente al post principale ($id) e al livello ($i) ricava il testo 
                foreach($messaggio[$id][$i] as $testo){ 
                    //scrive il testo con davanti gli spazi 
                    echo $spazi.$testo."
    "; 
                } 
            } 
        } 
    }
    ?>
    <div class="clearfix"></div>
    </div>






    <a id="link1">
    <form method="POST" name="" 
    action="profile2.php"> 
    <table width="332" border="0" align="center">
      <tr>
        <td width="265">
            <ul>
            <?php
            
    if(!empty($errors)){
            echo 
    "<li class='err'>".($errors)."";
            }
            
            
    ?>
            [/list]    </td>
        <td width="57"></td>
      </tr>
       <tr>
        <td colspan="2">
            <input type="hidden" name="nome" value="<?php echo $nome?>" />
            <input type="hidden" name="cognome" value="<?php echo $cognome?>" />
            <input name="commentid" type="hidden" value="<?php echo $_GET['id'?>">
            Content:

            <textarea name="content" style="width: 316px;"></textarea>
        </td>
       </tr>
        <tr>
        <td colspan="2"><input type="submit" value="Submit" name='submit'></td>
        </tr>
    </table>
    </form>
    dove ho sbagliato? fammi sapere ok?, ciao grazie

  4. #14
    io ho provato con il tuo stesso codice e non ho problemi.. controlla di aver messo il <? all'inizio perché nel codice non l'avevi messo.. e mancava anche la connessione al database
    http://www.youtube.com/user/alekosfilini @afilini

  5. #15
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    72
    Ciao si li ho messi,ti invio tramite mail la pagina php? 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 © 2026 vBulletin Solutions, Inc. All rights reserved.