Avatar billede doncarnage Nybegynder
29. maj 2009 - 23:48 Der er 36 kommentarer og
1 løsning

Kommentar-system med indrykkede svar?

Godaften..

Jeg er i gang med en side, hvor jeg har kodet et simpelt blogsystem, hvor du kan oprette blogs og de forskellige brugere kan skrive en kommentar til bloggen..

Mit spørgsmål lyder så på hvordan jeg bygger videre på kommentarsystemet, så man kan svare hver enkelt kommentar og se hvilke, der er i relation til hinanden?

Jeg har forsøgt at illustrere det vha. dette billede:
http://www.valuable.dk/kommentarsystem.jpg

Findes der nogle gode artikler på nettet til hvordan jeg gør dette eller er der nogle kloge hoveder herinde, der kan hjælpe mig godt på vej ;) ?
Avatar billede fant0mas Nybegynder
30. maj 2009 - 00:10 #1
Du kan jo tage udgangspunkt i denne:
http://explosif.dk/crap/simple_forum.rar

Der skulle være alt du har brug for.
Ellers så spørg.
Avatar billede fant0mas Nybegynder
30. maj 2009 - 00:13 #2
Avatar billede doncarnage Nybegynder
30. maj 2009 - 21:02 #3
Har prøvet at udpakke det og smide data ind i databasen, men når jeg prøver at åbne siden får jeg bare følgende fejl:

Unknown column 't.username' in 'field list'

Er lige kommet hjem fra arbejdet, så er for kvæstet til at kunne overskue hvad der er galt i koden ligenu, men prøver at kigge på det en anden dag, medmindre du kan se at der er et eller andet galt :)
Avatar billede fant0mas Nybegynder
31. maj 2009 - 00:20 #4
bare opret kolonnen username i tabellen thread i phpmyadmin
Avatar billede tjaz Nybegynder
01. juni 2009 - 15:17 #5
Det drejer i alt sin enkelthed om at du har 3 felter din DB.

id, parentid og tekst

Når du vil trække dem ud laver du en incremental løkke.

select * from <table> where (parentid IS NULL OR parentid = 0)

når du gennemløber dem, laver du en function, som gør nogenlunde det samme

select * from <table> where parentid = rootmsg.id

de beskeder du så finder her, smider du igennem samme funktion, så bliver den ved indtil der ikke er flere beskeder.

det kræver lidt ekstra arbejde for at få det med # (numre) til at virke ordenligt, for som jeg umiddelbart ser det, så vil rækkefølgen på det som fant0mas skriver altid være #1, #2, #3 osv... hvilket jo ikke nødvendigvis er den rækkefølge som indlæg er skrevet i, da nummer #3 indlæg jo godt kunne være et svar på indlæg #1, og så ville rækkefølgen jo være #1, #3, #2

håber du kan bruge det til noget.
Avatar billede fant0mas Nybegynder
01. juni 2009 - 19:58 #6
tjaz, rækkefølgen er korrekt. -Og nested query's er absolut ikke det man ønsker. Den eneste metode der måske preformer lidt bedre er left/right, men det synes jeg personligt er noget rod.
Avatar billede doncarnage Nybegynder
02. juni 2009 - 00:10 #7
fant0mas - har du meget styr på scriptet?

Jeg har ændret lidt i scriptet og fået det til at virke nogenlunde efter hensigten, men når jeg prøver at implementere det på siden driller det lidt :/

Det virker meget mystisk i mine øjne.. Når jeg opretter kommentarer bliver de godt nok smidt i databasen med de fornødne oplysninger.. Men det er kun kommentarerne med parent_id 0, der bliver vist under hver blog.. Dvs. de kommentarer, der er svar til andre kommentarer bliver ikke vist af en eller anden underlig grund :| Men hvis jeg smider dataen fra zip filen ind i databasen bliver de vist og der fungerer det som det skal - men hvordan i al verden kan det være :S Dataen er jo ens..

Har lige taget et billede af databasen:
http://www.valuable.dk/data.jpg

Her er det altså kun kommentarer+svar, der bliver vist til blog med blog_id 1, mens det ved blog 51 kun er kommentarerne med parent_id 0, som bliver vist.. Når man svarer til en kommentar i eksempelvis blog 51, skriver den heller ikke at man besvarer kommentar XX :S

Du skulle vel ikke vide hvad det skyldes?

Jeg kan lige plukke koden ud fra filerne:

--------------------------------------------------------------
_thread.php
--------------------------------------------------------------
<?php
class thread
{   
    public $aCommentId = array(0);
    public $aThread = array();
   

    public function getThreadHTML($aThread, $nLevel=0, $childCount=0) {
        $aRet = array('<ul>');
        if(count($aThread)){
        for ($i=0; $i<count($aThread[$nLevel]); $i++) {
            $style = '';
            if($aThread[$nLevel][$i]->isChild > 0) $style = 'angle';
            if($childCount > 1) $style = 'line_angle';
           
                $id    = $aThread[$nLevel][$i]->id;       
                $no = $aThread[$nLevel][$i]->no;     
           
                $aRet[] = sprintf('
            <li class="%1$s">
                <a id="%5$d" />
                <div class="message">
                    <a href="#%5$d">#%2$d</a> - <a href="?id='.$_GET['id'].'&replyTo=%2$d#reply">Svar</a>
                    <br /><strong>%3$s</strong>
                    <br />%4$s
                </div>', $style, $no, $aThread[$nLevel][$i]->author, $aThread[$nLevel][$i]->text, $id);
           
            $childCount--;
            if (isset($aThread[$id]) && is_array($aThread[$id])) {
                $aRet[] = $this->getThreadHTML($aThread, $id, $aThread[$nLevel][$i]->childCount).'</li>';
            }
            else $aRet[] = '</li>';
        }
        }
            return implode('', $aRet).'</ul>';
    }
    public function getThread($id) {
        global $mysqli;
        $sql = sprintf("SELECT t.id, t.parent_id, t.author, t.text, t.time, count(t2.parent_id) as childCount, count(t3.id) as isChild
                            FROM blogs_comments AS t
                LEFT JOIN blogs_comments AS t2 ON (t.id=t2.parent_id)
                            AND t2.blog_id = t.blog_id
                LEFT JOIN blogs_comments AS t3 ON (t3.id=t.parent_id)
                        WHERE t.blog_id = '".$_GET['id']."'
                    GROUP BY t.id",$id);
                   
        if($result = $mysqli->query($sql)){
            $i = 1;
            while ($row = $result->fetch_object()) {
                $row->no = $i++;
                $this->aCommentId[] = $row->id;   
                if (isset($this->aThread[$row->parent_id]) && !is_array($this->aThread[$row->parent_id])) $this->aThread[$row->parent_id] = array();
                $this->aThread[$row->parent_id][] = $row;
            }
        }else{
            die($mysqli->error);
        }
    return $this->aThread;
    }
    function insertReply($forumID, $replyID, $username, $text){
        global $mysqli;
        $sql = "INSERT INTO blogs_comments (parent_id, blog_id, author, text, time) VALUES (?, ?, ?, ?, NOW())";
        if($stmt = $mysqli->prepare($sql)){
            $stmt->bind_param('iiss', $replyID, $forumID, $username, $text);
            $stmt->execute();
            return $stmt->insert_id;
        }else{
            return $mysqli->error;   
        }
        //return true;
    }
    function insertTopic($name){
       
        $sql = mysql_query(sprintf("INSERT INTO topic (name, createdTS) VALUES (%s, %s)", mysql_real_escape_string($name), getdate()));
    }
}
?>


--------------------------------------------------------------
blogs.display.php
--------------------------------------------------------------

<?php
$mysqli = new mysqli('localhost', 'root', '', 'mindatabaseher');

if(!isset($_GET['forumID'])){
$_GET['forumID'] = 1;
}

include_once '_thread.php';
       
$thread = new thread();
$res = $thread->getThread($_GET['forumID']);
       
if(isset($_POST['reply']) && in_array($_GET['replyID'], $thread->aCommentId)){
$replyID = $thread->insertReply($_POST['forumID'], $_POST['replyID'], $_POST['name'], $_POST['text']);
if(is_numeric($replyID)){
header("Location: blogs.display.php?id=".$_GET['id']."");
}
}
if(isset($_POST['topic'])){
$threadId = $thread->insertTopic();
if(is_numeric($threadId)){
header("Location: blogs.display.php?id=".$_GET['id']."");
}
}
?>

<?php echo '<div class="contain">'.$thread->getThreadHTML($res).'</div>'; ?>

<?php

echo '<form method="post" action="">';
           
if(isset($_GET['replyTo']) && $_GET['replyTo'] && in_array($_GET['replyTo'], $thread->aCommentId)){
echo 'Svar til #'.$_GET['replyTo'].' | <a href=blogs.display.php?id='.$_GET['id'].'>Cancel</a>';
}
               
echo '<input type="hidden" name="reply" value="1" />';
echo '<input type="hidden" name="forumID" value="'.$_GET['id'].'">';
echo '<input type="hidden" name="replyID" value="'.$_GET['replyTo'].'">';
echo '<input class="inputText" type="text" name="name" value="" /><br />';
echo '<textarea name="text">
?>
Avatar billede doncarnage Nybegynder
02. juni 2009 - 01:13 #8
Har lige testet videre og hvis jeg prøver at skrive en kommentar til blog med id 1 som ikke er svar til andre kommentarer, så kan jeg heller ikke læse de svar jeg skriver til den :| Det er satme mystisk for det er præcis det samme, der står i databasen med undtagelse af id af kommentaren, hvilket jo er irrellevant :S
Avatar billede doncarnage Nybegynder
02. juni 2009 - 01:23 #9
Okay, det ser ud til at jeg har fundet problemet nu. Id på kommentarerne er alligevel relevante, hvilket jeg ikke først antog. Hvis id ikke følger hinanden (dvs. 1,2,3,4,5 osv) så vises de ikke.. dvs. hvis en kommentar har id 9 og der er 5 kommentarer til bloggen, så vises kommentarerne til id 9 ikke..

Men hvordan løser jeg dette, for der vil jo unægteligt komme et spring i kommentarernes id i og med de ligger sig til forskellige blogs?

Den eneste løsning jeg kan komme på er at jeg opretter en ny tabel i databasen til hver enkelt blog, men det synes jeg alligevel er en lidt kringlet og træls løsning :/
Avatar billede fant0mas Nybegynder
02. juni 2009 - 07:56 #10
Jeg tager lige et kig på det i aften, id'et burde være irelevant.
Men sletter man en kommentar med svar er det klart at svarene ikke stadig vises. Men jeg har nyeligt brugt det, og husker ikke jeg havde nogle problemer med det - det kører i hvert fald endnu.

Passer dit blogid?
Avatar billede doncarnage Nybegynder
02. juni 2009 - 12:01 #11
Super - det ville jeg sætte pris på.. Jeg synes også selv det virker utrolig mystisk, og jeg ville også selv umiddelbart mene at id'et var irellevant :|

Ja naturligvis.. men jeg har ikke slettet nogle kommentarer med svar, så det er ikke der problemet ligger desværre.. Blog_id passer helt fint ja ;)
Avatar billede doncarnage Nybegynder
02. juni 2009 - 12:59 #12
Jeg afprøvede lige scriptet igen her tidligere uden at have rettet i det og nu kan jeg slet ikke oprette kommentarer længere :S Jeg har prøvet at ændre i scriptet og fjerne de ting som jeg ikke bruger osv, men kan slet ikke få gang i det... Håber du kan overskue det for jeg kan godt nok ikke :(

Sådan ser mine to filer ud nu:

--------------------------------------------------------------
_thread.php
--------------------------------------------------------------

<?php
class thread
{   
    public $aCommentId = array(0);
    public $aThread = array();
   

    public function getThreadHTML($aThread, $nLevel=0, $childCount=0) {
        $aRet = array('<ul>');
        if(count($aThread)){
        for ($i=0; $i<count($aThread[$nLevel]); $i++) {
            $style = '';
            if($aThread[$nLevel][$i]->isChild > 0) $style = 'angle';
            if($childCount > 1) $style = 'line_angle';
           
                $id    = $aThread[$nLevel][$i]->id;       
                $no = $aThread[$nLevel][$i]->no;     
           
                $aRet[] = sprintf('
            <li class="%1$s">
                <div class="message">
                    <div class="kommentaroverskrift">
                    <a href="#%5$d">#%2$d</a>
                    </div>
                    <div class="kommentardato">%4$d</div>
                    <br /><br />%4$s<br /><br />
                    <div class="kommentarforfatter">Forfatter</div>
                    <div class="kommentarsvar">
                    <a href="?id='.$_GET['id'].'&replyTo=%2$d#reply">
                      <img src="images/buttonsvar.png" alt="" border="0" />
                    </a>                   
                    </div>
                </div>', $style, $no, $aThread[$nLevel][$i]->author, $aThread[$nLevel][$i]->text, $id);
           
            $childCount--;
            if (isset($aThread[$id]) && is_array($aThread[$id])) {
                $aRet[] = $this->getThreadHTML($aThread, $id, $aThread[$nLevel][$i]->childCount).'</li>';
            }
            else $aRet[] = '</li>';
        }
        }
            return implode('', $aRet).'</ul>';
    }
    public function getThread($id) {
        global $mysqli;
        $sql = sprintf("SELECT t.id, t.parent_id, t.author, t.text, t.time, count(t2.parent_id) as childCount, count(t3.id) as isChild
                            FROM blogs_comments AS t
                LEFT JOIN blogs_comments AS t2 ON (t.id=t2.parent_id)
                            AND t2.blog_id = t.blog_id
                LEFT JOIN blogs_comments AS t3 ON (t3.id=t.parent_id)
                        WHERE t.blog_id = '".$_GET['id']."'
                    GROUP BY t.id",$id);
                   
        if($result = $mysqli->query($sql)){
            $i = 1;
            while ($row = $result->fetch_object()) {
                $row->no = $i++;
                $this->aCommentId[] = $row->id;   
                if (isset($this->aThread[$row->parent_id]) && !is_array($this->aThread[$row->parent_id])) $this->aThread[$row->parent_id] = array();
                $this->aThread[$row->parent_id][] = $row;
            }
        }else{
            die($mysqli->error);
        }
    return $this->aThread;
    }
    function insertReply($replyID, $id, $author, $text){
        global $mysqli;
        $sql = "INSERT INTO blogs_comments (parent_id, blog_id, author, text, time) VALUES (?, ?, ?, ?, NOW())";
        if($stmt = $mysqli->prepare($sql)){
            $stmt->bind_param('iiss', $replyID, $id, $author, $text);
            $stmt->execute();
            return $stmt->insert_id;
        }else{
            return $mysqli->error;   
        }
        //return true;
    }
}
?>


--------------------------------------------------------------
blogs.display.php
--------------------------------------------------------------

TOPPEN AF SIDEN:

<?php
$mysqli = new mysqli('localhost', 'root', '', 'mindatabase');

include_once '_thread.php';

$thread = new thread();
$res = $thread->getThread($_GET['id']);

if(isset($_POST['reply']) && in_array($_GET['replyID'], $thread->aCommentId)){
    $replyID = $thread->insertReply($_POST['id'], $_POST['replyID'], $_POST['name'], $_POST['text']);
    if(is_numeric($replyID)){
        header("Location: blogs.display.php?id=".$_GET['id']."");
    }
}
?>


KOMMENTARERNE:

<?php echo '<div class="contain">'.$thread->getThreadHTML($res).'</div>'; ?>


SKRIV KOMMENTAR:

<?php

echo '<form method="post" action="">';
           
if(isset($_GET['replyTo']) && $_GET['replyTo'] && in_array($_GET['replyTo'], $thread->aCommentId)){
echo 'Svar til #'.$_GET['replyTo'].' | <a href=blogs.display.php?id='.$_GET['id'].'>Fortryd</a><br />';
}

echo '<input type="hidden" name="reply" value="1" />';
echo '<input type="hidden" name="username" value="'.$_SESSION['USERNAME'].'">';
echo '<input type="hidden" name="id" value="'.$_GET['id'].'">';
echo '<input type="hidden" name="replyID" value="'.$_GET['replyTo'].'">';
echo '<textarea name="text" rows="10" cols="62" class="input3">
Avatar billede fant0mas Nybegynder
02. juni 2009 - 20:42 #13
Dit eksempel, og det kører her. Så kan du skifte id (blog_id) når du skal teste flere tråde.

http://explosif.dk/crap/asd.rar
Avatar billede doncarnage Nybegynder
02. juni 2009 - 21:32 #14
Se nu begyndte det at ligne noget igen ;) Fantastisk.. Har bare lige tre spørgsmål/rettelser nu:

1) Når jeg trykker på kommentarerens svar (fx #3) oppe i venstre hjørne kører den ikke ned til den kommentar som den gjorde før.. Hvordan kan det være - synes ikke lige jeg kan se de store ændringer på det punkt nemlig :S

2) Når man trykker på svar knappen til en kommentar udskriver den: "Svar til #XX | Fortryd".. Men her udskriver den det id som kommentaren har i tabellen. Dvs. hvis kommentaren har id 87 udskriver den det, selvom den måske står som #5 i bloggen.. Kan man ændre på det, så den i stedet udskriver #5 :o ?

3) Til sidst har jeg gjort sådan at den udskriver min dato ved at smide en ekstra række ind i sprintf( funktionen og her udskrives datoen så vha. %7$s.. Men det den udskriver er fx: "2009-06-02 21:28:11".. Er det muligt at få den til i stedet at udskrive: "02.06.2009 21:28" ? Altså hvor den vender om på rækkefølgen og fjerner sekunderne.. Jeg ved at man kan gøre det i en ganske normal sql query vha. "DATE_FORMAT(time, '%d.%m.%Y kl. %H:%i')", men er ikke helt sikker på hvordan jeg gør det med dette script, da det er noget mere avanceret kodning end jeg førhen har beskæftiget mig med :)
Avatar billede fant0mas Nybegynder
02. juni 2009 - 22:32 #15
Så er det rettet. Jeg ved ikke helt hvad jeg skal sige til det, men det er nok for meget på én gang at forstå, når der er så meget nyt for dig. De 2 første var smårettelser (der manglede et ancor i bunden af siden). Og 2'eren var der byttet om på nogle variabler  Og den 3. skal bruge double-% for at escape i sprintf. Ellers fortolkes det som et argument.
Men er der noget, så skyd løs. Der er kun dumme svar.
Avatar billede fant0mas Nybegynder
02. juni 2009 - 22:36 #16
Og det lyder som om du har fanget, at %d = decimal tal %s = streng.
Dvs.
%2$d = argument 2 som er et tal

Man kan bare skrive %d blabla %s, men så skal rækkefølgen på argumenterne være korrekt, og værdier kan ikke genbruges.
Avatar billede doncarnage Nybegynder
02. juni 2009 - 23:36 #17
Yearh okay.. Kunne godt følge dig i at der var byttet om på lidt variabler og at den nye querystring giver det rigtige svar id ;) Men mht. ancor synes jeg ikke rigtig jeg ka få det til at virke når man trykker på id (Det virker dog fint nok når man trykker på svar knapperne).. Kan du spotte fejlen der?

