[PHP] updatescript

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Ik ben bezig met het schrijven van een updatescript voor php. Wat hou het in? Je hebt een php-pagina, bijvoorbeeld index.php, met heel veel code. Dan krijg je van mij update.php die bepaalde strings opzoekt en bewerkt (verwijderen, verplaatsen of toevoegen, noem maar op).

Waarom dit script? Om gebruikers die geen verstand van php hebben het gemakkelijk te maken om update's uit te voeren.
Waarom dan niet het gehele bestand verwijderen en de nieuwe installeren? Omdat dan verandereingen die door de gebruikers zelf zijn uitgevoed verloren gaan.

Wat is mijn probleem? Op dit moment kan ik enkel een enkele regel updaten. Dus als de code uit meerdere regels bestaat dan vindt hij hem niet :S. Ik denk dat dat te maken heeft met returns en tabs.

Wordt wel gevonden:
code:
1
$warning .= "Cannot open file ($filename).<br />";


Wordt niet gevonden:
code:
1
2
3
4
if (!$handle = fopen($filename, "r+")) {
    $warning .= "Cannot open file ($filename).<br />";
    exit;
}


Dit is mijn code tot nu toe.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
function update_file($filename, $search, $replacement, $rowinfo){
    // Let's make sure the file exists and is writable first.
    if (is_writable($filename)) {
    
        // In our example we're opening $filename in append mode.
        // The file pointer is at the bottom of the file hence
        // that's where $somecontent will go when we fwrite() it.
        if (!$handle = fopen($filename, "r+")) {
            $warning .= "Cannot open file ($filename).<br />";
            exit;
        }
    
        // Read the content out the file
        $contents = fread($handle, filesize($filename));
        
        // Replace the content with the new content
        $newcontent = str_replace(stripslashes($search),stripslashes($replacement),$contents);
        
        // Rewind the position of a file pointer. Otherwise the new text wil be placed behind the old text
        rewind($handle);
        
        // Write $somecontent to our opened file.
        if (fwrite($handle, $newcontent) === FALSE) {
            $warning .= "Cannot write to file ($filename).<br />";
            exit;
        }
        
        // Flushes the output to a file, function? I don't know.
        fflush($handle);
        $warning .= "Success, update file ($filename, $rowinfo).<br />";
        
        // Truncates a file to a given length.
        ftruncate($handle, ftell($handle));
        
        // Close file
        fclose($handle);
    
    }else{
        $warning .= "The file $filename is not writable.<br />";
    }
    return $warning;
}

//edit index.php
$file = "index.php";

//the rownumbers can be different
$rowinfo = 'information';
$search = 'change this';
$replacement = 'into this';
echo update_file($file,$search,$replacement,$rowinfo);
?>


Heeft iemand dit probleem al opgelost. Of weet een php functie voor de returns en de tabs. Laat het me weten. :)

[ Voor 16% gewijzigd door donderklik op 02-12-2005 12:01 . Reden: Was nog niet klaar met het bericht, maar had het al verstuurd 8)7 ]

Northing.nl


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat bedoel je met updaten? Gewoon HTML aanpassen ofzo?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
PHP of HTML, dat maakt niet uit. Maar ik wil graag PHP updaten.

Northing.nl


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Ik heb zo mijn twijfels bij het zoeken naar stukken code, en deze te laten vervangen. Is het niet makkelijker om alle dingen die gebruikers kunnen aanpassen in losse bestanden te zetten? Mij lijkt de kans op fouten namelijk nogal groot bij jouw oplossing.

Als enigste een -soort van- oplossing zou je natuurlijk code-blokken ook gewoon regel voor regel kunnen aanpassen. En in geval van meerdere blokken met de zelfde code, zou je er boven en onder een regel commentaar kunnen opnemen, om het juiste blok te kunnen herkennen.

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

donderklik schreef op vrijdag 02 december 2005 @ 12:02:
PHP of HTML, dat maakt niet uit. Maar ik wil graag PHP updaten.
Je wil mensen die niets van PHP snappen PHP files laten updaten? :?

Kijk eens naar preg_replace trouwens, eventueel met de multiline modifier.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Als je veel code moet veranderen dan lijkt mij een updatescript handiger. Ik lever daarnaast er natuurlijke een handleiding bij voor het geval als je het handmatig wilt updaten.
-NMe- schreef op vrijdag 02 december 2005 @ 12:22:
[...]

Je wil mensen die niets van PHP snappen PHP files laten updaten? :?

Kijk eens naar preg_replace trouwens, eventueel met de multiline modifier.
Wat is een multiline modifier?

Northing.nl


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Dankje wel! Ik zal het ff lezen en uitproberen. Als het gelukt is dan zet ik hier de nieuwe code neer.

Northing.nl


Acties:
  • 0 Henk 'm!

  • sariel
  • Registratie: Mei 2004
  • Laatst online: 22-05-2024
Is het niet gewoon makkelijker om nieuwe versies van een bestand te sturen, en te zeggen "kopieer dit bestand hier, en dat bestand daar" ?

