24. maj 2004 - 03:21Der er
20 kommentarer og 1 løsning
Jeg vil lære PHP, og her er grunden til det
Hej PHP/eksperter!
Jeg har et ASP script som virker fint på IIS, og bruger FSO (file system object) til at læse filer af typen ".htm" i en bestemt folder, og sorterer og viser links til disse .htm filer via ADODB (connection-less recordsets).
Når jeg uploader dette script til en unix-baseret maskine (som kører Sun ASP) går alle mulige ting galt! For det første, så er FSO understøttelsen fuldstændig udokumenteret, så man skal forsøge sig frem, og for det andet mangler standard kommandoer som .Append i Sun's implementering af ADODB!!
Så jeg har besluttet at lære PHP, men har selvfølgelig brug for inspiration til at komme i gang (og har ikke tænkt mig at tage en måned fri for at læse en tyk bog - det bliver nødt til at vente til sommerferien;-).
Derfor har jeg lagt funktionerne i min asp/vbscript løsning op i sin fulde længde, og håber at en flink person kan vise mig hvilke kommandoer jeg bedst kan anvende for at lave en lignende funktionalitet, blot i PHP (og som en gulerod giver jeg 250 point, selvom det jo nærmest burde være kr,-)
Jeg har tilføjet en del kommentarer (på engelsk!) - forhåbentlig er det tydeligt hvad der foregår. Ellers spørg, så jeg kan forsøge at uddybe nærmere...
Here goes! --------------------------------------------------- <% ' Return a list of the files in the named directory ' (strFolder) that match the given file extension (strExt) ' Function getDirContents(strFolder,strExt)
Dim fso,oRs,file,outputStr,folderObject,filesObject,tmpPgTitle,tmpModif
Set fso = CreateObject("Scripting.FileSystemObject") Set folderObject = fso.GetFolder(Server.MapPath(strFolder)) Set filesObject = folderObject.Files
'Use the recordset object to emulate a table. Set oRs = CreateObject("ADODB.Recordset") oRs.Fields.Append "ID", 3 oRs.Fields.Append "Name", 200, 100 oRs.Fields.Append "LastModified", 133 oRs.Open
' Create the entries in the recordset For Each file In filesObject
' Only add files with an allowed extension If fso.GetExtensionName(Server.Mappath(file.Name)) = strExt Then
' Prepare for new item oRs.AddNew
' Fill in each field oRs.Fields("Name").Value = file.Name oRs.Fields("LastModified").Value = file.DateLastModified
' Add the item to the recordset oRs.Update End If Next
' Now we can release the file system object from memory Set filesObject = Nothing Set folderObject = Nothing Set fso = Nothing
' Use the ADODB to sort the recordset oRs.Sort = "LastModified DESC"
' Set cursor to the beginning of our recordset If Not oRs.BOF Then oRs.MoveFirst End If
' Loop through the recordset While not oRS.EOF
' Display just the date, not date+time format. Achived by ' including just the first 10 characters of "LastModified" tmpModif = Left(oRs.Fields("LastModified").Value,10)
' Get the <title> attribute if present. Otherwise, use the filename tmpPgTitle = extractTitleAttr(getFileContents(strFolder & oRs.Fields("Name").Value)) & "" If tmpPgTitle = "" Then tmpPgTitle = oRs.Fields("Name").Value End If
' Extract the <title> attribute of a string ' using regular expressions Function extractTitleAttr(strng)
Dim regEx, Match, Matches, outputStr
Set regEx = New RegExp regEx.Pattern = "(\<TITLE\>)(\s*)(.+)(\s*)(\<\/TITLE\>)" regEx.IgnoreCase = True Set Matches = regEx.Execute(strng)
' Iterate Matches collection For Each Match in Matches ' Extract the 3rd submatch (the title) Set Match = Matches(0) extractTitleAttr = Match.SubMatches(2) Next
Set regEx = Nothing Set Match = Nothing Set Matches = Nothing Set outputStr = Nothing
End Function
' Return the contents of a file as a string ' Function getFileContents(strHTMLFile)
Dim fso,objText
' Establish a connection to the FSO (FileSystemObject) Set fso = Server.CreateObject("Scripting.FileSystemObject")
' If the file passed as argument exist If fso.FileExists(Server.MapPath(strHTMLFile)) Then ' Read the contents of the file Set objText = fso.OpenTextFile(Server.MapPath(strHTMLFile)) getFileContents = objText.ReadAll objText.Close Set objText = Nothing Else ' File does not exist - output message getFileContents = "Der opstod en fejl - prøv evt. et andet link" End If Set fso = Nothing End Function
AI bliver først for alvor en del af arbejdet, når teknologien integreres i den måde, vi arbejder på. At have adgang til AI betyder ikke nødvendigvis, at medarbejderne er klar til at bruge den.
hmm, du vil læse et dir igennem for html filer, og vise et link til hver fil, og hvis der er <title>Titel</title> så vise den ved siden af linket? Og er der klikket på en fil, så vil du vise indholdet af filen?
Hej Sostack! Jeg henter Apache + PHP og installerer det på min arbejds-PC, så jeg kan teste eksemplet. Men er det skrevet specifikt til unix/pc, eller "cross-platform" ? Jeg spørger, da jeg ikke kan se det udfra koden. Og jeg kan sagtens installere på en unix maskine hvis det er tilfældet!
Og Sukos - du har forstået scriptet helt korrekt - blot sker der det, når man klikker på et link, at "default.asp" (som jo nok kommer til at hedde noget andet - hehe) sørger for at inkludere filen som er nævnt i forespørgelsværdien "url" i siden. Ikke noget mystik der, da siden kalder getFileContents() til at udføre denne "conditional include".
Sostack - jeg har nu installeret Apache2 m. PHP4, og selvom det ikke er en anbefalet kombination virker dit eksempel fint! Og jeg er sgu' imponeret over PHP's syntax - din kode fylder ikke ret meget, men selvfølgelig er jeg fyldt med sprgsm. som trænger sig på; specielt tænker jeg på at en del af mit eksempel handler om at finde matches på ".htm" extension, og så sortere dem efter hvornår de sidst er blevet ændret.Vil det være muligt med arrays i PHP, eller findes der andre/nemmere metoder til at sortere?
Sådan en funktion - hedder det i det hele taget funktioner i PHP? - kan i øvrigt også bruges til at vise hvornår der sidst er foretaget ændringer i mappen som helhed.
Der er nu ellers lidt "bøf" i dit script, sostack :O)
Hvis nu der er en masse javascript, før title? Hvis nu <title> skrives <TITLE>? Eller filer hedder .HTM og ikke .htm?
anyway, har osse prøvet lidt, men dog ikke med nogen former for sortering
<?php
$readdir = "/dir/"; // Dir som skal læses, med skråstreg først og sidst
function changed($var) { return "Sidst ændret d. ". date("d-m-y H:i:s", filemtime($var)); }
function list_files($var) { global $allfiles, $error_string; $allfiles = array(); $error_string = "<br>\nFejl ved læsning af dir!<br>\nDet findes ikke"; $dir = $_SERVER["DOCUMENT_ROOT"] . $var; // Dir som skal læses igennem
Fedt, tak, point!!! Du har opnået gudestatus hos mig:-) Du kan i øvrigt se resultatet når Nørrebro festivalens hjemmeside (norrebro-festival.dk) går i luften i næste uge - forhåbentlig har jeg fået styr på the "missing pieces" til den tid.
Hvis der kan være meget javascript først i filerne, kan man bare ændre $indhold = fread($fh, 256); til f.eks: $indhold = fread($fh, filesize($file)); så skal man skrive meget script-code ;-)
Og > sukos, vær ikke hård mod sostack, han kom hurtigt frem med et script som er en udemærket "primer" der fortæller en total PHP-newbie som mig hvordan det gøres. Det med at tjekke, og dobbelt-tjekke, er selvfølgelig detaljer som skal på plads, men som det (måske) fremgår at mit eget script er det en masse ekstra kode som faktisk fjerner fokus fra hvad der *egentlig* foregår.
Og-og > sukos du har lige vist mig hvordan jeg pakker det hele ind i funktioner. Så du skal sgu' også have tak (sikken masse roser jeg deler ud i dag :-))
Sukos > har lige prøvet dit script, det spiller bare!!
Synes godt om
Ny brugerNybegynder
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.