PHP-Script funktioniert nicht
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
aufruf
auslese
befehl
code
dank
datei
datum
ergebnis
fehlermeldung
fehlerquelle
frage
not
null
re
schleife
server
sicherheitsproblem
stehen
url
-
Hey Leute
Ich wollte heute mal aus Langeweile ein paar Nachkommastellen von π (Pi) in die MySQL-Datenbank meines Home-Servers schreiben und habe dafür ein PHP-Script geschrieben, welches jedoch nicht funktioniert.
Die Datei liegt auf meinem Server. Im selben Verzeichniss liegt die Datei "Pi.txt", in der die ersten 10 Millionen () Dezimalstellen der Kreiszahl stehen.<?PHP $con = mysql_connect("localhost","***","***"); if (!$con) { die('Could not connect: ' . mysql_error()); } else { echo "Connected!" } mysql_select_db("PiDecimal", $con); $userdatei = fopen("Pi.txt","r"); $n=0; //while(!feof($userdatei)) //Wär 'n bissl viel -.- while($n!=20) { $dec = fgets($userdatei,1); echo $dec; mysql_query("INSERT INTO `Decimals` (`Decimals`) VALUES ('".$dec."');",$con); $n++; }; fclose($userdatei); mysql_close($con); ?>
In MySQL ist eine DB namens "PiDecimal" in der sich eine Tabelle namens "Decimals" befindet. Darin gibt es 2 Spalten:
`id` int(7) unsigned NOT NULL AUTO_INCREMENT, `Decimals` int(1) DEFAULT NULL
Wenn ich jetzt die PHP-Datei aufrufe wird mir gar nichts angezeigt. Nicht einmal "Could not connect" oder "Connected!".
Dankeschön
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Du hast in der Zeile
das ; vergessen. Da auf Lima-city Fehlermeldungen standardmäßig unterdrückt werden siehst du gar nichts.echo "Connected!"
-
jnuk schrieb:
Die Datei liegt auf meinem Server.
Danke, aber ist das in ner if-Schleife mit nur einem Befehl nicht egal?
EDIT: Nein ist es nicht
EDIT 2: So jetzt schreibt er zwar in die DB, sind aber alles Nullen und in der Schleife wird auch nichts ausgegeben.
Beitrag zuletzt geändert: 24.1.2012 20:19:04 von jnuk -
Ne dann kommt
id | Decimals
1 | 14159265
2 | 0
...
11 | 35897932
12 | 0
Wenn ich an ($userdatei ein ,1) anhänge, sinds wieder nur nullen
Beitrag zuletzt geändert: 24.1.2012 20:38:09 von jnuk -
jnuk schrieb:
Wenn ich jetzt die PHP-Datei aufrufe wird mir gar nichts angezeigt. Nicht einmal "Could not connect" oder "Connected!".
jnuk schrieb:
... und so weiter, und so weiter ...
EDIT 2: So jetzt schreibt er zwar in die DB, sind aber alles Nullen und in der Schleife wird auch nichts ausgegeben.
also:
1. wo sind deine fehlermeldungen? du lässt uns da im dunklen herumtappen. womöglich - mit fehlermeldung - brauchst du unsere hilfe ja gar nicht! und das geht so:
(für die entwicklungsphase, dann auskommentieren [geht auch programmatisch!])<?php error_reporting(E_ALL | E_STRICT);
2. wozu brauchst du da else? um auszugeben, dass du connected bist¿ streng genommen, wenn du im if-bereich abbrichst, brauchst du kein else. daher:
über die() zu vermerken: jahre lang hat ein sicherheitsproblem gehabt (bei php-bug nachlesen, ich bin nicht am letzten stand!), daher nehme ich schon immer exit().<?php if (!$con = mysql_connect('localhost','***','***');) { exit('<pre>'.array(mysql_errno(), mysql_error())); }
3. anschließend hängen alle deine mysql_xxx() aufrufe in der luft! was ist damit gemeint? alle mysql_xxx() funktionen geben ein ergebnis zurück, auch dann, wenn ein query selbst NICHTS liefert! also logischer weise, jedes mal wenn du mysql_xxx() ausführst, sollte das ergebnis geprüft werden! das geht dann so:
oder in der while-schleife (ja, while ist eine echte schleife ;)$res = ($r = mysql_select_db('PiDecimal', $con)) ? mysql_select_db('PiDecimal', $con): exit('<pre>'.array(mysql_errno(), mysql_error()));
nebenbei! du solltest die sql-queries IMMER formatieren (am besten, wie oben gezeigt). gut für die fehlersuche ;)$sql = <<< EOT INSERT INTO Decimals (Decimals) VALUES ('$dec') EOT; $res = ($r = mysql_query($sql,$con)) ? $r: exit('<pre>'.array(mysql_errno(), mysql_error()));
4. weiters, ich würde dich von fopen() und co. abraten. in diesem fall würde ich einfach das tun:// lesen die daten ohne fopen(), demnach auch ohne fclose() if(!$lines = file('Pi.txt', FILE_IGNORE_NEW_LINES ^ FILE_SKIP_EMPTY_LINES)) { exit('konnte daten nicht lesen!'); } while(...) { ... // daten verwenden $dec = $lines[$n++]; ... }
5. mache nicht, was php für dich ohnehin macht! am ende des scripts brauchst du kein mysql_close()! (brauchst explizite nur mitten drin, aber nur mit begründung!)
!! auf die frage 'warum denn überall überall "exit('<pre>'.array(mysql_errno(), mysql_error()));"': weil ich meine arbeit an deine angepasst habe und das rad immer wieder erfunden habe. dagegen gibt es das zauberwort 'wiederverwertung'. ich habe da irgendwo eine klasse mal gepostet, die genau das verhindert. sufu bedienen ;)
hackyourlife schrieb:
bring anfänger schlampiges programmieren bei und hast schon für endlose weitere fragen gesorgt ;)
Dabei ist {} egal.
fehlende klammern sind wohl eine hinterfotzige fehlerquelle! außerhalb vom KI sin 'alternativen' wiederlich *igit* -
@hemiolos
1. Danke, das wusste ich noch nicht.
2. Das habe ich nur gemacht, um zu sehen, ob er sich überhaupt verbindet; Ok, dann nehme ich exit() statt die()
3. Ok, werd ich mal probieren
4. Auch das ändere ich mal...
5. Ja, muss man nicht, kann man aber.
Danke!
EDIT: Hat geklappt! Es lag an fgets(), da ich hier " $dec = fgets($userdatei, 1); " hatte. Aus dieser 1 habe ich eine zwei gemacht und siehe da, es funktioniert! Irgendwie will fgets() wohl keine einzelnen Zahlen auslesen.
Beitrag zuletzt geändert: 25.1.2012 17:30:06 von jnuk -
jnuk schrieb:
freut uns!
EDIT: Hat geklappt!
kleine ausbesserung:
unter 3. sollte stehen:
wozu hat man sonst $r gemacht¿¿$res = ($r = mysql_select_db('PiDecimal', $con)) ? $r: exit('<pre>'.array(mysql_errno(), mysql_error()));
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage