Hallo,

zoals ik eerder heb laten blijken ben ik best wel een newb op PHP etc etc... gebied, nou heb ik voor de lol is een shoutbox proberen te maken en die dan ook public te releasen, nou ben ik na een tijd een heel stuk verder gekomen en heb van alles toegevoegd... Hier het script:

De SQL query:

CREATE TABLE shoutbox (
    id INT(10) not null AUTO_INCREMENT,
    name VARCHAR(20),
    message TEXT,
    date VARCHAR(15),
    ip VARCHAR(15),
    PRIMARY KEY(id)
);


Het config.php bestand:

<?php

/////////////////////////////////////////////
//ShadowIllusions Shoutbox V0.6 config file//
/////////////////////////////////////////////

//Database information (required)  

  $dbhost    = ".............."; //Usually localhost.
  $dbname    = "................."; //Database name.
  $dbuser    = "................."; //Database account username.
  $dbpass    = "..............."; //Database account password.
  $dbtable   = "shoutbox"; //Database table name.

//Language customization

  $shoutname = "ShadowIllusions Shoutbox V0.6"; //The name of the shoutbox.
  $nick      = "ERROR: Please enter a nickname!"; //If no name is entered this will be the error message.
  $comment   = "ERROR: Please enter a message!"; //If no message is entered this will be the error message.
  $code      = "ERROR: Wrong security code!"; //If no security code is entered this will be the error message.

//Security Code customization

  $sesname   = "secCode"; //session variable name.
  $fontsize  = "5"; //font size (1 - 5).
  $fontcolor = "000000"; //font color (RGB hexcode).
  $bgcolor   = "FFFFFF"; //background color (RGB hexcode).
  $linecolor = "B0B0B0"; //line color (RGB hexcode).

//Other customizations

  $date      = date("m.d.y H:i"); //Change the date and time format, for more information: http://www.php.net/date.
  $maxshouts = "10"; //Max shouts displayed.

//DO NOT CHANGE THINGS BELOW THIS LINE IF YOU HAVE NO PHP KNOWLEDGE!!!

  $name      = $_POST['name'];
  $message   = $_POST['message'];
  $ip        = $_POST['ip'];

?>


het index.php bestand:

<?php

/////////////////////////////////
//ShadowIllusions shoutbox V0.6//
/////////////////////////////////

include("shoutbox.php"); 
?>

<html>
<head>
<title>ShadowIllusions Shoutbox V0.6</title>
<script type="text/javascript" src="remember.js"></script>
</head>

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="text" name="name" value="Name" maxlength="15" size="15" onClick=value="" class="memorize"><br/>
    <input type="text" name="message" maxlength="40" value="Message" onClick=value=""><br/>
    <img src="seccode.php" width="71" height="21"><br/>
    <input type="text" name="secCode" maxlength="6" value="Code" size="8" onClick=value=""><br/>
    <input type="submit" name="submit" value="Shout it!">
    <input type="hidden" name="ip" value="<?php echo $_SERVER['REMOTE_ADDR']; ?>">
  </form>
</html>


het shoutbox.php bestand:

<?php

/////////////////////////////////
//Shadowillusions Shoutbox V0.6//
/////////////////////////////////

  if(!session_id(secCode)) session_start();

  require_once("config.php");

  if ($_POST['submit'])  {
    if ($name == "" or $name == "Name") { 
      $error = "$nick"; 
    }
    else if ($message == "" or $message == "Message") { 
      $error = "$comment"; 
    }
    else if ($_POST['secCode'] != $_SESSION['secCode']) {
      $error = "$code";
    }
    if ($error) {
?>
	
    <SCRIPT LANGUAGE="JavaScript">

    alert("<?=$error;?>")

    </script>

<?php

}

    else {
      $db = mysql_connect($dbhost,$dbuser,$dbpass); 
      mysql_select_db($dbname) or die(mysql_error());
      mysql_query("INSERT INTO $dbtable(name,message,date,ip) VALUES('$name','$message','$date','$ip')"); 
    }
  }
?>

<strong><?=$shoutname;?></strong><br>

