Avatar billede langbein Nybegynder
21. august 2004 - 15:45 Der er 11 kommentarer og
1 løsning

Liten PHP online editor virker ikke.

Forsøker å kjøre gjennom eksemplene i boken "Beginning PHP" utgitt på Wrox. I kap 10 så er det et en PHP online editor, men denne virker ikke. Den html kode som genereres ut er den under, og den kan ikke lagre innholdet av det som man skriver inn. Noen som ser åpenbare feil ?

<HTML>
<HEAD><TITLE>Welcome to Web Text Editor</TITLE></HEAD>
<BODY>
<CENTER><STRONG>Editing a new file</STRONG></CENTER>
<CENTER>
<FORM NAME="edit_form" METHOD="POST" action="">
<INPUT TYPE="HIDDEN" NAME="action" VALUE="save_file">
<INPUT TYPE="HIDDEN" NAME="dir" VALUE="/var/www/html/phptest/wrox/ch10/docs">
<TEXTAREA ROWS="25" NAME="filebody"
      COLS="80" WRAP="soft">
</TEXTAREA><BR>
Filename: <STRONG>/var/www/html/phptest/wrox/ch10/docs/</STRONG><INPUT TYPE="TEXT" NAME="filename" VALUE="new.txt"
                              SIZE="30">
<INPUT TYPE="SUBMIT" VALUE="Save" NAME="Submit">
</FORM>
</CENTER>

</BODY>
</HTML>
 
Ellers link til samme spørsmål lagt inn hos Wrox:
http://p2p.wrox.com/topic.asp?TOPIC_ID=17949

(Har egentlig litt bedre tro på eksperten .. he, he :)
Avatar billede detox Nybegynder
21. august 2004 - 15:52 #1
Hvordan ser php koden ud?
Avatar billede langbein Nybegynder
21. august 2004 - 16:13 #2
Den ser ikke ut. Bokens dårlige side, synes jeg, det er at de lager for komplisert kode for selv enkle eksempler. Jeg legger ut hele koden for dette eksemplet, for da går det jo eventuelt ann å lage copy/past for testkjøring.

Scriptet editor.php:

<?php
//editor.php
//include "./common.inc";

function editor_form($dir, $filename, $is_new) {
  global $PHP_SELF, $edit_form_cols, $edit_form_rows;
  $filepath = "$dir/$filename";
  if(!$is_new) $filebody = implode("",file($filepath));
  $file_info_array = file_info("$filepath");
  $editable = 1; 
  if($file_info_array["filetype"] != "text") {
      $filebody = $filepath . " is not a text file.
                    You had better not edit it.";
      $editable = 0;
  }
  if($editable) {
?>
<CENTER>
<FORM NAME="edit_form" METHOD="POST" action="<?php echo $PHP_SELF ?>">
<INPUT TYPE="HIDDEN" NAME="action" VALUE="save_file">
<INPUT TYPE="HIDDEN" NAME="dir" VALUE="<?php echo "$dir" ?>">
<TEXTAREA ROWS="<?php echo $edit_form_rows ?>" NAME="filebody"
      COLS="<?php echo $edit_form_cols ?>" WRAP="soft">
<?php echo "$filebody"; ?>
</TEXTAREA><BR>
Filename: <?php echo "<STRONG>$dir/</STRONG>"; ?>
<INPUT TYPE="TEXT" NAME="filename" VALUE="<?php echo $filename ?>"
                              SIZE="30">
<INPUT TYPE="SUBMIT" VALUE="Save" NAME="Submit">
</FORM>
</CENTER>

<?php
  }
  else {
      echo "<CENTER><STRONG><FONT COLOR=\"RED\">$filebody</FONT></STRONG></CENTER>\n";
  }
}


function edit_new_form() {
  global $PHP_SELF, $default_dir, $dir;
?>

<CENTER><FORM METHOD="POST" ACTION="<?php echo $PHP_SELF ?>">
<INPUT TYPE="HIDDEN" NAME="action" VALUE="editor_page">
<INPUT TYPE="HIDDEN" NAME="dir" VALUE="<?php echo $dir ?>">
<INPUT TYPE="SUBMIT" VALUE="Edit New"></FORM></CENTER>

<?php
}