Hvordan tilføjer jeg desuden et ekstra felt i databasen til hhv. userid (skal bare hentes fra en session ligesom blog_id), samt ip adressen (ska bare hentes på normalvis)? Jeg har prøvet at tilføje lidt variabler til insertReply funktionen og indsætte parametre, men kan ikke rigtig få det til at virke efter hensigten :S

Her er oversigten over hvordan mine to sider ser ud nu, hvor scriptet virker efter hensigten (dog hvor de ekstra felter ikke er tilføjet)..

--------------------------------------------------------------
_thread.php
--------------------------------------------------------------

<?php
class thread

    public $aCommentId = array(0);
    public $aThread = array();
 

    public function getThreadHTML($aThread, $nLevel=0, $childCount=0) {
        $aRet = array('<ul>');
        if(count($aThread)){
        for ($i=0; $i<count($aThread[$nLevel]); $i++) {
            $style = '';
            if($aThread[$nLevel][$i]->isChild > 0) $style = 'angle';
            if($childCount > 1) $style = 'line_angle';
         
                $id    = $aThread[$nLevel][$i]->id;     
                $no = $aThread[$nLevel][$i]->no;   
         
                $aRet[] = sprintf('
            <li class="%1$s">
                <div class="message">
                    <div class="kommentaroverskrift">
                    <a href="#%2$d">#%2$d</a>
                    </div>
                    <div class="kommentardato">%7$s</div>
                    <br /><br />%4$s<br /><br />
                    <div class="kommentarforfatter">
                    <a href="profil.php?id=USERIDHER" class="alternative">%3$s</a></div>
                    <div class="kommentarsvar">
                    <a href="?id=%6$d&replyTo=%5$d&no=%2$d#reply">
                      <img src="images/buttonsvar.png" alt="" border="0" />
                    </a>                 
                    </div>
                </div>', $style, $no, $aThread[$nLevel][$i]->author, $aThread[$nLevel][$i]->text, $id, $aThread[$nLevel][$i]->blog_id, $aThread[$nLevel][$i]->time);
         
            $childCount--;
            if (isset($aThread[$id]) && is_array($aThread[$id])) {
                $aRet[] = $this->getThreadHTML($aThread, $id, $aThread[$nLevel][$i]->childCount).'</li>';
            }
            else $aRet[] = '</li>';
        }
        }
            return implode('', $aRet).'</ul>';
    }
    public function getThread($id) {
        global $mysqli;
      $sql = sprintf("SELECT t.id, t.parent_id, t.author, t.text, DATE_FORMAT(t.time, '%%d.%%m.%%Y kl. %%H:%%i') as time, count(t2.parent_id) as childCount, count(t3.id) as isChild, t.blog_id
                            FROM blogs_comments AS t
                LEFT JOIN blogs_comments AS t2 ON (t.id=t2.parent_id)
                            AND t2.blog_id = t.blog_id
                LEFT JOIN blogs_comments AS t3 ON (t3.id=t.parent_id)
                        WHERE t.blog_id = '%d'
                    GROUP BY t.id",$id);
                 
        if($result = $mysqli->query($sql)){
            $i = 1;
            while ($row = $result->fetch_object()) {
                $row->no = $i++;
                $this->aCommentId[] = $row->id; 
                if (isset($this->aThread[$row->parent_id]) && !is_array($this->aThread[$row->parent_id])) $this->aThread[$row->parent_id] = array();
                $this->aThread[$row->parent_id][] = $row;
            }
        }else{
            die($mysqli->error);
        }
    return $this->aThread;
    }
    function insertReply($replyID, $id, $author, $text){
        global $mysqli;
        $sql = "INSERT INTO blogs_comments (parent_id, blog_id, author, text, time) VALUES (?, ?, ?, ?, NOW())";
        if($stmt = $mysqli->prepare($sql)){
            $stmt->bind_param('iiss', $replyID, $id, $author, $text);
            $stmt->execute();
            return $stmt->insert_id;
        }else{
            return $mysqli->error; 
        }
        //return true;
    }
}
?>


--------------------------------------------------------------
blogs.display.php
--------------------------------------------------------------

/////////// TOPPEN AF SIDEN ///////////

<?php
session_start();
?>
<?php
$mysqli = new mysqli('localhost', 'root', '', 'mindatabase');
include_once '_thread.php';

$thread = new thread();
$res = $thread->getThread($_GET['id']);

if(isset($_POST['reply'])){
    $replyID = $thread->insertReply($_POST['replyID'], $_POST['id'], $_POST['username'], $_POST['text']);
    if(is_numeric($replyID)){
        header("Location: blogs.display.php?id=".$_GET['id']."");
    }
}
?>


/////////// KOMMENTARERNE ///////////

<?php echo '<div class="containcomments">'.$thread->getThreadHTML($res).'</div>'; ?>


/////////// SKRIV KOMMENTAR HERUNDER ///////////

<a id="reply"></a>
<?php
echo '<form method="post" action="">';
       
if(isset($_GET['no']) && $_GET['replyTo'] > 0){
echo ' Svar til #'.$_GET['no'].' | <a href=blogs.display.php?id='.$_GET['id'].' class="alternative">Fortryd</a><br /><br />';
}else{
$_GET['replyTo'] = 0;
}
       
echo '<input type="hidden" name="reply" value="1" />';
echo '<input type="hidden" name="userid" value="'.$_SESSION['SESS_MEMBER_ID'].'">';
echo '<input type="hidden" name="username" value="'.$_SESSION['SESS_USERNAME'].'">';
echo '<input type="hidden" name="id" value="'.$_GET['id'].'">';
echo '<input type="hidden" name="replyID" value="'.$_GET['replyTo'].'">';
echo '<textarea name="text" rows="10" cols="62" class="input3">

?>
Avatar billede doncarnage Nybegynder
03. juni 2009 - 00:19 #18
Er det i øvrigt en kæmpe omvæltning at omprogrammere det så man ikke benytter sig af new mysqli, men i stedet bare den "normale" metode til at forbinde til databasen på? Det fungerer fint på localhost, men mit webhotel understøtter nemlig ikke denne metode :)

