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 :)
detox Nybegynder
21. august 2004 - 15:52 #1
Hvordan ser php koden ud?
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;
}

?>
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;
}

?>
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 ??
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";
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.
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.
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.
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 :)
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 !
langbein Nybegynder
21. august 2004 - 21:21 #11
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
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

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





Premium
Mystikken breder sig om pludselig fyring af Waoo-topchef efter alvorlige beskyldninger: Selskabet er fuldkomment tavst
Mystikken breder sig om årsagen til, at Waoo med øjeblikkelig virkning har fyret topchef Jørgen Stensgaard. Spørgsmålene hober sig op, men der er total tavshed hos Waoo og selskabets bestyrelse, der ikke vil stille op til interview. Her er hvad, vi ved.
Computerworld
TDC ruller gratis fiber ud til 5.100 danske husstande - se adresserne her
TDC går i gang med at udruller fiber til tusindvis af danske husstande i Odens, Nordsjælland og Storkøbenhavn. Se hvor TDC’s gravemaskiner kommer forbi med tilbud om gratis fiber-opkobling.
CIO
Podcast: Hos Viking Life-Saving Equipment er it gået fra at være backend til at være noget, som kunderne spørger aktivt efter
Podcast, The Digital Edge: Viking leverer en stadig større del af deres produkt som en tjeneste. Som en del af tjenesten tager Viking ansvar for sikkerheden ved at levere, dokumentere og vedligeholde det nødvendige sikkerhedsudstyr. Hør hvordan Henrik Balslev senior digital director hos Viking har løftet den opgave.
Job & Karriere
Regner din ferie væk? Brug tiden på at søge en af disse otte stillinger, der er ledige netop nu
Det sjasker ned over hele Danmark. Du kan bruge de våde sommerdage på at søge et af disse otte job, der er ledige lige nu.
White paper
Sådan opbevarer du effektivt og sikkert dine data – også med hybrid cloud
Cloud er her der og alle vegne. Men mange organisationer foretrækker en mere blandet tilgang, hvor dele af virksomhedens workload og it-miljøer sendes i clouden, mens andre dele placeres i andre og ofte lokale datacentre. Det stiller ofte mange forskelligartede krav til behovet for lokal storage. Men med IBM FlashSystem kan du konsolidere dit storage-behov og reducere kompleksiteten. Samtidig er FlashSystem all-flash og hybrid-løsninger bygget på et standardiseret sæt af værktøjer og APIs, som giver dig adgang til enterprise-løsninger uanset størrelsen på din organisation. I dette whitepaper fra Atea og IBM kan du læse om IBMs storeløsninger og de yderligere fordele som du kan opnå med dem.