function save_file() {
  global $filename, $filebody, $dir, $PHP_SELF, $new_file;
  if(file_exists("$dir/$filename")) {
    if($new_file=0){
      echo "<SCRIPT>result=confirm(\"Overwrite '$dir/$filename'?\");     
      if(!result) history.go(-1);</SCRIPT>";
    }
    else{
      $new_file=0;
    }
  }
  if($file = fopen("$dir/$filename", "w")) {
      fputs($file, $filebody);
      fclose($file);
  if(file_exists("$dir/$filename")) echo " file now exists...";
  }
  else {
      error_message("Can't save file $dir/$filename.");
  }
echo "<SCRIPT>parent.location.href='$PHP_SELF?action=dir_page\&dir=$dir';</SCRIPT>";
echo "<SCRIPT>self.location.href='$PHP_SELF?action=editor_page\&dir=$dir\&filename=$filename';</SCRIPT>";
}

function editor_page() {
  global $dir, $filename, $default_filename;
  $is_new = 0;
 
  if($filename == '') {
      $filename = $default_filename;
      $is_new = 1;
  }

  if(!file_exists("$dir/$filename")) $is_new = 1;

  if(!$is_new) {

  edit_new_form();
  ?>
  <TABLE BORDER="1" WIDTH="100%">
  <TR><TH WIDTH="100%" COLSPAN="2">
  <CENTER><STRONG>Stats for <?php echo "$dir/$filename" ?>
  </TD></TR>

  <?php
  $file_info_array = file_info("$dir/$filename");
  foreach($file_info_array as $key=>$val) {
      echo "<TR><TH WIDTH=\"30%\">". ucfirst($key) .
          "</TD><TD WIDTH=\"70%\">" . $val .
          "</TD></TR>\n";
  }
?>
</TABLE>
<?php

  } else {

      echo "<CENTER><STRONG>Editing a new file</STRONG></CENTER>\n";
  }
  editor_form($dir, $filename, $is_new);
}

$def_length=strlen($default_dir);
if(!empty($dir)) $dir_test=substr($dir, 0, $def_length);

if(empty($dir) || ($dir_test!=$default_dir)) {
  $dir = $default_dir;
}

?>
Avatar billede langbein Nybegynder
21. august 2004 - 16:14 #3
Og så skjøter den vel inn en slags hjelpefil, common.inc:

<?php

// $default_dir = "./docs";

$default_dir = "/var/www/html/phptest/wrox/ch10/docs";
$default_filename = "new.txt";
$edit_form_cols = 80;
$edit_form_rows = 25;
$text_file_array = array( "txt", "htm", "html", "php", "inc", "dat" );
$image_file_array = array("gif", "jpeg", "jpg", "png");

function html_header() {
  ?>
  <HTML>
  <HEAD><TITLE>Welcome to Web Text Editor</TITLE></HEAD>
  <BODY>
  <?php
}

function html_footer() {
  ?>
  </BODY>
  </HTML>
  <?php
}

function error_message($msg) {
  html_header();
  echo "<SCRIPT>alert(\"$msg\"); history.go(-1)</SCRIPT>";
  html_footer();
  exit;
}

function date_str($timestamp) {
  $date_str = getdate($timestamp);
  $year = $date_str["year"];
  $mon = $date_str["mon"];
  $mday = $date_str["mday"];
  $hours = $date_str["hours"];
  $minutes = $date_str["minutes"];
  $seconds = $date_str["seconds"];
 
  return "$hours:$minutes:$seconds $mday/$mon/$year";
}

function file_info($file) {
  global $text_file_array, $WINDIR;

  $file_info_array["filesize"] =
                  number_format(filesize($file)) . " bytes.";
 
  $file_info_array["filectime"] = date_str(filectime($file));
  $file_info_array["filemtime"] = date_str(filemtime($file));
  if(!isset($WINDIR)) {
      $file_info_array["fileatime"] = date_str(fileatime($file));
      $file_info_array["filegroup"] = filegroup($file);
      $file_info_array["fileowner"] = fileowner($file);
  } else {
      $file_info_array["fileatime"] = "not available";
      $file_info_array["filegroup"] = "not available";
      $file_info_array["fileowner"] = "not available";
  }

  $extension = array_pop(explode(".", $file));

  if(in_array($extension, $text_file_array))
              $file_info_array["filetype"] = "text";
  else $file_info_array["filetype"] = "binary";

  return $file_info_array;
}