<?php

  $db = mysql_connect($dbhost,$dbuser,$dbpass);
  mysql_select_db($dbname) or die(mysql_error());
  $query = "SELECT * FROM $dbtable ORDER BY id DESC LIMIT $maxshouts"; 
  $result = mysql_query($query);

  while($r = mysql_fetch_array($result)) {
    $name = $r['name'];
    $name = strip_tags($name);
    $message = $r['message'];
    $message = strip_tags($message);
    $date = $r['date'];
    $date = strip_tags($date);
    echo "<b><font size='2'>$date <br> $name: </font></b><br> $message <br>";
  }

  mysql_close($db);

?>


het remember.js bestand:

/////////////////////////////////
//ShadowIllusions Shoutbox V0.6//
//Copyright DynamicDrive.com//
/////////////////////////////////

var memoryduration="100 days" //How long should the name input be remembered

//DO NOT CHANGE THINGS BELOW THIS LINE IF YOU HAVE NO JAVASCRIPT KNOWLEDGE!!!

function setformobjects(){
var theforms=document.forms
memorizearray=new Array()
for (i=0; i< theforms.length; i++){
for (j=0; j< theforms[i].elements.length; j++){
if (theforms[i].elements[j].className.indexOf("memorize")!=-1 && theforms[i].elements[j].type=="text")
memorizearray[memorizearray.length]=theforms[i].elements[j]
}
}
var retrievedvalues=get_cookie("mvalue"+window.location.pathname)
if (retrievedvalues!=""){
retrievedvalues=retrievedvalues.split("|")
if (retrievedvalues[retrievedvalues.length-1]!=parseInt(memoryduration))
resetcookie("mvalue"+window.location.pathname)
else{
for (i=0; i<memorizearray.length; i++){
if (retrievedvalues[i]!="empty_value")
memorizearray[i].value=retrievedvalues[i]
}
}
}
}

function get_cookie(Name) {
  var search = Name + "="
  var returnvalue = "";
  if (document.cookie.length > 0) {
    offset = document.cookie.indexOf(search)
    if (offset != -1) { // if cookie exists
      offset += search.length
      end = document.cookie.indexOf(";", offset);
      if (end == -1)
         end = document.cookie.length;
      returnvalue=unescape(document.cookie.substring(offset, end))
      }
   }
  return returnvalue;
}

function resetcookie(id){
var expireDate = new Date()
expireDate.setDate(expireDate.getDate()-10)
document.cookie = id+"=;path=/;expires=" + expireDate.toGMTString()
}

function saveformvalues(){
var formvalues=new Array(), temp
for (i=0; i<memorizearray.length; i++){
temp=memorizearray[i].value!=""? memorizearray[i].value : "empty_value"
formvalues[formvalues.length]=escape(temp)
}
formvalues[formvalues.length]=parseInt(memoryduration)
formvalues=formvalues.join("|")
var expireDate = new Date()
expireDate.setDate(expireDate.getDate()+parseInt(memoryduration))
document.cookie = "mvalue"+window.location.pathname+"="+formvalues+"; path=/;expires=" + expireDate.toGMTString()
}

if (window.addEventListener)
window.addEventListener("load", setformobjects, false)


het seccode.php bestand:

<?php

