kostenloser Webspace werbefrei: lima-city


PHP-Script funktioniert nicht

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    jnuk

    jnuk hat kostenlosen Webspace.

    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.

    <?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);
    ?>
    Die Datei liegt auf meinem Server. Im selben Verzeichniss liegt die Datei "Pi.txt", in der die ersten 10 Millionen (:biggrin:) Dezimalstellen der Kreiszahl stehen.
    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Du hast in der Zeile
    echo "Connected!"
    das ; vergessen. Da auf Lima-city Fehlermeldungen standardmäßig unterdrückt werden siehst du gar nichts.
  4. Autor dieses Themas

    jnuk

    jnuk hat kostenlosen Webspace.

    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 :biggrin:

    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
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    jnuk schrieb:
    Danke, aber ist das in ner if-Schleife mit nur einem Befehl nicht egal?
    IF-SCHLEIFE???

    Du meinst:
    if(true)
        echo("1");
    else
        echo("0");
    Dabei ist {} egal.

    Versuch mal:
    $dec = trim(fgets($userdatei));


    Beitrag zuletzt geändert: 24.1.2012 20:21:07 von hackyourlife
  6. Autor dieses Themas

    jnuk

    jnuk hat kostenlosen Webspace.

    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
  7. jnuk schrieb:
    Wenn ich jetzt die PHP-Datei aufrufe wird mir gar nichts angezeigt. Nicht einmal "Could not connect" oder "Connected!".

    jnuk schrieb:
    EDIT 2: So jetzt schreibt er zwar in die DB, sind aber alles Nullen und in der Schleife wird auch nichts ausgegeben.
    ... und so weiter, und so weiter ...

    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:
    <?php
    error_reporting(E_ALL | E_STRICT);
    (für die entwicklungsphase, dann auskommentieren [geht auch programmatisch!])

    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:
    <?php
    if (!$con = mysql_connect('localhost','***','***');) {
      exit('<pre>'.array(mysql_errno(), mysql_error()));
    }
    ü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().

    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:
    $res = ($r = mysql_select_db('PiDecimal', $con)) ?
      mysql_select_db('PiDecimal', $con):
      exit('<pre>'.array(mysql_errno(), mysql_error()));
    oder in der while-schleife (ja, while ist eine echte schleife ;)
    $sql = <<< EOT
    INSERT INTO Decimals (Decimals)
      VALUES ('$dec')
    EOT;
      $res = ($r = mysql_query($sql,$con)) ?
        $r:
        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 ;)

    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:
    Dabei ist {} egal.
    bring anfänger schlampiges programmieren bei und hast schon für endlose weitere fragen gesorgt ;)
    fehlende klammern sind wohl eine hinterfotzige fehlerquelle! außerhalb vom KI sin 'alternativen' wiederlich *igit*
  8. Autor dieses Themas

    jnuk

    jnuk hat kostenlosen Webspace.

    @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
  9. jnuk schrieb:
    EDIT: Hat geklappt!
    freut uns!
    kleine ausbesserung:
    unter 3. sollte stehen:
    $res = ($r = mysql_select_db('PiDecimal', $con)) ?
      $r:
      exit('<pre>'.array(mysql_errno(), mysql_error()));
    wozu hat man sonst $r gemacht¿¿
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!