?>
Avatar billede langbein Nybegynder
21. august 2004 - 16:15 #4
Men Apachen min gjenkjenner nok ikke .inc som en php fil. Mon det skulle ligge noe der ??
Avatar billede langbein Nybegynder
21. august 2004 - 16:17 #5
Jeg har ellers redigert inn directory navn slik at det skal passe med min server. Passer nok ikke inn noen andre steder:

$default_dir = "/var/www/html/phptest/wrox/ch10/docs";
Avatar billede langbein Nybegynder
21. august 2004 - 16:36 #6
Forsøkte å endre php.conf slik at den skulle kjennei igjen .inc som php fil. Dette hjalp ikke.
Avatar billede detox Nybegynder
21. august 2004 - 16:48 #7
Det er rigtig nok meget indviklet lavet og samtidig på flere måder en gammel kode.
Det ser ud til at scriptet bl.a. er afhængig af register_globals = On. Ligesom der oose er mange forældede html tags. Jeg tror det bliver for besværligt at rette til og du vil få mere ud af at lave et helt nyt.
Jeg kan heller ikke se at funktionen: save_file() overhovedet bliver kaldt på noget tidspunkt.
Avatar billede detox Nybegynder
21. august 2004 - 17:48 #8
Det er nærmest som om der mangler en del til at kalde nogle af de forskellige funktioner.
Avatar billede langbein Nybegynder
21. august 2004 - 20:48 #9
Jo, jeg har heller ikke blitt helt klok på den.

Har inntrykk av at det er flere PHP bøker som gjør akkurat dette, nemlig å blåse opp det som egentlig skulle vært en rimelig enkel kode til noe nesten uoverskuelig. Av de eksemplene som jeg har fått til å fungere, så har jeg skrevet flesteparten om til ca 30 % av den opprinnelige kode. 70 % har blitt redigert bort, og fremdeles så har scriptet gjort det samme, men da på en rimelig overskuelig måte. Sikkerhet og slike ting har sikkert blitt dårligere, men i det minste så er det mulig å forstå sånn noenlunde hvordan det fungerer.

Vil forsøke å sjekke på dette med register_globals (uten at jeg egentlig vet hva dette er :)
Avatar billede langbein Nybegynder
21. august 2004 - 21:13 #10
Nå vet jeg hva register_globals er !!

Dette står dokumentert inne i php.ini filen:

; You should do your best to write your scripts so that they do not require
; register_globals to be on;  Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
register_globals = On

Jeg satte registerglobals til "On" også kjørtebåde dette og noen andre script som et skudd !  Læreboken hører tydeligvis ikke til de aller beste ..

detox -> Takker for hjelpen - dette hadde jeg aldri funnet ut av på egen hånd !!

Har du ellers noe forslag til en PHP bok som er "god" og "passe moderne" (For PHP 5 er vel ikke særlig mye i bruk ennå .. Eventuelt adresse til en web side med gode eksempler, for det er helt klart at de PHP bøkene som jeg harstående ikke holder mål ut fra "dagens standard".

Kan du legge et "svar" !? Du løste faktisk hele problemet !
Avatar billede langbein Nybegynder
21. august 2004 - 21:21 #11
Avatar billede detox Nybegynder
21. august 2004 - 21:37 #12
Godt du fik det løst. Jeg vil råde dig til at sætte: register_globals = Off og lære at programmere ud fra det. Et andet godt råd der hjælper til at kode korrekt er at sætte: error_reporting  =  E_ALL, ligeledes i php.ini.
Jeg kender ikke nogen bøger om php, men der findes en masse gode websider.
Først og fremmest online-manualen:
http://dk2.php.net/manual/da/index.php

Eksempler på sider med mange tutorials:

http://www.phpfreaks.com/
http://www.oxyscripts.com/
http://www.devshed.com/
http://www.zend.com/zend/tut/index.php
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

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