Copy.com


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
sariel schreef op vrijdag 02 december 2005 @ 12:51:
Is het niet gewoon makkelijker om nieuwe versies van een bestand te sturen, en te zeggen "kopieer dit bestand hier, en dat bestand daar" ?
Dan gaan de eigen wijzigingen verloren?

Is het geen idee om te kijken naar de opzet van je code? Je kunt bijvoorbeeld iets als hooks implementeren. Dit is in o.a. Typo3 geimplementeerd: http://typo3.org/developm...ow-to-use-existing-hooks/ Je kunt dan stukken code afzonderlijk van elkaar maken. Je kunt dus de user-code apart houden van je eigen code. Dat lost je probleem op volgens mij?

Acties:
  • 0 Henk 'm!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 18-09 22:12
Zou het niet gewoon handiger zijn een diff tool te gebruiken hiervoor? Hierin zit veel meer functionaliteit en intelligentie dan je zelf kunt maken. Je zou zelf een wrapper kunnen schrijven (in PHP of een andere taal) die diff automatisch voor je uitvoerd en de user alert bij problemen (merge conflicten).

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Waarom dan niet het gehele bestand verwijderen en de nieuwe installeren? Omdat dan verandereingen die door de gebruikers zelf zijn uitgevoed verloren gaan.
En wat nu als jou aanpassing conflicteerd met de aanpassing die de gebruiker zelf gedaan heeft?
Wat nu als een gebruiker een stukje aangepast heeft in de code die jij moet vervangen? Wat nu als je daardoor enkel de helft van een patch uitvoert? Wat nu als een stukje code dat jij gaat vervangen exact ook zo voorkomt in een stukje door de gebruiker aangepaste code?

Er zitten zo enorm veel haken en ogen aan dat dit zo goed als zeker mis zal gaan. Het lijkt me handiger dat je, in het geval van een update van aangepaste source code, zelf een diff opvraagt bij de gebruiker (verschil tussen orgineel en door gebruiker aangepaste versie) en hiermee vervolgens een specifieke patch of gewoon nieuwe versie maakt.

Of dat je duidelijke punten definieerd waarop de gebruiker in mag pluggen voor zijn specifieke code. Hierdoor hoef je alleen maar te zorgen dat je contract gelijk blijft en kun je rustig al je eigen bestanden vervangen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Als eerste moet ik uitzoeken hoe ik überhaupt de code kan replacen.

Wanneer de code al is veranderd of niet bestaat gaat hij een foutmelding geven dat hij de code niet kan vinden. Je krijgt een handleiding te zien wat de nieuwe code doet, hoe het eruit ziet en waar de code geplaatst moet worden. Zodat je het handmatig kunt veranderen.

Als laatste zorg ik ervoor de het bestand niet wordt overschreven, maar er wordt een nieuw bestand aangemaakt (zoiets index.php.new). De gebruiker kan de code handmatig doorzoeken of alles is goed gegaan en dan aanpassen of het oude bestand overschrijven.

Wat in de toekomst misschien kan is de hele code in een textarea te zetten zodat de gebruiker de code gelijk kan aanpassen en dan deze code als nog overschrijven.

Genoeg mogelijkheden om het veilig te updaten denk ik. :)

------------------ verder redeneren
Wat wel een probleem zou zijn als de gebruiker stukken code heeft verplaatst om een of andere reden. De code zal dan worden veranderd. In dit geval is het beter om de code in een nieuwe file op te slaan. :*)

[ Voor 14% gewijzigd door donderklik op 02-12-2005 13:44 . Reden: verder redeneren ]

Northing.nl


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Blijft tot slot nog het punt staan dat je complete applicatie dir world writable moet staan. Dat lijkt me nou niet de meest ideale server instelling.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Er moet een updater komen voor mensen die geen verstand van PHP hebben, maar daar naast moeten de gebruikers wel zelf aanpassingen maken, en ook als aller laatste nog eens controleren of alle aanpassingen door de updater wel kloppen? Hmm.... :{ :?

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Blijft tot slot nog het punt staan dat je complete applicatie dir world writable moet staan. Dat lijkt me nou niet de meest ideale server instelling.
Idd, dit zou een probleem kunnen zijn. Je zou tijdelijk de rechten moeten aanpassen, bedankt voor de "note". Weer stof om over na te denken _/-\o_
Er moet een updater komen voor mensen die geen verstand van PHP hebben, maar daar naast moeten de gebruikers wel zelf aanpassingen maken, en ook als aller laatste nog eens controleren of alle aanpassingen door de updater wel kloppen? Hmm.... :{ :?
Niet alles is perfect. Ik probeer gebruikers het alleen iets gemakkelijker te maken. ;)

Ik heb nu dit stuk code
code:
1
$newcontent = preg_replace ("/($search)/m","/($replacement)/m",$contents);

De /m moet er voor zorgen dat de variable als multiline wordt gelezen. Het werkt niet geheel en ik kan geen goede voorbeeld vinden die mij verteld hoe het wel moet. Iemand suggesties?

[ Voor 9% gewijzigd door donderklik op 02-12-2005 14:21 . Reden: code verbetering ]

Northing.nl


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

donderklik schreef op vrijdag 02 december 2005 @ 14:08:
Niet alles is perfect. Ik probeer gebruikers het alleen iets gemakkelijker te maken. ;)
I know. Ik zit ook vaak met zulke problemen; hoe geef je gebruikers zo veel mogelijk opties, zonder dat ze er verstand van hoeven te hebben.