Jeg plejer bare at oprette forbindelse til databasen ved at include en seperat fil med følgende informationer:

<?php
$cfg['mysql']['host']    = 'localhost';
$cfg['mysql']['username'] = 'root';
$cfg['mysql']['password'] = '';
$cfg['mysql']['database'] = 'databasen';

mysql_connect($cfg['mysql']['host'],$cfg['mysql']['username'],$cfg['mysql']['password']);
mysql_select_db($cfg['mysql']['database']);
?>

Det er ikke noget jeg "forlanger" at du laver for mig heh.. Men vil bare gerne vide om det er et kæmpe projekt med at få det lavet om? Scriptet er såvidt jeg kan se meget objektorienteret, hvilket vel også er en god ting. Jeg er dog meget ny indenfor dette og det er også derfor jeg har svært ved at løse problemerne selv uden hjælp :S
Avatar billede doncarnage Nybegynder
03. juni 2009 - 00:36 #19
Og i forlængelse af det jeg skrev i forrige kommentar.. Er det et kæmpe projekt at omprogrammere det, så det ikke er "objektorienteret" og så jeg lettere selv kan vedligeholde det ;) ?
Avatar billede fant0mas Nybegynder
03. juni 2009 - 00:54 #20
Du kan jo passende sætte userid'et ind i stedet for author, og så joine på din bruger tabel - også i getThread funktionen.
Nu aner jeg jo ikke hvad tabellerne hedder, men det er noget med:

      $sql = sprintf("SELECT t.id, t.parent_id, u.author, t.text, DATE_FORMAT(t.time, '%%d.%%m.%%Y kl. %%H:%%i') as time, count(t2.parent_id) as childCount, count(t3.id) as isChild, t.blog_id
                            FROM blogs_comments AS t
                INNER JOIN users u ON u.id = t.author_id
                LEFT JOIN blogs_comments AS t2 ON (t.id=t2.parent_id)
                            AND t2.blog_id = t.blog_id
                LEFT JOIN blogs_comments AS t3 ON (t3.id=t.parent_id)
                        WHERE t.blog_id = '%d'
                    GROUP BY t.id",$id);

Der skal u.author så være navne feltet i bruger tabellen (her users)
users skal byttes til navnet på din bruger tabel
t.author_id = bruger id'et i blogs_comments (før author)
Navnet ligger så i:
$aThread[$nLevel][$i]->author i getThreadHTML funktionen. Den skal du også huske at omdøbe.

INNER JOIN (det nye i din query) kræver at der findes en bruger med id matchende det i blogs_comments, ellers vil den springe kommentaren over.

LEFT JOIN er ligeglad med om der er en bruger med det id, og kan bruges hvis der ikke nødvendigvis er et brugerid tilknyttet en kommentar.
Avatar billede fant0mas Nybegynder
03. juni 2009 - 01:03 #21
Nej, det er en smal sag. Som det er der, er det faktisk næsten intet OOP over det. Vi kan se på det i morgen, det er også federe for dig at og få forståelsen først, så kan du altid gøre det mere avanceret senere.

Det kan også snilt køre uden mysqli klassen, men den er bare så fantastisk lækker - og en del nemmere at kode sikkert i.
Avatar billede doncarnage Nybegynder
03. juni 2009 - 13:22 #22
Det var ikke lige sådan jeg havde tænkt :D Jeg vil nemlig både gerne ha smidt username (author) og userid i tabellen.. Og mine userid er på samme måde som username gemt i en session, så det er bare et spørgsmål om at tilføje en ekstra række.. Men jeg prøver mig lidt frem ;)

