PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum?



maik15
02-06-2005, 13:53
Hi,

Habe mir ein kleines Forum gebastelt.
zum Forum (http://maik.dsarun-hosting.de/forum/)
Was sind das für fehlermeldungen?
An dieser stelle sollte eigentlich die anzahl der antworten stehen.
Ich habe einfach die datei mit den antworten in ein array aufgeteilt und die array-teile zählen lassen.
Bei mir auf dem PC (offline mit Apache) läuft es ohne probleme.
alle datein haben die vollen rechte (777).
wie könne diese behoben werden?

Gruß
Maik

ExRevel
02-06-2005, 15:10
Vllt. liegt es an einer anderen Konfiguration. Auszug aus dem Manual:


Ist PHP zu dem Schluss gekommen, dass filename eine lokale Datei spezifiziert, wird es versuchen, einen Stream an dieser Datei zu öffnen. Die Datei muss für PHP verfügbar sein, weshalb Sie sicherstellen müssen, dass die Dateirechte diesen Zugriff ermöglichen. Wenn Sie Safe Mode oder open_basedir aktiviert haben, können weitere Einschränkungen zutreffen.


ciao Exi

maik15
02-06-2005, 18:17
habe zwar keine ahnung, was das beduetet aber kann man das beheben?
wenn ja wie?

Gruß
Maik

Gaert
02-06-2005, 18:37
Hallo,

wenn das die Ursache sein sollte (kannst ja mal über phpinfo() schauen ob diese Einstellungen aktiviert sind) müsstest du die php.ini ändern bzw. deinen Provider fragen oder wechseln.

Gruß,

Gaert

nEox
02-06-2005, 19:07
Hallo maik15,

liest du in diesem Script:
http://maik.dsarun-hosting.de/forum/ausgabe.php?nr=1

die Textdatei genauso ein wie auf der Übersichtsseite(wo die Fehler kommen)?
Weil dann kommst du ja ansich an die Datei ran, muss also am Pfad liegen.

Gruß

nEox

maik15
02-06-2005, 19:13
vorne bei der Startseite ist das problem bei der anzahl der Antworten, was du meinst ist das auslesen der gesamten AW.
bei mir auf dem PC steht bei der unteren Fehlermeldung bloß 3 Antworten (so wie online, bloß anzahl 3)
und bei der darüber 2 Antworten.
Bei dem Online-forum steht bloß 1 Antwort bei beiden (direkt unter der meldung)

Maik

nEox
02-06-2005, 20:30
Hallo maik15,


Bei dem Online-forum steht bloß 1 Antwort bei beiden (direkt unter der meldung)

klar, aber in deinem 1. Post hast du geschrieben:


Ich habe einfach die datei mit den antworten in ein array aufgeteilt und die array-teile zählen lassen.

Also musst du ja die Datei einlesen und wie du gesagt hast in ein Array aufteilen und die Gesamtzahl zählen. Der Fehler tritt auf, wenn du die Datei einliest. Beim "Test 1" handelt es sich um diese Datei: http://maik.dsarun-hosting.de/forum/eintraege/1_aw.txt

Wenn man auf "Test 1" klickt ("ausgabe.php") müsstest du ja dann eigentlich die gleiche Datei einlesen und einfach ausgeben (auch diesem Fall http://maik.dsarun-hosting.de/forum/eintraege/1_aw.txt).

Daher wärs gut wenn du die Pfade überprüfst. Denn öffnen kannst du die Dateien ja vermutlich.

Gruß nEox

maik15
02-06-2005, 21:52
ach so meinst du das... werde ich gleich morgen machen!

aber habe noch eine kleine andere frage, zu smileys.
ich habe mir mal gedanken über smileys gemacht, wegen einfügen.
allein mit php ohne hilfe von java script o.ä. kann man kein text in ein textarea am cursor einfügen oder?

Ich dachte mir, mann könnte es so machen, das der benutzer z.b. ;-) eingibt (zeichen sind am rand definiert) und dann ein php-text dieses stück text in ein <img src...> tauscht, bevor es in die *.txt datei geschrieben wird.

wie mache ich das mit dem umwandeln von ;-) zu <img src...>???

also, das der beutzer ;-) angibt und ein php sript, vor dem eintragen diese zeichen in das jeweilige <img src...> verwandelt und das <img src...> statt dem ;-) in die*.txt schreibt.

Maik

ExRevel
03-06-2005, 07:56
Lesen bildet, PHP verfügt über ganz wunderbare Funktionen wie str_replace() oder preg_replace, was dir lieber ist. Diese Funktionen findest du auch in dem doch recht netten Manual von php.net wieder. Beispiel:


$antwort = str_replace(';)', "<img src=\"...\"></img>", $antwort);

Ganz simpel. :)

ciao Exi

sticky bit
03-06-2005, 11:26
Etwas OffTopic:
http://maik.dsarun-hosting.de/forum/ausgabe.php?nr=../woimmerichhinwill/interessant
Will sagen, Sicherheitslücke, prüfe deine Eingaben, so dass nur Dateien geöffnet werden die dazu gedacht sind und nicht beliebig im Dateisystem rumgewühlt werden kann... ;)

maik15
03-06-2005, 12:15
gut, danke!
wie könnte ich es noch sicherer machen, das der bloß *.txt datein annimmt?
Mit direkten Dateinamen prüfen geht ja nicht, wel es eine fortlaufende zahl ist...

Maik

maik15
03-06-2005, 13:50
es gibt noch ein problem, ich lasse jeden eintrag in einer txt datei speichern.
aber um antworten zu können, müssen die datein das volle schreib recht haben.
Wie kann ich das automatisch machen lassen?
denn nach jedem eintrag selber von hand jede txt datei die rechte geben ist unmöglich!
den gesamten ordner das recht geben geht auch nicht, dann hat bloß der ordner das recht und die datein nicht.
Kennt jemand abhilfe?

könnte das auch das problem vom anfang beheben?

Maik

nEox
03-06-2005, 18:14
wie könnte ich es noch sicherer machen, das der bloß *.txt datein annimmt?

Übergib einfach nur die ID des Eintrags(z. B. 1 oder 31) dann öffnest nur die Datei:



$pfad_zur_datei = 'eintraege/' . $_GET['id'] . '.txt';

if (file_exists($pfad_zur_datei)) {

fopen...

}



denn nach jedem eintrag selber von hand jede txt datei die rechte geben ist unmöglich!
Ein Blick ins Manual kann nie schaden...
http://de2.php.net/chmod

Gruß
nEox

sticky bit
03-06-2005, 19:09
Übergib einfach nur die ID des Eintrags(z. B. 1 oder 31) dann öffnest nur die Datei:



$pfad_zur_datei = 'eintraege/' . $_GET['id'] . '.txt';

if (file_exists($pfad_zur_datei)) {

fopen...

}

Und genau das löst das Problem nicht in $_GET['id'] kann nach wie vor ein Elternverzeichnisverweis stehen (../) der es ermöglicht aus dem eigentlichen Verzeichnis auszubrechen und jede beliebige *.txt Datei zu lesen sofern PHP Rechte zum lesen hat, oder gar schreiben wenn Beiträge editiert werden können. Beschränkt sich zwar AFAIK so nur auf *.txt weil PHP nicht für Poison-Null-Bytes anfällig ist wie das z. B. bei PERL der Fall wäre, kann aber auch schon Schaden anrichten.

Prüfe $_GET['id'] vorher z. B. mit preg_match( '/^\d+$/', $_GET['id']) ob es auch wirklich nur aus Ziffern besteht. Weiteres findest Du in der Manual zum Thema Mustererkennung...

nEox
03-06-2005, 22:59
Hallo maik15,

sticky bit hat recht. Ein is_numeric() sollte es aber auch tun.

Gruß nEox

maik15
04-06-2005, 18:22
Hi,

müsst ich das dann so angeben?
is_numeric(datei name.txt) { ... } ???

Maik

sticky bit
04-06-2005, 18:44
if (is_numeric($_GET['id'])) {
// Datei öffnen ...
}
else {
// Fehlermeldung
}