Daarom vroeg ik mij ook af, in hoeverre het mogelijk is om de stukjes die gebruikers kunnen aanpassen, in losse bestanden te zetten? Geen idee wat gebruikers allemaal aan kunnen (of moeten) passen?

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Als gebruikers enkel de HTML hoeven aan te passen, neem dan een template engine. Ook kan je een SQL engine toevoegen, zodat je al 3 bestanden hebt ipv 1.

Verder ben ik het volledig met Janoz eens! Ik laat met mijn project (phpmyserver) mensen gewoon zelf hun code aanpassen. Echter krijgen ze dan geen support meer, daar ben ik heel simpel in. Omdat ik dan moet denken waar het in "mijn" code fout gaat EN in hun code. Oké, wat minder handig voor de user kwa toevoegingen, maar dan dienen ze gewoon modules te gebruiken die ik aanbied binnen mijn project. Die zijn vrij universeel, en kunnen ze veranderen zonder dat het "hoofd" script ergens last van heeft.

Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Verwijderd schreef op vrijdag 02 december 2005 @ 17:18:
Als gebruikers enkel de HTML hoeven aan te passen, neem dan een template engine. Ook kan je een SQL engine toevoegen, zodat je al 3 bestanden hebt ipv 1.

Verder ben ik het volledig met Janoz eens! Ik laat met mijn project (phpmyserver) mensen gewoon zelf hun code aanpassen. Echter krijgen ze dan geen support meer, daar ben ik heel simpel in. Omdat ik dan moet denken waar het in "mijn" code fout gaat EN in hun code. Oké, wat minder handig voor de user kwa toevoegingen, maar dan dienen ze gewoon modules te gebruiken die ik aanbied binnen mijn project. Die zijn vrij universeel, en kunnen ze veranderen zonder dat het "hoofd" script ergens last van heeft.
Ik heb een hack gemaakt voor Pixelpost. Omdat ik door de hele code van Pixelpost veranderingen heb aangebracht ben ik een update script gaan schrijven. Natuurlijk krijgen ze geen support als het mis gaat. Zoals ik al zei niet alles is perfect.
Op een standaard Pixelpost van de juiste release (dus zonder hacks!!!) zal de script zeker goed gaan werken. Daar heb ik immers alle controle op. Anders moet de gebruiker alles handmatig invoeren OF achteraf de code controlleren.

Mijn idee is nu dat je het script upload en vervolgends start. Daarna krijg je de nieuwe bestanden als downloads aangeboden. Snel, save en simpel. :)

Inmiddels heb ik de script aan de gang gekregen. Ik moet nog de foutmeldingen verbeteren en de downloads voorbereiden. Dan zal ik het script hier plaatsen.

[ Voor 5% gewijzigd door donderklik op 02-12-2005 19:12 ]

Northing.nl


Acties:
  • 0 Henk 'm!

  • PowerSp00n
  • Registratie: Februari 2002
  • Laatst online: 19-08 08:24

PowerSp00n

There is no spoon

Maarum, is diff niet gewoon handiger? (http://en.wikipedia.org/wiki/Diff)

Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Ja dat zou gaaf zijn. Ik heb diff bekeken en er is een php plugin van diff met de naam xdiff. http://fi2.php.net/xdiff
Maar volgens mij kleven er een aantal nadelen aan (corrigeer me als ik het mis heb):
1) de plugin is niet standaard geinstalleerd;
2) er is geen windows variant van de plugin.

Natuurlijk kun je het programma diff of fc (File Compare) voor Windows gebruiken, maar dat wil ik externe programma's vermijden.

Misschien dat ik het verkeerde commando gebruik, maar (x)diff lijkt mij geen goede oplossing. een soortgelijke oplossing zou wel beter dan mijn oplossing zijn. Suggesties?

Northing.nl


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
PEAR::Text_Diff is een optie.

Acties:
  • 0 Henk 'm!

  • donderklik
  • Registratie: Januari 2004
  • Laatst online: 07-09-2023

donderklik

northing.nl

Topicstarter
Moet de ontvanger van de update ook PEAR::Text_Diff gebruiken?

Northing.nl


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

je zou kunnen werken met custom tags om de code blocks heen waarin de huidige versie of build staat.
Dan met een functie als preg_match bijvoorbeeld de code tussen de tags selecteren en vervangen.

Ik denk zelf dat je gewoon liever gewoon de complete bestand zou moeten aanbieden ipv delen proberen te updaten.

[ Voor 29% gewijzigd door aex351 op 02-12-2005 21:13 ]

< dit stukje webruimte is te huur >

Pagina: 1