Ja lige præcis.. Jeg vil meget hellere have det forholdsvist simpelt fra bunden af og så kan man altid bygge videre på det jo :D For det er begrænset hvor meget man lærer af det når man ikke har set noget af den slags kode før =)
Avatar billede doncarnage Nybegynder
03. juni 2009 - 13:32 #23
Har fået fikset det med en ekstra tabel nu.. Det var fordi jeg lige havde overset den øverste linje i blogs.display ;)

Så mangler jeg bare at få den ancor til at virke igen, men det vil jeg kigge mere på nu..

Men hvis du har nogle gode idéer/foreslag til hvordan jeg får det omprogrammeret på en forholdsvis simpel måde og sådan som jeg plejer at gøre det, så må du meget gerne skrive det her ;)
Avatar billede fant0mas Nybegynder
03. juni 2009 - 15:55 #24
Jeg ville bruge inner join der, der er ingen grund til at have den samme data stående flere steder - en reference til id'et er nok.
Avatar billede doncarnage Nybegynder
03. juni 2009 - 16:27 #25
Det kan jeg også sagtens følge dig i for at undgå redundans i databasen, men nu prøver jeg mig bare frem med de midler jeg kender til og så må jeg senere hen prøve at "forbedre" kodningen ;)

Det går da også fremad nu.. Eneste jeg faktisk "bare" mangler er at få mit "indbakke/svar" system bikset færdigt til hver enkelt bruger, men det skrider fremad..

