Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] file_put_contents in PHP4



Armitage2k
04.10.2006, 17:12
hey.
Ich such nach einer Alternative zum PHP5 Befehl "file_put_contents" aber in PHP4.
Kennt da jemand eine Funktion die dasselbe in nur PHP4 machen würde? Aus dem Handbuch (http://at.php.net/manual/de/function.file-put-contents.php) werd ich irgendwie nicht schlau....

greets,
A2k

NPC Fighter
04.10.2006, 17:20
Du kannsts mehrschrittig in der traditionellen Art machen.


<?php
$file = "datei.txt";
$content = "Dieser tolle Text wird in die Datei geschrieben.";
$handle = fopen($file, "w");
fwrite($handle, $content);
fclose($handle);
?>

Alternativ könntest du die Funktion aber auch selbst schreiben.

Armitage2k
04.10.2006, 17:41
Alternativ könntest du die Funktion aber auch selbst schreiben.

....? Wie soll ich mir denn nen PHP5 basierenden Code in PHP4 selber coden?

Ich brauch den Befehl für mein Editor-Popup auf meiner Website, kann mir aber grad nicht so richtig vorstellen wie ich den einbauen kann. Wäre also sehr dankbar wenn mich da wer unterstützen könnte ;)
BTW, gilt eigentlich "get_file_contents" in PHP4?



<p>

<?php
if($_POST['text'])
file_put_contents('index_news.txt', $_POST['text']);
?>
<form method="post" action="news_edit.php" name="source_edit" id="formular">
<table>
<tr>
<td style="padding:2px"><strong>News_Index.txt Source Inhalt:</strong></td>
</tr>
<tr>
<td style="padding:2px">
<textarea cols="140" rows="15" name="text"><?php echo file_get_contents('index_news.txt'); ?></textarea>
</td>
</tr>
<br />
<tr>
<td align="center" style="padding:2px">
<input name="submit" type="submit" id="speichern" value="Speichern" />
<input name="loeschen" type="reset" id="loeschen" value="Zur&uuml;cksetzen" />
<br />
<input name=sbm type=submit value=Close onClick=window.close() />
</td>
</tr>
</table>
</form>

</p>


THX,
A2k