maik15
04-06-2005, 18:53
ich werde mal die Sicherheits-dinger einbauen.
Ich weis jetzt auch an was das lag, mit der anzahl der AW's, aber bitte nich aufregen!
Beim auslesen der txt datei wird doch angegeben, welchen modus php übernehmen soll (lesen, schreiben, beides, usw.) und ich hatte auf lesen & schreiben, obwohl ich bloß lesen brauchte. deswegen die meldung.
Wenn jemand das Forum mal komplett testen will dann bitte:
zum Forum (http://www.maik.dsarun-hosting.de/forum/forum.php)

aber eine aller-letzte frage gibts noch.
auf der starseite werden alle beiträge angezeigt.
wenn ich mal 40000 beiträge haben sollte, dann stehen die alle dort.
das sollen sie aber bloß unter Archiv (so wie es jetzt ist).
kann man bei auslesen festlegen, weiviel der auslesen soll???
ich habe es so ausgelesen:



<?php
$dat1="title-liste.txt";
$zei1=fopen($dat1,"r");
$a1=fread($zei1,filesize($dat1));
$a1=explode("#*#",$a1);
$dat2="zahl-liste.txt";
$zei2=fopen($dat2,"r");
$a2=fread($zei2,filesize($dat2));
$a2=explode("#*#",$a2);
$dat3="date_liste.txt";
$zei3=fopen($dat3,"r");
$a3=fread($zei3,filesize($dat3));
$a3=explode("#*#",$a3);


for($i=0;$i<sizeof($a1);$i++)
{
$dat4="eintraege/$a2[$i]_aw.txt";
echo "<li><a href=\"ausgabe.php?nr=$a2[$i]\"><b>$a1[$i]</b> ($a2[$i]) <i>$a3[$i]</i></a></li>";
if(file_exists($dat4)) {
$zei5=fopen($dat4,"r");
$a5=fread($zei5,filesize($dat4));
$a5=explode("#*#",$a5);
echo count($a5);
echo " Antwort(en)<br>&nbsp;";

}
else {
echo "Keine Antworten!<br>&nbsp;";
}
}
?>

fragt mich nicht, warum ich oben 3 txt's gemacht habe, mit csv oder anderem gehts einfacher...

Gruß
Maik

michael.sprick
06-06-2005, 14:52
Du könntest die For Schleife einfach nach n Einträgen beenden statt nach sizeof($a1)...

also quasi


$limit = 10; //oder auch sizeof($a1)

for($i=0;$i<$limit;$i++)
{
...
}


dann würden nur die ersten 10 Beiträge ausgelesen werden.

maik15
06-06-2005, 15:48
Hi,

geht nich!
wenn ich das so mache:


<?php
$dat1="title-liste.txt";
$zei1=fopen($dat1,"r");
$a1=fread($zei1,filesize($dat1));
$a1=explode("#*#",$a1);
$dat2="zahl-liste.txt";
$zei2=fopen($dat2,"r");
$a2=fread($zei2,filesize($dat2));
$a2=explode("#*#",$a2);
$dat3="date_liste.txt";
$zei3=fopen($dat3,"r");
$a3=fread($zei3,filesize($dat3));
$a3=explode("#*#",$a3);

$limit = 10;
for($i=0;$i<$limit;$i++)
{
$dat4="eintraege/$a2[$i]_aw.txt";
echo "<li><a href=\"ausgabe.php?nr=$a2[$i]\"><b>$a1[$i]</b> ($a2[$i]) <i>$a3[$i]</i></a></li>";
if(file_exists($dat4)) {
$zei5=fopen($dat4,"r");
$a5=fread($zei5,filesize($dat4));
$a5=explode("#*#",$a5);
echo count($a5);
echo " Antwort(en)<br>&nbsp;";

}
else {
echo "Keine Antworten!<br>&nbsp;";
}
}
?>

dann gibt der mir 10 beiträge aus, obwohl ich bloß 2 richtig eingetragen habe. die anderen führen auf eine fehlermeldung (datei nicht gefunden).
dh. der gibt soviele aus, aber nicht maximal so vioele, wenn mehr da sin.

Maik

michael.sprick
06-06-2005, 16:24
naja, dann musst Du halt vorher nachschauen, ob überhaupt soviel im Array drin ist...



$limit = sizeof($a1) > 10 ? 10 : sizeof($a1);


Dann hast du 10 in $limit, wenn das Array länger ist als 10 oder die Länge des Array, wenn es weniger als 10 Elemente hat...

maik15
06-06-2005, 16:56
OK. vielen Dank!

Maik

StrangeQuark
20-06-2005, 21:40
Diese Krieg mit Textdateien..
hast du keine möglichkeit ne datenbank zu benuzen?
Da könntest du auch sachen machen wie die ersten zehn resultate anzeigen, die gesamten results in der session speicher, um beim [Seite 2]-butten daraus die nächsten zehn zu lierfern und solche sachen

maik15
20-06-2005, 22:43
lässt sich das bloß mit php und html realisieren?
Mehr kann ich gerade nicht!

Maik

Gaert
21-06-2005, 08:17
Hallo Maik,

nein, HTML und PHP reichen nicht, da brauchst du auch noch SQL dazu... dafür gibts aber jede Menge Tutorials - man darf nur nicht lesefaul sein ;) .
Schau dir z.B. das hier an http://tut.php-q.net/index.html - Es behandelt PHP und MySQL und enthält gute Beispiele und auch Grundlagenwissen zum ganzen.

Gruß,

Gaert