Er dog stadig meget interesseret i at vide om man kan omprogrammere det hele som jeg tidligere var inde på? For jeg går ud fra at det er de færreste webhoteller, der understøtter det eller? Jeg bruger i hvert fald web10, og der fungerede det nemlig ikke selvom det gjorde på localhost :S
Avatar billede doncarnage Nybegynder
03. juni 2009 - 21:18 #26
Og lige et mere spørgsmål på falderebet (gal du må være træt af mig :D).. Ved dog ikke helt om jeg kan formulere det ordenligt, så du ved hvad jeg mener - men jeg prøver..

Nu er jeg mere eller mindre blevet færdig med kommentarsystemet, hvor hver enkelt profil bl.a. kan finde en oversigt over de kommentarer, der er svaret til deres kommentarer eller blogs.. Her mangler jeg så blot at få "ulæst/læst" til at virke.. Jeg har oprettet en række i tabellen ved navn "seen", hvor 0 = ulæst, og 1 = læst..

Men hvordan jeg laver en if sætning, der går ind og spørger på om den pågældende kommentar er blevet læst af brugeren med fx 4 som brugerid?

Dvs. hvis man fx åbner blogs.display.php?id=33#142 og kommentaren (med id 142) er skrevet som et svar til den pågældende bruger? Så skal den nemlig ændre "seen" i min blogs_comments tabel til 1 fremfor 0 (ulæst). I tabellen har jeg userid liggende på personen som kommentaren henvender sig til og det burde derfor nok være muligt.. spørgsmålet er bare hvordan :S
Avatar billede doncarnage Nybegynder
04. juni 2009 - 16:17 #27
Hej igen...