drunken monkey
04.10.2006, 18:17
....? Wie soll ich mir denn nen PHP5 basierenden Code in PHP4 selber coden?
Wurde dir doch schon hier erklärt... (http://www.multimediaxis.de/showthread.php?p=1560938&highlight=file_put_contents#post1407761)
file_put_contents ist keine wirklich neue Funktion, sie setzt quasi einfach nur mehrere Funktionen aneinander, wie Dingsi es halt schreibt. Wenn du also den von ihm beschriebenen Code oben in deine PHP-Datei einfügst, klappt's auf jeden Fall. Oder halt in eine Extra-Datei, und per require ("functions.php") einbinden.

BTW, gilt eigentlich "get_file_contents" in PHP4?
1. Die Funkton heißt "file_get_contents".
2. Ab 4.3.0, laut Manual. Mit älterer Version, analog zu oben:

if(!function_exists("file_get_contents"))
{
function file_get_contents($filename)
{
$file = file ($filename);
return implode ('\n', $file);
}
}


if($_POST['text'])
if (isset ($_POST['text']))
ist afaik sauberer.

mitaki
05.10.2006, 02:00
Alternativ kann man einige neue PHP Funktionen mit dem Pear Kompatibilitätspaket in älteren Versionen verfügbar machen.

Armitage2k
05.10.2006, 17:27
hmm... kann mir da einer sagen warum ich da keine stripslashes()-funktion einbauen kann?



<?php

if(!function_exists("file_get_contents"))
{
function file_get_contents($filename)
{
$file = file ($filename);
return implode ('\n', $file);
}
}

function file_put_contents($n,$d) {
$f=@fopen($n,"w");
if (!$f) {
return false;
} else {
stripslashes(
fwrite(($f),$d);
fclose($f);
)
return true;
}
}
?>

mitaki
05.10.2006, 17:40
Vermutlich weil Funktion und Klammern falsch verschachtelt sind.


function file_put_contents($n,$d) {
$f=@fopen($n,"w");
if (!$f) {
return false;
} else {
fwrite($f,stripslashes($d));
fclose($f);
return true;
}

Müsste richtig sein.
Tipp: Funktionsparamenter besser beschriften, bessere Einrückung und einen Editor mit Syntaxhighlighting verwenden ;)

Niwa Daisuke
06.10.2006, 09:08
2. Ab 4.3.0, laut Manual. Mit älterer Version, analog zu oben:

if(!function_exists("file_get_contents"))
{
function file_get_contents($filename)
{
$file = file ($filename);
return implode ('\n', $file);
}
}
Ohne trim sind bei file sowieso die \n am Ende der Zeile noch vorhanden, oder?

drunken monkey
06.10.2006, 11:33
Ohne trim sind bei file sowieso die \n am Ende der Zeile noch vorhanden, oder?
Ups, wirklich? Habe ich nicht geschaut/dran gedacht, aber wenn's so ist, einfach statt "return implode ('\n', $file);" "return implode ('', $file);" verwenden. :)
Wirst du ja dann sehen, A2k, wenn in der Datei immer gleich zwei Zeilenumbrüche hintereinander sind. <_<'

Und ich würde btw auch vor die Funktionsdefinition von file_put_contents eine "if (! function_exists ("file_put_contents"))"-Abfrage machen. Könnte sonst evtl. Probleme geben, wenn du auf PHP 5 aufrüstest. ^^'

Niwa Daisuke
06.10.2006, 12:09
Wirst du ja dann sehen, A2k, wenn in der Datei immer gleich zwei Zeilenumbrüche hintereinander sind. <_<'
Hab's am localhost getestet und da werden die '\n's als Text ausgegeben. Setzt man sie allerdings im Code zwischen "", werden sie zu richtigen Zeilenumbrüchen.
Weiß wer, warum?

drunken monkey
06.10.2006, 17:16
Hab's am localhost getestet und da werden die '\n's als Text ausgegeben. Setzt man sie allerdings im Code zwischen "", werden sie zu richtigen Zeilenumbrüchen.
Weiß wer, warum?
Klar, ich. <_< Weil bei Strings in einfachen Anführungszeichen Escape-Sequenzen (außer "\'") grundsätzlich nicht erkannt werden, ich aber zu dumm war, mir das richtig zu merken. -_- Ich dachte, Zeilenumbrüche würden schon gehen, bei doppelten Anführungszeichen könnte man ja auch einfache Zeilenumbrüche verwenden. Tja, so kann man sich irren...-_-
Dieses file_put_contents wird noch mein Waterloo...

Aber Zeilenumbrüche sind nach den "\n"s auch vorhanden, oder wie?

Armitage2k
07.10.2006, 12:38
nur so nebenbei, ich hab das mit mitakis aufräum-aktion von meinen funktionen und klammern getestet, und es läuft alles wunderbar.
Also gleich nochmal danke an alle die mir hier mal wieder ne PHP nachhilfestunde gegeben haben ^__^

äh, nur kurz ein kleines html problem möcht ich schnell anschneiden (nur gaaaanz klein).
wie kann ich die länge einer rahmenlinie so definieren, dass sie automatisch über den gesamten bildschirm geht?

ich habe einen text welcher von einer rahmenlinie unterstrichen wird, diese soll jedoch nicht NUR den text unterstreichen, sondern gleich den gesamten bildschirm von links nach rechts teilen. (Es darf aber nicht "<hr> sein!)

da kommt mir automatisch der
<border-bottom width="100%"> befehl in den sinn, aber rahmenlinien gibt es anscheinend keine definition durch "width". Wie kann ich also die länge einer rahmenlinie definieren?

Nachdem ich hier ein paar gute antworten bekommen hab, seid ihr alle aus dem Nachhilfeunterricht entlassen :D
THX @ ALL

A2k


border bottom

dead_orc
07.10.2006, 13:22
Rahmenlinien gehen immer über die gesamte Breite des Elements zu dem sie gehören. Wenn du also ein div oder p über die gesamte Bildschirmbreite anlegst und einen Rahmen verpasst geht der auch über den ganzen Bildschirm.

Armitage2k
07.10.2006, 13:34
Tja, die Idee hatte ich grundsätzlich ja auch, aber leider funktioniert das nicht.
Ich habe in meiner CSS-Datei die Klasse ".line" so definiert:


.line { width:100%;
border-bottom:1px solid #99CCFF;
padding-bottom:1px;
}


Wenn ich jetzt also einen kurzen Text im <Body> stehen hab, möchte aber dass die gesamte Länge des Bildschirms mit der Rahmenlinie durchzogen wird, funktioniert dass so nicht.

zB:


<html>

<head>
</head>

<body>

<div class="line">
<p><strong>» Testüberschrift:</strong></p>
</div>

</body>

</html>


Nun sollte das Wort Testüberschrift mit einer Rahmenlinie über den ganzen Bildschirm unterstrichen sein. "Sollte" wohlgemerkt, weil sie ist es nicht.... kA warum :confused:

Thx,
A2k

mitaki
07.10.2006, 17:13
Ist sie gar nicht unterstrichen?

Nun, entweder liegt es daran, dass du deine CSS Datei nichtmal verlinkt hast.
Wenn doch hilft eventuell die verwendung eines standardkonformen Modus durch Doctype-Angabe:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">oder
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">

Nebenbei: sofern das <div> nicht notwendig ist kannst du die Klasse auch auf das <p> anwenden.

Die Angabe 100% dabei außerdem nicht notwendig, da Blockelemente immer 100% breit sind.

Armitage2k
07.10.2006, 20:06
Ist sie gar nicht unterstrichen?

Nun, entweder liegt es daran, dass du deine CSS Datei nichtmal verlinkt hast.
Wenn doch hilft eventuell die verwendung eines standardkonformen Modus durch Doctype-Angabe:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">oder
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">

Nebenbei: sofern das <div> nicht notwendig ist kannst du die Klasse auch auf das <p> anwenden.

Die Angabe 100% dabei außerdem nicht notwendig, da Blockelemente immer 100% breit sind.


Es wird schon unterstrichen, aber eben nur in der länge des textes.
Das war nur ein Beispiel im die Wiedergabe im <div> zu zeigen, in wirklichkeit ist das CSS verlinkt aber anstelle eines strict.dtd oder loose.dtd verwende ich (wegen 99% xHTML meiner Site) den transitional Modus:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


Aber letztendlich ist es nicht soooo wichtig, wär aber nett wenn man das irgendwie richten könnte.

Merci,
A2k

mitaki
07.10.2006, 20:50
Es wird schon unterstrichen, aber eben nur in der länge des textes.
Das war nur ein Beispiel im die Wiedergabe im <div> zu zeigen, in wirklichkeit ist das CSS verlinkt aber anstelle eines strict.dtd oder loose.dtd verwende ich (wegen 99% xHTML meiner Site) den transitional Modus:

Hier tritt ein Sonderfall ein. Du musst, html und body die Eigenschaft width:100%; geben, damit auch das div 100% breit werden kann.
Oder eben beim div die 100% Eigenschaft weglassen, da - wie gesagt - Blockelemente, d.h. auch <p> und <div> immer 100% breit sind bzw. sich an die Grenzen links und rechts anpassen. Dann klappts auch mit dem border.

DFYX
08.10.2006, 23:13
*hust* Schonmal dran gedacht, für Überschriften auch die Tags zu verwenden, die dafür gedacht sind? Folgendes funktioniert einwandfrei:


<h1 style="border-bottom:1px solid #99CCFF;">Test</h1>

mitaki
09.10.2006, 00:44
Ja, es ist hoffentlich wirklich nur ein Beispiel.

Außerdem sollte man dazusagen, dass für <h*> auch keine Extraklasse benötigt wird, sondern die Angaben gleich für das Element bestimmt werden können.