Avatar billede Slettet bruger
25. juli 2010 - 14:58 Der er 10 kommentarer og
2 løsninger

Opgradering af PHP script

Hej,

Jeg har overtaget en side som jeg gerne vil have udviklet lidt på.

Jeg vil gerne have kategorier bygget ind i den, således at kategorierne vises i eksempelvis 3 kolonner og x rækker.

Her vises 3 kolonner og 1 række. Antal links i hver kategori vises i parantesen.

Kat. 1 (25) Kat. 2 (37) Kat. 3 (14)
Link 1 Link 1 Link 1
Link 2 Link 2 Link 2
Link 3 Link 3 Link 3
Link 4 Link 4 Link 4
Link 5 Link 5 Link 5
-----------
På siden "Tilføj URL" vil jeg gerne have karakter til at virke, således at jeg kan angive en karakter fra 1-5 for det link jeg tilføjer.
-----------
Jeg vil også gerne ha skrevet de inkluderede filer ind i selve index.php så systemet ikke skal hente filer rundt omkring på serveren.
-----------

Nogen hos jer der har mod på denne opgave, og hvad skal det evt. koste??

MySQL
Jeg er ikke sikker på at SQL er sat rigtigt op, så rettelser er velkomne.
CREATE TABLE `links` (
  `id` int(11) NOT NULL auto_increment,
  `top` tinyint(2) NOT NULL default '0',
  `rating` int(2) default '0',
  `hits` int(11) default '0',
  `date` date default NULL,
  `cat` varchar(64) NOT NULL default '',
  `title` varchar(64) NOT NULL default '',
  `url` varchar(256) NOT NULL default '',
  UNIQUE KEY `id` (`id`),
  KEY `top` (`top`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;


INDEX.PHP
<?php
  $page_title        = "Linksamling";
  $stylesheet        = "blue";
  require($_SERVER["DOCUMENT_ROOT"].'/php/boot.php');
  include($_SERVER["DOCUMENT_ROOT"].'/php/functions.php');
?>

<table width="800" border="0">
  <tr>
    <td>
<?php

$thisfile = $PHP_SELF;
// linkstrenge til de tre funktioner.
$linkshowtop = "[ <a href=\"$thisfile\">Top links</a> ] ";
$linkshowall = "[ <a href=\"$thisfile?show=all\">Vis alle</a> ] ";
$linkadd = "[ <a href=\"$thisfile?addurl=yes\">Tilføj webside / URL</a> ] ";

if (strtolower($show) == "all") {
  $where = "";
} else {
  $where = " having point >= 0";
}

$count = query("select sum(hits) as cnt from links");
$hitcount = $count[0]->cnt;
/*
  $result = query("select id,title,date,rating,hits,url,(hits*rating-(to_days(curdate())-to_days(date))) as point ".
                "from links$where order by top desc, point DESC");
*/
$result = query("select id,title,date,rating,hits,url,(rating*10+(hits)) as point ".
                "from links$where order by top desc, point DESC");

page_start("");

echo $linkshowtop;
echo $linkshowall;
echo $linkadd;

if (!isset($addurl)) {
echo "<table width='800' border=0 cellpadding=2 cellspacing=0>\n";
  for ($i=0;$i<sizeof($result);$i++) {
    if ($result[$i]->point >= 0) {
      $point = $result[$i]->point;
    } else {
      $point = "-";
    }
    echo "<tr><td><p title='".$result[$i]->url."'>".
        "<a href='/links/golink.php?id=".$result[$i]->id."' target='_blank'>".
        stripslashes($result[$i]->title)."</a><a href='".$result[$i]->url."'>".
        "</a></td>".
        "<td><img src=\"/images/links/".$result[$i]->rating.".gif\" ".
        "alt='".stars($result[$i]->rating)."' width='33' height='16'></td>".
        "<td align=\"right\">".$result[$i]->hits."</td>";
    echo "<td align=\"right\">$point</td>";

    echo "</tr>\n";
  }

echo "</table>";
} else {
?>

<form action='/links/addlink.php' method='post' target='_blank'>
  <table width='600' border='0' align='center'>
    <tr>
      <td>Websidens navn: </td>
      <td><input type='text' name='title' value='' size='30' id='t350'></td>
    </tr>
    <tr>
      <td>URL : </td>
      <td><input type='text' name='url' value='http://' size='30' id='t350'></td>
    </tr>
    <tr>
      <td>Karakter : </td>
      <td>
        <label><input type="radio" name="Rating" value="1" id="Rating_0" />1</label>   
        <label><input type="radio" name="Rating" value="2" id="Rating_1" />2</label>   
        <label><input type="radio" name="Rating" value="3" id="Rating_2" />3</label>   
        <label><input type="radio" name="Rating" value="4" id="Rating_2" />4</label>   
        <label><input type="radio" name="Rating" value="5" id="Rating_2" />5</label>   
      </td>
    </tr>
  <tr>
      <td colspan="2" align='center'><br /><input type='submit' value='Tilføj link' id='submit' name="submit"></td>
    </tr>
    <tr>
      <td colspan="2" align='right'><br /><b>NB!</b> Din IP logges ved "Tilføj link"</td>
    </tr>
  </table>
</form>
<?}
echo "Total hits : $hitcount\n";
echo mysql_error();

page_end();
?>
    </td>
  </tr>
</table>

BOOT.PHP
<?php
$DB_HOST="localhost";
$DB_USER="";
$DB_PASS="";
$DB_DATABASE="";

if ($BOOT_PHP != 1) {

  function query($string) {
    global $DB_CONNECTION;
    global $DB_DATABASE;
    global $DB_USER;
    global $DB_PASS;
    global $DB_HOST;

    if (!$DB_CONNECTION)
      $DB_CONNECTION=mysql_connect($DB_HOST,$DB_USER,$DB_PASS);

    $sqlresult=mysql_db_query($DB_DATABASE,$string,$DB_CONNECTION);
    if (!$sqlresult) {
      return array();
    }
    while ($row=mysql_fetch_object($sqlresult)) {
      $result[]=$row;
    }
    return $result;
 
}

  function squery($string) {
    global $DB_CONNECTION;
    global $DB_DATABASE;
    global $DB_USER;
    global $DB_PASS;
    global $DB_HOST;

    if (!$DB_CONNECTION)
      $DB_CONNECTION=mysql_pconnect($DB_HOST,$DB_USER,$DB_PASS);

    $sqlresult=mysql_db_query($DB_DATABASE,$string,$DB_CONNECTION);
  }

  function mappath() {
    /* Credits to Beast for helping me with this one */
    global $HTTP_HOST;
    global $PHP_SELF;
    return "http://" . $HTTP_HOST. dirname($PHP_SELF)."/";
  }

  $BOOT_PHP = 1;
}
?>

FUNCTIONS.PHP
<?
function stars($count) {
if ($count > 0) {
  return "[".str_repeat("+",$count).str_repeat("-",10-$count)."]";
} else {
  return "Afventer...";
}
}

function line($width=380) {
  $temp = "<table cellpadding=0 cellspacing=2 border=0 width=$width height=1>".
          "<tr><td bgcolor=#0000cf height=1 width=$width>".
          "<img src=\"/rate/cleardot.gif\" alt=\"----------------------\" width=1 height=1></td></tr></table>\n";

  return $temp;
}

function page_start() {

  echo "<center><p><b>$title</b></p>\n";
}

function page_end() {
  echo "</center>\n";
}
?>


Hilsen Frank
Avatar billede justrace Novice
25. juli 2010 - 16:01 #1
Det er ikke specielt smart al have det lagt ind i index, da det er et ret stort sikkerhedshul der derved lukkes op.

Det andet ved jeg ikke nok om php til at lave.
Avatar billede Slettet bruger
25. juli 2010 - 16:55 #2
Det kan du måske have ret i, jeg ved slet ikke nok om det til at vide hvad der er smartest eller bedst.

Da jeg overtog sidenvidste jeg ikke at der var så meget rod på siderne, men hvis det er klogest at have filerne delt, og det ikke gør siden langsom, så forbliver det bare delt :)
Avatar billede justrace Novice
25. juli 2010 - 17:04 #3
Det bliver den ikke langsom af.

Hvilken "pakke" er den bygget på?
Avatar billede Slettet bruger
25. juli 2010 - 18:43 #4
Pakke?
Mener du php3, 4 eller 5? Aner det ikke, men jeg ved det er over 5 år gammelt.
Avatar billede justrace Novice
25. juli 2010 - 18:58 #5
Er det ikke bygget over eks. phpBB, php-fusion, eller lign.?
Eller er det bygget helt fra bunden?
Avatar billede Slettet bruger
26. juli 2010 - 13:37 #6
Nåh, nej, det er bygget op fra bunden.

Det kunne sikkert laves på en bedre måde, og hvis et system magen til det jeg søger allerede er lavet, hvor kan jeg finde det?

Hvad siger I til at kigge på de opgraderinger jeg gerne vil ha lavet? Kan det gøres? Er det besværligt? Er det nemmere at skrive det hele om?
Avatar billede Slettet bruger
27. juli 2010 - 06:56 #7
Hej Frank

Her er et bud på en omskrivning, hvor alt ligger i index.php.
Jeg ved ikke hvordan du vil have en kategori oprettet, så jeg har bare tilføjet et tekstfelt hertil i "tilføj link".
Du har ikke vedlagt addlink.php, så der poster jeg i stedet til index.php, der laver en simpel indsættelse i databasen uden at checke om udfyldt o.lign.
Jeg kan ikke forstå hvad hvad top-links med SQLen "having point>=0" skal gøre godt for, men har taget det med.


<center>
<?php
   
    $db_host = '';
    $db_user = '';
    $db_passwd = '';
    $db_name = '';
   
    function get($k) { return isset($_POST[$k]) ? trim(get_magic_quotes_gpc() ? $_POST[$k]: addslashes($_POST[$k])): ''; }
   
    $dbc = mysql_connect($db_host,$db_user,$db_passwd);
    mysql_select_db($db_name,$dbc);
   
    echo('<p>
        [<a href="'.$_SERVER['PHP_SELF'].'">Top links</a>]
        [<a href="'.$_SERVER['PHP_SELF'].'?showall=1">Alle links</a>]
        [<a href="'.$_SERVER['PHP_SELF'].'?addlink=1">Tilføj webside</a>]
    </p>');
   
    if (isset($_REQUEST['url'])) {
        mysql_query('insert into link (url,title,cat,rating) values ("'.get('url').'","'.get('title').'","'.get('cat').'","'.get('rating').'")',$dbc);
    }
   
    if (isset($_REQUEST['addlink'])) {
       
        echo('
            <form action="'.$_SERVER['PHP_SELF'].'" method="post">
                <p>Tilføj webside (URL):<br /><input type="text" name="url" size="30" /></p>
                <p>Websidens navn:<br /><input type="text" name="title" size="30" /></p>
                <p>Kategori:<br /><input type="text" name="cat" size="30" /></p>
                <p>Karakter:<br />
                <label><input type="radio" name="rating" value="1" />1</label> 
                <label><input type="radio" name="rating" value="2" />2</label> 
                <label><input type="radio" name="rating" value="3" />3</label> 
                <label><input type="radio" name="rating" value="4" />4</label> 
                <label><input type="radio" name="rating" value="5" />5</label> 
                </p>
                <p><input type="submit" value="Tilføj" /></p>
                <p>NB. Din IP vil blive logget</p>
            </form>
        ');
    }
    else {
       
        echo('<table>');
       
        $cats = mysql_query('select count(*), cat from link group by cat',$dbc);
        while ($cat = mysql_fetch_array($cats)) {
           
            echo('<td valign="top">'.htmlspecialchars($cat['cat']).' ('.$cat[0].')<table>');
           
            $showall = isset($_REQUEST['showall']) ? '': ' having point>=0';
           
            $links = mysql_query('select *,(rating*10+hits) as point from link where cat="'.$cat['cat'].'"'.$showall.' order by top, point desc',$dbc);
           
            while ($link = mysql_fetch_array($links)) {
               
                $link = array_map('htmlspecialchars',$link);
                $stars = $link['rating'] ? '['.str_repeat('+',$link['rating']).str_repeat('-',5-$link['rating']).']': 'Afventer...';
               
                echo('<tr>
                    <td><a href="/links/golink.php?id='.$link['id'].'" title="'.$link['url'].'" target="_blank">'.$link['title'].'</a></td>
                    <td><img src="/images/links/'.$link['rating'].'.gif" alt="'.$stars.'" /></td>
                    <td align="right">'.$link['hits'].'</td>
                    <td align="right">'.($link['point']?$link['point']:'-').'</td>
                </tr>');
            }
           
            echo('</table></td>');
        }
       
        echo('</table><p>Total hits: '.current(mysql_fetch_array(mysql_query('select sum(hits) from link',$dbc))).'</p>');
    }
?>
</center>
Avatar billede Slettet bruger
27. juli 2010 - 08:58 #8
Det ser ellers godt ud, men udløser desværre disse fejl:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/../links/index2.php on line 50

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/../links/index2.php on line 74

Warning: current() [function.current]: Passed variable is not an array or object in /home/../links/index2.php on line 74
--------------

Addlink.php
<?php
  require($_SERVER["DOCUMENT_ROOT"].'/php/boot.php');

if (isset($url) && isset($title)) {
$sql = ("insert into links(date,title,url,hits,rating,ip) ".
        "values('".date("Y-m-d")."','".addslashes($title).
        "','$url',0,'0','".$REMOTE_ADDR."')");
  squery($sql);
  header("Location: $url");
  exit;
}
?>


golink.php
<?php
  require($_SERVER["DOCUMENT_ROOT"].'/php/boot.php');

if (isset($id) && $id > 0) {
  $now = date("Y-m-d H:i:s");
  $expire = date("Y-m-d H:i:s", time()+3600);

  squery("delete from link_sessions where expire < '$now'");

  $getsession = query("select expire from link_sessions ".
  "where ip = '$REMOTE_ADDR' and link_id = $id and expire > '$now'");

  if (sizeof($getsession) == 0) {
// sets timestamp and updates
      squery("update links set hits = hits+1 where id = $id");
      squery("insert into link_sessions(ip,link_id,expire) ".
            "values('$REMOTE_ADDR',$id,'$expire')");
} else {
// ok, no stamp needed
}
  $result = query("select distinct url, id from links where id = $id");
  $url = $result[0]->url;
  header("Location: $url");
  exit;
}
?>

Jeg har lagt nogle billeder af det jeg ønsker i det færdige system her:

En oversigt over alle kategorier, og 3-5 af de mest besøgte links vist herunder i hver kategori.
http://anakin.dk/links/oversigt.jpg

Sådan som links skal vises når man har klikket på en kategori:
http://anakin.dk/links/links-i-kategori.jpg

-------------
Der ligger et andet system på siden også, noget med opskrifter, der er kategorierne til opskrifterne gemt i sin egen database, måske man kunne bruge det princip ??

SQL
CREATE TABLE IF NOT EXISTS `kogebog_kategorier` (
  `id` int(3) NOT NULL auto_increment,
  `kategori` varchar(50) NOT NULL default '',
  `kat_beskrivelse` longtext NOT NULL,
  `kat_billede` int(1) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;

Så bare ændret til links_kategorier eller lign.

Måske er det bedst at lave en lille brugerdatabase også, da jeg ikke gider have alle andres links med i min samling. Det skal jo så bare være brugernavn og kodeord.

Håber ikke det bliver for besværligt, som sagt betaler jeg gerne for et godt resultat.
Avatar billede Slettet bruger
27. juli 2010 - 09:03 #9
P.S. Toplinks skal fjernes.
Se selve systemet her: http://anakin.dk/links

Håber det giver lidt mening.
Avatar billede Slettet bruger
30. juli 2010 - 01:41 #10
Fejlene skyldtes at jeg havde omdøbt din tabel fra "links" til "link". Det er nu rettet tilbage.

Her er et opdateret bud.

For at holde det simpelt oprettes kategorierne i et array øverst i scriptet, frem for en ny database-tabel. Ligeledes ligger din adgangskode "1234" i variablen $passwd, så der ikke skal vedligeholdes brugerdatabase.

Har jeg forstået dig ret, vil du tillade andre at se alle links, men selv slippe for at se andre end dine egne. Frem for at vedligeholde et hoved- og privat-indeks lægger min løsning op til, at du ved at logge ind kun får vist de links, som har feltet "mine" sat, og som bliver sat når du efter at have logget ind opretter et link. Det virker simplere. Til gengæld kræver det at du tilføjer følgende linje til din sql:
mine int default 0,


<?php
   
    $passwd = '1234';
    $cats = array('Sjov','Spas');
    $db_host = '';
    $db_user = '';
    $db_passwd = '';
    $db_name = '';
   
    session_start();
   
    $self = $_SERVER['PHP_SELF'];
    $auth = intval(@$_SESSION['auth']);
   
    function get($k) { return @trim(get_magic_quotes_gpc()? $_REQUEST[$k]: addslashes($_REQUEST[$k])); }
   
    mysql_select_db($db_name, $db = mysql_connect($db_host, $db_user, $db_passwd));
   
    if ($id = get('goto')) {
        mysql_query("update links set hits=hits+1 where id='$id'");
        die(header('Location: '.reset(mysql_fetch_row(mysql_query("select url from links where id='$id'")))));
    }
   
    if (get('title')) {
        mysql_query('insert into links (title,url,cat,rating,mine) values ("'.get('title').'","'.get('url').'","'.get('cat').'","'.get('rating').'",'.$auth.')');
        die(header("Location: $self"));
    }
   
    if (get('passwd')==$passwd) {
        $_SESSION['auth'] = true;
        die(header("Location: $self"));
    }
   
    echo("<p><a href=\"$self\">Links</a> | <a href=\"$self?addlink=1\">Nyt link</a> | <a href=\"$self?login=1\">Log ".($auth?'ud':'ind').'</a></p>');
   
    if (get('login')) {
        if (isset($_SESSION['auth'])) {
            unset($_SESSION['auth']);
            die(header("Location: $self"));
        }
        die('<form action="'.$self.'" method="post">
            <p>Adgangskode:<br /><input type="text" name="passwd" /></p>
            <p><input type="submit" value="Log ind" /></p>
        </form>');
    }
   
    if (get('addlink')) die('
        <form action="'.$self.'" method="post">
            <p>Webside URL:<br /><input type="text" name="url" /></p>
            <p>Websidens navn:<br /><input type="text" name="title" /></p>
            <p>Kategori:<br /><select name="cat"><option>'.implode('</option><option>',$cats).'</option></select></p>
            <p>Karakter:<br />
            <label><input type="radio" name="rating" value="1" />1</label>
            <label><input type="radio" name="rating" value="2" />2</label>
            <label><input type="radio" name="rating" value="3" />3</label>
            <label><input type="radio" name="rating" value="4" />4</label>
            <label><input type="radio" name="rating" value="5" />5</label>
            </p>
            <p><input type="submit" value="Tilføj" /></p>
            <p>NB. Din IP vil blive logget</p>
        </form>
    ');
   
    echo('<table><tr>');
   
    if (get('cat')) $cats = array(htmlspecialchars(get('cat')));
    foreach ($cats as $i=>$cat) {
        if ($i&&$i%3==0) echo('</tr><tr>');
        $links = mysql_query("select *, (rating*10+hits) as point from links where cat='$cat'".($auth?' and mine=1':'')." order by point desc");
        if (!get('cat')) $cat = "<a href=\"$self?cat=$cat\">$cat</a>";
        echo("<td valign=top><b>$cat (".mysql_num_rows($links).')</b><table>');
        for ($j=0; $link = @array_map('htmlspecialchars',mysql_fetch_array($links)); $j++) {
            echo('<tr>
                <td><img src="/images/links/'.$link['rating'].'.gif" /></td>
                <td><a href="'.$self.'?goto='.$link['id'].'" title="'.$link['url'].'" target="_blank">'.$link['title'].'</a></<td>
                <td>'.$link['hits'].'/'.$link['point'].'</td>
            </tr>');
            if ($j==2&!get('cat')) break;
        }
        echo('</table></td>');
    }
   
    echo('</tr></table><p>Links i alt '.reset(mysql_fetch_row(mysql_query('select count(*) from links'))).'</p>');
   
?>
Avatar billede Slettet bruger
14. september 2010 - 16:41 #11
Undskyld den lange ventetid, måtte lige et smut udenlands med jobbet.

Det betyder ikke noget hvis der skal oprettes nogle brugere, det kan klares med htaccess. Det jeg gerne vil frem til er en oversigt hvor kategorierne bliver vist ligesom på denne side http://anakin.dk/opskrifter/oversigt.php bare med links/bogmærker i stedet.

Jeg vidste ikke om det var smart at samle alt i én index fil, måske er det bedre at have addlink i en separat fil, så kan den jo gemmes i en anden mappe, så kun jeg har adgang.

Hvis nu vi glemmer det med private links, og fokuserer på at få linkene til at fremstå ligesom den førnævnte side, hvor meget skal der så laves om på?
Avatar billede Slettet bruger
20. september 2010 - 22:11 #12
Øv, kan ikke få det til at virke :(
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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