Jeg har snakket med supporten på mit webhotel og de understøtter desværre kun mysql og dermed ikke mysqli...

Kan det lade sig gøre at lade scriptet om, så det benytter sig af mysql fremfor mysqli :) ? I så fald hvordan?

Jeg har lige udplukket fra det færdige script på min side og smidt det op her: http://www.valuable.dk/tilfantomas.zip

Det virker som det skal på localhost, men desværre ikke på mit webhotel som du nok kan regne ud =)

Jeg har selv prøvet ved at lave om på $mysqli variablen ved at gøre følgende:

$mysql = mysql_connect('xxx', 'xxx', 'xxx');
mysql_select_db('xxx', $mysql);

og derefter ændre $mysqli variablerne til $mysql, men så får jeg bare fejlen:
Fatal error: Call to a member function query() on a non-object in _thread.php on line 56

Så derfor er jeg selv lidt på bar fod med hvordan jeg løser problemet... Håber meget du kan hjælpe med det :/
Avatar billede doncarnage Nybegynder
04. juni 2009 - 20:01 #28
Jeg har lige oprettet det sidste spørgsmål (kommentar #27) i en tråd for sig selv herinde - http://www.eksperten.dk/spm/877205

Det er bare for ikke at virke som en pain in the ass hos dig, så andre også kan byde ind og hjælpe hvis du ikke har tid og/eller lyst ;)