/////////////////////////////////
//ShadowIllusions Shoutbox V0.6//
/////////////////////////////////

  require_once("config.php");
  error_reporting(E_WARNING);
  if(function_exists('session_start')) session_start();

  function convertRGB($color) {
    $color = eregi_replace('[^0-9a-f]', '', $color);
    return array(hexdec(substr($color, 0, 2)), hexdec(substr($color, 2, 2)), hexdec(substr($color, 4, 2)));
  }

  function createImage($text, $width, $height, $font = 5) {
    global $fontcolor, $bgcolor, $linecolor;

    if($img = @ImageCreate($width, $height)) {
      list($R, $G, $B) = convertRGB($fontcolor);
      $fontcolor = ImageColorAllocate($img, $R, $G, $B);
      list($R, $G, $B) = convertRGB($bgcolor);
      $bgcolor = ImageColorAllocate($img, $R, $G, $B);
      list($R, $G, $B) = convertRGB($linecolor);
      $linecolor = ImageColorAllocate($img, $R, $G, $B);
      ImageFill($img, 0, 0, $bgcolor);

      for($i = 0; $i <= $width; $i += 5) {
        @ImageLine($img, $i, 0, $i, $height, $linecolor);
      }
      for($i = 0; $i <= $height; $i += 5) {
        @ImageLine($img, 0, $i, $width, $i, $linecolor);
      }

      $hcenter = $width / 2;
      $vcenter = $height / 2;
      $x = round($hcenter - ImageFontWidth($font) * strlen($text) / 2);
      $y = round($vcenter - ImageFontHeight($font) / 2);
      ImageString($img, $font, $x, $y, $text, $fontcolor);

      if(function_exists('ImagePNG')) {
        header('Content-Type: image/png');
        @ImagePNG($img);
      }
      else if(function_exists('ImageGIF')) {
        header('Content-Type: image/gif');
        @ImageGIF($img);
      }
      else if(function_exists('ImageJPEG')) {
        header('Content-Type: image/jpeg');
        @ImageJPEG($img);
      }
      ImageDestroy($img);
    }
  }

  srand((double) microtime() * 1000000);
  $secCode = '';

  for($i = 0; $i < 6; $i++) $secCode .= rand(0, 9);
  $_SESSION[$sesname] = $secCode;

  createImage($secCode, 71, 21, $fontsize);

?>


de shoutbox geheel: http://shadow.mygamesonline.org/shouttest/

Mijn vraag is nu: Zien jullie dingen die verbeterd kunnen worden met een voorbeeldje zodat ik mijn PHP skill kan verhogen en zuiverder code kan scripten.

EDIT: BTW die $ip variable heb ik nog niet afgemaakt want ik wil een admin pagina maken voor de shoutbox zodat ik IP's kan bannen...

Bedankt!
Datum hoort niet in een varchar maar in een date of datetime veld.
En plaats variables alsjeblieft buiten quotes.

<?php
echo "$var"; //Fout

echo $var; //Goed
echo 'Tekst '.$var. 'Tekst'; //Goed
?>
echo "$var"; //Fout


Dat is niet fout hoor. Het is misschien niet heel netjes maar het is zeker niet fout. Als je de php documentatie doorleest dan wordt het zelfs als kracht gezien. Dus oke, het is niet netjes, maar het is niet fout.
@SanThe

zou je iets specifieker kunnen uitleggen?

@ Jelle Posthuma en PHPerik

Dit is inderdaad een foutje die ik zal verhelpen al maakt het niet veel uit, maar staat gewoon wat netter inderdaad.

EDIT: Is het eigenlijk mogelijk de shoutbox in AJAX te laten laden? Dat zou het refresh probleem verhelpen als je het in een pagina zet zonder een Iframe, en is dit moeilijk te implenteren, kheb nog nooit iets gedaan met javascript/AJAX...
date VARCHAR(15),

VARCHAR is voor tekst/strings.
DATE is voor datum zonder tijd.
DATETIME is voor datum inclusief tijd.

MySQL kan allerlei bewerkingen doen op een datumveld. Maar dan moet ie wel het juiste veldtype hebben.

Verder is de door jou gekozen veldnaam 'date' ook geen goede keus. Dat woord wordt door mysql zelf al gebruikt en is dus zeer sterk af te raden. Gebruik gewoon 'datum'.
SanThe schreef op 01.10.2007 21:48
date VARCHAR(15),

VARCHAR is voor tekst/strings.
DATE is voor datum zonder tijd.
DATETIME is voor datum inclusief tijd.

MySQL kan allerlei bewerkingen doen op een datumveld. Maar dan moet ie wel het juiste veldtype hebben.

Verder is de door jou gekozen veldnaam 'date' ook geen goede keus. Dat woord wordt door mysql zelf al gebruikt en is dus zeer sterk af te raden. Gebruik gewoon 'datum'.


Is er dan ook een veldtype voor de notatie die time() in PHP geeft?
Is er dan ook een veldtype voor de notatie die time() in PHP geeft?


Ja dat is het type INT. Een unsigned INT gaat tot 4 miljard. Een timestamp van nu (vanaf 1jan 1970) is ongeveer 1 miljard seconden.
Je houdt het met unsigned INT dus nog zeker 100 jaar uit.

Ik gebruik zelf overal timestamps in mijn database, maar je kunt net zo goed DATETIME gebruiken.

Reageren