Avatar billede dotcom1 Nybegynder
26. august 2005 - 19:11 Der er 27 kommentarer og
1 løsning

Form skal huske det indtastede

Hej.

Jeg har dette kommentar-script. Nogle gange glemmer brugerne at udfylde alle påkrævede felter, hvorved der vises en fejlbesked. Når en fejlbesked vises, slettes alt i formen, hvilket er ret uhensigtsmæssigt. Hvordan får man formen til at huske alt det, der er indtastet indtil der trykkes send?

comments.php (med formen):
<?PHP
  //napper postNo med det samme så det altid er til at få fat i
  if (isset($_GET['postNo']))  {
    $postNo = $_GET['postNo'];
  } else {
    $postNo = $_POST['postNo'];
  }
 
  include("commentFunctions.inc.php");
 
  //writes a header
  writeCommentHeader();
?>

<body onload="if(document.formnavn)document.formnavn.theName.focus()">
  <h2>
    <?PHP echo $GLOBALS['title']; ?>
  </h2>

<?PHP
  //Fejlbesked hvis felter mangler at blive usfyldt.
  if (isset($_POST['send']))  {
      if ($_POST['theComment'] == "" || $_POST['theName'] == "") {
        echo "<div class\"box\"><p class=\"error\">Skriv venligst mindst dit navn og en kommentar -<br>ellers er der ikke megen pointe med at trykke på send-knappen...</p></div>";
      } else  {
    insertComment($postNo);
    }
  }
  //vis kommentarerne for posten med postNo
  getComments($postNo);
?>
<br>
<br>
  <form name="formnavn" action="<?PHP echo $_SERVER['PHP_SELF']; ?>" method="post" target="_top" style="display:inline; margin:0px;">
    <b>
      <span class="titel">Navn:</span><span class="stjerne">*</span><br />
      <input name="theName" type="text" style="border:1px solid #999;" size="30" />
      <br />
      <span class="titel">Email:</span><br />
      <input name="theEmail" type="text" style="border:1px solid #999;" size="30" />
      <br />
      <span class="titel">Website:</span> <br />
      <input name="theURL" type="text" style="border:1px solid #999;" size="30" />&nbsp;&nbsp;* <span style="font-size:9px;">= Skal udfyldes.</span>     
    <br />
    <span class="titel">Kommentar:</span></b><span class="stjerne">*</span><br />
      <textarea name="theComment" style="border:1px solid #999;word-wrap:break-word;" rows="10" cols="65"></textarea>
      <br />
      <input type="hidden" name="postNo" value="<?PHP echo $postNo ?>" />
      <input type="submit" style="font-size: 12px; width:110px; border: 1px solid #000000; background-color: #e9e9e9;cursor:pointer;" name="send" value="Tilføj kommentar" />
      &nbsp;
      <input type="reset" style="font-size: 12px; width:50px; border: 1px solid #000000; background-color: #e9e9e9;cursor:pointer;" value=" Ryd " />
  </form><br />
  <br>
    <br>
    <table width="300" border="0" cellpadding="0" align="center">
      <tr>
        <td style="text-align:center;"><input name="button" type="button" onClick="window.close()" value="  Luk vindue  " class="submit_knap"></td>
      </tr>
    </table>
</body>
</html>


commentFunctions.inc.php (selve scriptet):
<?PHP
/*
  TABLE DUMP:

  DROP TABLE IF EXISTS `comments`;
  CREATE TABLE `comments` (
  `commentID` int(11) NOT NULL auto_increment,
  `comment` text,
  `URL` text,
  `email` varchar(100) default NULL,
  `name` varchar(40) default NULL,
  `postNo` varchar(100) NOT NULL default '',
  `theDate` datetime default NULL,
  PRIMARY KEY  (`commentID`)
) TYPE=MyISAM;
  */
  //KONFIGURERBARE VARIABLER
    #Der bliver sendt en email til denne adresse hver gang der
    #bliver skrevet en ny kommetar */
    $GLOBALS['email'] = "mail@e-mail.dk";
    #Dette er den titel man ser øverst i kommentarvinduet */
    $GLOBALS['title'] = "Kommentarer:";           
    #Den absolutte sti til den mappe på webserveren kommentarscriptet ligger i
    #For eksempel http://www.website.dk/comments/        
    $GLOBALS['root'] = "http://www.website.dk/comments/";
    #Addressen på databasen f.eks sql01.dk
    $GLOBALS['database_adress'] = "";
    #Disse variabler skulle give sig selv
    $GLOBALS['database_navn'] = "******";
    $GLOBALS['database_bruger'] = "******";
    $GLOBALS['database_password'] = "******";
   
  // FUNKTIONER
  function writeCommentHeader()  {
  echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
  echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"DTD/xhtml1-transitional.dtd\">\n";
  echo "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"da\">\n";
  echo "<head>\n";
  echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\" />";
  echo "<link href=\"/comments/comments.css\" rel=\"stylesheet\" type=\"text/css\" />\n";
  echo "<title>Tilføj eller læs kommentarer</title>\n";
  echo "<base target=\"_blank\" />\n";
  echo "</head>\n";
  echo "<body>\n\n";   
}

    function sendCommentMail($from, $body) {
        $subject = "Ny kommentar fra " . $from;
        mail($GLOBALS['email'], $subject, $body, "From: mail@e-mail.dk\r\n");
    }
 
  function insertComment($postNo) {
    if (isset($_POST['theComment']) && isset($_POST['theName']) && isset($postNo)) {
      if ($_POST['theComment'] != "" && $_POST['theName'] != "" && is_numeric($postNo)) {
       
        $aComment = htmlspecialchars(mysql_escape_string($_POST['theComment']));
        $aName = htmlspecialchars(mysql_escape_string($_POST['theName'])); 
        $aURL = htmlspecialchars(mysql_escape_string($_POST['theURL']));
        $anEmail = htmlspecialchars(mysql_escape_string($_POST['theEmail']));             
       
                sendCommentMail($_POST['theName'], $_POST['theComment']);
        $query = ("INSERT INTO comments (comment, URL, email, name, postNo, theDate) VALUES ('$aComment', '$aURL', '$anEmail', '$aName', '" . $postNo . "', NOW())");
        //executeSQL lukker selv linket til databasen
        executeSQL($query);
      }
    }
  }
      //Make links clickable:
    function url2link($url,$chr_limit = 70,$add = '...') {
    return preg_replace("!(http:/{2}[\w\.]{2,}[/\w\-\.\?\&\=\#]*)!e", "'<a href=\"\\1\" class=\"orange\" title=\"\\1\" target=\"_blank\">'.(strlen('\\1')>=$chr_limit ? substr('\\1',0,$chr_limit).'$add':'\\1').'</a>'", $url);
}
 
  function getComments($postNo)  {
    setlocale(LC_ALL, 'da_DK.ISO_8859-1');
    $comments = executeSQL("SELECT name, email, comment, URL, UNIX_TIMESTAMP(theDate) as thisDate FROM comments WHERE postNo = '" . $postNo . "' ORDER BY theDate");
    //hvis der ikke er nogen kommentarer kører løkken ikke
    while ($data = mysql_fetch_array($comments))  {
        $danskTid = (int)strftime("%e", $data['thisDate']) . strftime(". %b. %Y", $data['thisDate']) . " kl. " . strftime("%H:%M:%S", $data['thisDate']);
        $comment = stripslashes($data['comment']);
        $comment = nl2br($comment);
        $comment = wordwrap($comment, 65, "\n", 1);
        $comment = url2link($comment);
      echo "<div class=\"box\">\n";
      echo "<p class=\"date\">" . $danskTid . "</p>\n";
      echo "<p>" . $comment . "</p>";
      echo "<span class=\"small\">Skrevet af</span><span class=\"titel\"><b>" . stripslashes($data['name']) . "</b></span>\n";
      if ($data['email'] != "") {
        echo "  &nbsp;| <a class=\"plain\" title='Email' href=\"mailto:" . $data['email'] . "\">&nbsp;@&nbsp;</a>\n";
      }
      if ($data['URL'] != "") {
        echo " | <a class=\"plain\" title='Website' href=\"" . $data['URL'] . "\">&nbsp;www&nbsp;</a>\n";
      }
      echo "</div><br />\n\n";
    }
  }
 
  function getNumOfComments($itemNo) {

  $numOfComments = executeSQL("SELECT COUNT(postNo) AS numOfCom FROM comments WHERE postNo = '$itemNo'");
  //En eller flerer kommentarer
  $tag = "Kommentarer";
  $data = mysql_fetch_array($numOfComments);
    if ($data['numOfCom'] == 1) {
      $tag = "Kommentar";
    }
  echo "<a href=\"#\" onclick=\"kommentar=window.open('" . $GLOBALS['root'] . "comments.php?postNo=" . $itemNo . "','commentWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=470,height=510'); return false;\" title=\"Tilføj eller læs kommentarer\"  class=\"orange\">" . $tag . " (" . $data['numOfCom'] . ")</a>";
  }   
 
  function executeSQL($strSQL, $close="true")  {
    //åbner forbindelsen 
    $link = mysql_connect($GLOBALS['database_adress'], $GLOBALS['database_bruger'], $GLOBALS['database_password']);
    if (!$link) {
      //hvis forbindelsen fejler får brugeren en fejlmeddelelse og funktionen går ikke videre
      echo "<p>" . mysql_error() . "</p>";
    }
    //ellers vælges databasen
    else  {
      if(!mysql_select_db($GLOBALS['database_navn'], $link)) {
        //hvis der er fejl sker der ikke mere, blot lukkes databasen med mysql_close()
        echo "<p>" . mysql_error() . "</p>";
      }
      //ellers udføres en query
      else  {
        $result = mysql_query($strSQL);
       
        if (!$result) {
          //evt. fejl smides efter brugeren
          echo "<p>" . mysql_error() . "</p>";
        }
      }
          if ($close == "true") {
          if (!mysql_close()) {
            echo "<p>" . mysql_error() . "</p>";
          }
        }
      return $result;
    }
  }//slut på executeSQL
?>
Avatar billede jakobdo Ekspert
26. august 2005 - 19:31 #1
Jeg kender til 2 måder at gøre det på.
Du kan gemme tingene i sessions?
eller du kan lave noget i stil med:
$vaerdi1 = "";

if($_POST['submit'])
{
$vaerdi1 = $_POST['vaerdi1'];
}
og i din form:
<input name="vaerdi1" value="<?=$vaerdi1;?>" type="text">
osv...
Avatar billede dotcom1 Nybegynder
26. august 2005 - 19:33 #2
Jeg vil helst ikke begynde på sessions.

Hvordan kommer dit andet forslag til at se ud i min kode?
Avatar billede jakobdo Ekspert
26. august 2005 - 19:43 #3
Kunne forstille mig noget i den stil her:

comments.php (med formen):
<?PHP
//napper postNo med det samme så det altid er til at få fat i
if (isset($_GET['postNo']))
{
    $postNo = $_GET['postNo'];
}
else
{
    $postNo = $_POST['postNo'];
}

include("commentFunctions.inc.php");

//writes a header
writeCommentHeader();
?>

<body onload="if(document.formnavn)document.formnavn.theName.focus()">
  <h2>
    <?PHP echo $GLOBALS['title']; ?>
  </h2>

<?PHP
//Hjælp til at huske form-values... (Jakobdo)
$theComment = "";
$theName    = "";
$theEmail  = "";
$theUrl  = "";

//Fejlbesked hvis felter mangler at blive usfyldt.
if (isset($_POST['send']))
{
    //Hjælp til at huske form-values... (Jakobdo)
    $theComment = $_POST['theComment'];
    $theName = $_POST['theName'];
    $theEmail = $_POST['theEmail'];
    $theUrl = $_POST['theUrl'];
   
    if ($_POST['theComment'] == "" || $_POST['theName'] == "")
    {
        echo "<div class\"box\"><p class=\"error\">Skriv venligst mindst dit navn og en kommentar -<br>ellers er der ikke megen pointe med at trykke på send-knappen...</p></div>";
    }
    else
    {
        insertComment($postNo);
    }
}
//vis kommentarerne for posten med postNo
getComments($postNo);
?>
<br>
<br>
  <form name="formnavn" action="<?PHP echo $_SERVER['PHP_SELF']; ?>" method="post" target="_top" style="display:inline; margin:0px;">
    <b>
      <span class="titel">Navn:</span><span class="stjerne">*</span><br />
      <input name="theName" type="text" style="border:1px solid #999;" size="30" value="<?=$theName;?>" />
      <br />
      <span class="titel">Email:</span><br />
      <input name="theEmail" type="text" style="border:1px solid #999;" size="30" value="<?=$theEmail;?>" />
      <br />
      <span class="titel">Website:</span> <br />
      <input name="theURL" type="text" style="border:1px solid #999;" size="30" value="<?=$theUrl;?>" />&nbsp;&nbsp;* <span style="font-size:9px;">= Skal udfyldes.</span>   
    <br />
    <span class="titel">Kommentar:</span></b><span class="stjerne">*</span><br />
      <textarea name="theComment" style="border:1px solid #999;word-wrap:break-word;" rows="10" cols="65"><?=$theUrl;?></textarea>
      <br />
      <input type="hidden" name="postNo" value="<?PHP echo $postNo ?>" />
      <input type="submit" style="font-size: 12px; width:110px; border: 1px solid #000000; background-color: #e9e9e9;cursor:pointer;" name="send" value="Tilføj kommentar" />
      &nbsp;
      <input type="reset" style="font-size: 12px; width:50px; border: 1px solid #000000; background-color: #e9e9e9;cursor:pointer;" value=" Ryd " />
  </form><br />
  <br>
    <br>
    <table width="300" border="0" cellpadding="0" align="center">
      <tr>
        <td style="text-align:center;"><input name="button" type="button" onClick="window.close()" value="  Luk vindue  " class="submit_knap"></td>
      </tr>
    </table>
</body>
</html>
Avatar billede dotcom1 Nybegynder
26. august 2005 - 20:10 #4
Jeg fik det faktisk til at virke på en lidt simplere måde:
I input-felterne tilføjes blot hhv. value="<?php echo $_POST['theName']; ?>" for navne-feltet og <?php echo $_POST['theComment']; ?> for kommentar-feltet. Er det en ok måde at gøre det på?
Avatar billede jakobdo Ekspert
26. august 2005 - 20:14 #5
Ja, det er lidt samme måde jeg har lavet det på!
Men din er nemmere! :o)
Avatar billede dotcom1 Nybegynder
26. august 2005 - 20:16 #6
Læg et svar, Jakob. Du skal have noget for din indsats. :)
Avatar billede jakobdo Ekspert
26. august 2005 - 20:59 #7
Med min måde kan du også sætte en default værdi, f.eks.:
$theComment = "Din Kommentar...";
$theName    = "Dit Navn";
$theEmail  = "Din@email.dk";
$theUrl  = "www.side.dk";
Avatar billede jakobdo Ekspert
26. august 2005 - 20:59 #8
Og et svar!
Avatar billede dotcom1 Nybegynder
26. august 2005 - 22:48 #9
Okay. Tak for hjælpen. :)
Avatar billede jakobdo Ekspert
26. august 2005 - 23:04 #10
Takker for point! ;o)
Avatar billede dotcom1 Nybegynder
27. august 2005 - 14:03 #11
Jakobdo -> Besluttede at blive ved dit forslag, da mit eget forslag godt nok fik formen til at huske det indtastede, men også _efter_ at formen blev submitted. Ikke vildt hensigtsmæssigt. Har dog et lille problem med dit bud, så hvis du har tid og lyst til at hjælpe, så opretter jeg gerne et nyt spørgsmål.
Avatar billede jakobdo Ekspert
27. august 2005 - 14:45 #12
Fyr du bare løs her.
Ingen grund til at oprette et nyt.
Kan da godt lide at få point, men ikke for enhver pris! :o)
Avatar billede dotcom1 Nybegynder
27. august 2005 - 14:49 #13
Okay så. :)
Prøvede med dit script, men det indtastede er stadig i formen efter submit.
Du kan se de to scripts i deres helhed her:
Formen:
http://www.e-nanna.dk/comments/source.php?url=/comments/comments.php
Selve scriptet:
http://www.e-nanna.dk/comments/source.php?url=/comments/commentFunctions.inc.php
Avatar billede jakobdo Ekspert
27. august 2005 - 14:53 #14
Altså nu laver du godt nok ikke tjek på om din comment bliver indsat godt nok eller ej.
Hvis du evt lavede funktionen:
insertComment($postNo) returnere true eller false om den kunne indsætte eller ej.
Så kunne du lave:
if(insertComment($postNo))
{
//Comment inserted OK
$theName = "";
$theComment = "";
}
else
{
//Fejl i SQL...
//Vis evt fejl, eller send email til webmaster med info.
//Vis standard form som normalt.
}
Avatar billede dotcom1 Nybegynder
27. august 2005 - 14:57 #15
Har rodet med det så meget at jeg ikke rigtig kan overskue det længere. Kunne du vise mig koden? Hvordan får man insertComment($postNo) til at returnere true eller false?
:)
Avatar billede jakobdo Ekspert
27. august 2005 - 15:02 #16
Du kunne lave insertComment() sådan her:

function insertComment($postNo)
{
    $result = false;
    if (isset($_POST['theComment']) && isset($_POST['theName']) && isset($postNo))
    {
        if ($_POST['theComment'] != "" && $_POST['theName'] != "" && is_numeric($postNo))
        {
            $aComment = htmlspecialchars(mysql_escape_string($_POST['theComment']));
            $aName = htmlspecialchars(mysql_escape_string($_POST['theName'])); 
            $aURL = htmlspecialchars(mysql_escape_string($_POST['theURL']));
            $anEmail = htmlspecialchars(mysql_escape_string($_POST['theEmail']));             
       
            sendCommentMail($_POST['theName'], $_POST['theComment']);
            $query = ("INSERT INTO comments (comment, URL, email, name, postNo, theDate) VALUES ('$aComment', '$aURL', '$anEmail', '$aName', '" . $postNo . "', NOW())");
            //executeSQL lukker selv linket til databasen
            $result = executeSQL($query);
        }
    }
    return $result;
}

Du skyder jo faktisk først SQL'en af med funktionen: executeSQL() og den giver svar om det gik godt eller ej!
Avatar billede dotcom1 Nybegynder
27. august 2005 - 15:11 #17
Okay, har erstattet funktionen, men det indtastede bliver stadig i formen efter at den er submitted. Grr.
Avatar billede jakobdo Ekspert
27. august 2005 - 15:16 #18
Har du rettet, så du tester om insertComment går godt, og hvis ja, så sætter du $theComment = ""; og $theName = "";
?
Avatar billede dotcom1 Nybegynder
27. august 2005 - 15:23 #19
Argh, du mener det du skrev før:
if(insertComment($postNo))
{
//Comment inserted OK
$theName = "";
$theComment = "";
}
else
{
//Fejl i SQL...
//Vis evt fejl, eller send email til webmaster med info.
//Vis standard form som normalt.
}
- Jeg ved ikke hvordan syntaksen skal være, sorry. Er først ved at lære...
Avatar billede jakobdo Ekspert
27. august 2005 - 15:28 #20
Jeg skal ud af døren, så du må evt hjælpe dig selv.
Ellers kigger jeg gerne med på det i morgen!
Avatar billede dotcom1 Nybegynder
27. august 2005 - 15:30 #21
Du skal have 1000 mange tak indtil videre. :-)
Avatar billede jakobdo Ekspert
28. august 2005 - 13:41 #22
Fik du skidtet til at virke?
Avatar billede dotcom1 Nybegynder
28. august 2005 - 16:28 #23
Det lykkedes mig vist at lave den del, der sender en mail hvis der er opstået en fejl:
    if(insertComment($postNo))
{
    //Comment inserted OK
    $theName = "";
    $theComment = "";
    } else {
    //Fejl i SQL...Vis evt fejl, eller send email til webmaster med info.
    function errormsg($text)
{
    $error = '<p align="center" style="font:12pt Arial"><br><br><br>Fatal Error: <b>'.$text.'</b></p>'."\n";
    mail($GLOBALS['email'],'Error Report',$error,'From: errors@'.str_replace('www.','',$_SERVER['HTTP_HOST'])."\r\n".'Content-Type: text/html'."\r\n");
    exit($error);
    }
    //Vis standard form som normalt.
}
Er den i det mindste rigtig? :)
Avatar billede jakobdo Ekspert
28. august 2005 - 16:46 #24
Det ser rigtigt ud.
Har ikke lig ekigget syntaks 100% igennem!
Får du nogle fejl hvis du tester den?
Du kan jo teste med en ok SQL og så også teste med en hvor du bevidst laver en fejl i den!
Avatar billede dotcom1 Nybegynder
28. august 2005 - 16:50 #25
Det, der er i vejen nu er:
- En kommentar indsættes to gange når man klikker submit. :)))
- Det indtastede bliver i formen efter submit.
- Ryd-knappen rydder ikke formen (hænger sikkert sammen med ovenstående.)

Så der er meget. Ved ikke helt hvor jeg skal starte.
Avatar billede jakobdo Ekspert
29. august 2005 - 22:14 #26
Smid lige hele din kode herind, så må jeg kigge på det i løbet af i morgen!
Avatar billede dotcom1 Nybegynder
29. august 2005 - 22:39 #27
Jeg har vist faktisk endelig fået det til at virke... Det tror jeg i hvert fald. Du skal have tak for al hjælpen i denne omgang. Jeg laver et nyt spørgsmål hvis jeg får brug for mere hjælp senere. :)
Avatar billede jakobdo Ekspert
30. august 2005 - 08:12 #28
Den er fin!
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