Men du er naturligvis mere end velkommen til fortsat at hjælpe til både her og i den nye tråd.. Jeg skal nemlig stadig have løst mysqli problemet og kommentar #26 herinde =) Men jeg sætter utrolig stor pris på den hjælp jeg indtil videre har fået af dig!
Avatar billede fant0mas Nybegynder
04. juni 2009 - 21:28 #29
Kunne du ikke pakke filerne og smide et link, så skal jeg sørge for at fjerne det objekt orienterede og mysqli klassen.
Avatar billede fant0mas Nybegynder
04. juni 2009 - 21:31 #30
Arhh, det havde du allerede. Jeg kigger på det.
Avatar billede fant0mas Nybegynder
04. juni 2009 - 22:41 #31
Avatar billede fant0mas Nybegynder
04. juni 2009 - 22:42 #32
Hvilken editor bruger du? Dreamweaver?
Det er til at blive sindssyg af at den indsætter spaces i stedet for tabs :D
Avatar billede doncarnage Nybegynder
04. juni 2009 - 23:05 #33
Kæft du er genial.. Jeg udnævner dig hermed som ekspertens mest gavmilde og hjælpsomme person :D

Nu skal jeg bare lige ha sat det pænt op, men skal jo også lave noget selv :D! Jeg opretter i øvrigt nok en tråd mht. læst/ulæst problemet som beskrevet i #26, men den tid den sorg...

Hehe ja.. Er begyndt at holde mig til dreamweaver... Men tusind tak - er sindssyg taknemmelig ;)!
Avatar billede doncarnage Nybegynder
04. juni 2009 - 23:07 #34
Smid et svar hvis du samler på points ;)

Og i øvrigt.. dump.php filen som skal includes.. Hvad gør den sådan i grove træk ? Kan se der er pænt mange funktioner i den
Avatar billede fant0mas Nybegynder
04. juni 2009 - 23:31 #35
Det var for at hjælpe dig, men jeg glemte lige at nævne det.
Men brug den i dine projekter, så kan du ved at skrive
dump($en_variabel);
se en grafisk oversigt over hvad der er i variablen, det kan være dejligt når man arbejder med nogle komplicerede arrays eller lignende, det er bare en nemmere overskuelig var_dump();

Det med de ulæste kommentarer er faktisk færdigt, jeg poster det lige om snart.

Ingen points.
Avatar billede fant0mas Nybegynder
05. juni 2009 - 00:04 #36
Den er opdateret, og der er vedlagt filen sql.txt.
Selv tak for de fine ord!
Avatar billede doncarnage Nybegynder
06. juni 2009 - 11:52 #37
Jeg lukker tråden så og prøver at kigge på det "forumsvar" system ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester