kostenloser Webspace werbefrei: lima-city


Suche auf lima-city

  • in: Klicks abfangen mit jQuery ?

    geschrieben von nemoinho

    Hi,

    ich hab das fiddle so angepasst, dass es funktioniert.

    Mit freundlichen Grüßen
  • in: UNIX Problem

    geschrieben von nemoinho

    Hi,

    das kannst du auch komplett mit sed machen, dann sähe das in etwa so aus;
    sed -e ':a;N;$!ba;s/\(.\)\n/\1 /g' file.txt > newFile.txt

    Zur Erklärung:
    sed ist ein Programm welches eine Datei Zeilenweise verarbeitet und dabei z.B. reguläre Ausdrücke zum suchen und ersetzten anwendet um die Ausgabe zu verändern. Die einzelnen Befehle werden durch Semikolon getrennt.

    :a
    erstellt ein label, in dem die aktuelle Zeile gespeichert wird.
    N
    sorgt dafür, dass die aktuelle Zeile und die nächste Zeile eingelesen wird. Dabei werden die Zeilen durch ein \n zusammen gesetzt.
    $!ba
    sorgt dafür, dass die statt der aktuellen Zeile mit dem label vom Anfang gearbeitet wird, hierbei muss beachtet werden, dass dadurch im laufe des Programms die komplette Datei im Arbeitspeicher landet und das Programm immer langsamer wird. Dieser Aufruf sollte also nicht bei zu großen Dateien angewendet werden. Ich würde aber sagen bis ca 1 oder 2 MB besteht kein Problem.
    s/\(.\)\n/\1 /g
    ist der reguläre Ausdruck der dafür sorgt, dass die Datei wie gewünscht formatiert wird. Er ersetzt den Zeilenumbruch hinter einem Wort durch ein Leerzeichen, aber nur wenn in der Zeile etwas steht.

    Auch in awk ist das Ganze nicht so wahnsinnig schwer, hier ist das Programm zwar länger, hat dafür aber nicht mehr die Probleme mit dem Speicher.
    awk 'function a(c){print substr(c,0,length(c))};BEGIN{b=""};{if($1==""){a(b);b=""}else{b=b$1" "}};END{a(b)}' file.txt > newFile.txt

    Ich habe das Programm hier einmal eingekürzt, schlauerweise speichert man es aber in einer Datei, z.B. reformatFile.awk und ruft das Programm dann so auf:
    awk -f reformatFile.awk file.txt

    In der Datei kann man das Programm dann auch besser strukturieren:
    function printTrimmed(outputLine){
        print substr(outputLine, 0, length(outputLine))
    }
    BEGIN{
        tmpOutputLine=""
    }
    {
        if($1==""){
            printTrimmed(tmpOutputLine)
            tmpOutputLine=""
        }else{
            tmpOutputLine=tmpOutputLine$1" "
        }
    }
    END{
        printTrimmed(tmpOutputLine)
    }


    Und zu guter Letzt möchte ich noch meinen persöhlichen Favoriten zeigen, nämlich perl. Perl ist eigentlich immer installiert, zumindest kenne ich keine Unix-Systeme mehr, die es nicht haben und es hat nicht die erwähnten Probleme, wie z.B. sed und ist andererseits sehr mächtig. Außerdem ist perl erheblich schneller als die anderen beiden Alternativen ;-) . Da sähe das Programm dem aus awk sehr ähnlich:
    perl -e '$a="";sub a{chomp $a;print $a."\n";$a=""}while(<>){chomp;$a.=$_." ";if($_ eq ""){a()}}a()' < file.txt > newFile.txt

    Oder um das Programm wieder übersichtlich darzustellen als file, welches so genutzt wird:
    perl reformatFile.pl < file.txt > newFile.txt
    und so aussähe:
    use strict;
    use warnings;
    my $tmpLine="";
    while(<>){
        chomp;
        $tmpLine.=$_." ";
        if($_ eq ""){
            printTrimmed();
        }
    }
    printTrimmed();
    sub printTrimmed {
        chomp $tmpLine;
        print $tmpLine . "\n";
        $tmpLine = "";
    }


    Wie du siehst gibt es da diverse Lösungen, die alle mit Unixboardmitteln zu erledigen sind.

    Ein kleiner Hinweis sei allerdings nocht gestattet, denn die Lösungen funktionieren, nicht alle gleich (außer die Perl-Variante). Die sed Variante funktioniert nur mit der GNU-Variante von sed, allerdings kann man das Problem beseitigen, indem man ähnlich wie in der awk-, oder perl-Variante das Programm in eine Datei schreibt. Ansonsten sollten die Programme aber alle laufen.

    Mit freundlichen Grüßen

    * Edit Hinweis zu GNU hinzugefügt
  • in: max_user_connections trotz persistenter Verbindung

    geschrieben von nemoinho

    Hi,

    ich denke ich weiß wo dein Problem liegt und das sind nicht die "vielen" Nutzer deiner Website. Ich glaube nämlich nicht, dass da so viele Nutzer gleichzeitig Anfragen an den Webserver stellen, sodass dein Limit an Verbindungen überschritten wird. Ich denke eher, dass dein Script nicht sinnvoll aufgebaut ist und ständig neue Datenbankverbindungen aufbaut, obwohl es eigentlich nur eine Verbindung bräuchte, somit überschreitest du natürlich schnell die Anzahl der gültigen Zugriffe, wenn du die Verbindungen nicht richtig schließt.

    Wenn du PDO benutzt, welches ich auch empfehlen würde, dann musst du die Variable expliziet mit null füllen, um die Verbindung zu schließen, aber das nur nebenbei.

    Was du brauchst ist eine Factory, die dir immer eine funktionierende Verbindungsinstanz zurück gibt. Dazu habe ich dir mal dieses kleine Script geschrieben, welches solch eine Factory und deren Aufruf zeigt, außerdem enthält es einen einfachen Test, der dein Problem darstellt. Der Test zeigt auch, dass dein Problem mit der Factory nicht auftrit.
    <?php
    define('DB_NAME', 'test_db');
    define('DB_HOST', 'localhost');
    define('DB_USER', 'testuser');
    define('DB_PASS', 'testpassword');
    define(
        'DB_DSN',
        'mysql:dbname=' . DB_NAME . ';host=' . DB_HOST
    );
    
    class DbFactory
    {
        private static $connection = null;
        public static function getConnectin(
            $dsn, $user, $pass, $options = array()
        ) {
            if(!isset(self::$connection)){
                self::$connection = new PDO(
                    $dsn, $user, $pass, $options
                );
            }
            return self::$connection;
        }
        public static function closeConnection()
        {
            if(isset(self::$connection)){
                self::$connection = null;
            }
        }
    }
    
    // Here starts the classic-test-case
    $x = array();
    echo 'Start classic-test' . PHP_EOL;
    $errorRaised = false;
    for($i = 1000; $i--; ){
        try {
            $x[] = new PDO(DB_DSN, DB_USER, DB_PASS);
        }catch(Exception $e){
            if(!$errorRaised){
                echo $e->getMessage() . PHP_EOL;
            }
            $errorRaised = true;
        }
    }
    $x = array();
    // Here ends the classic-test-case
    
    // Here starts the factory-test-case
    $x = array();
    echo 'Start factory-test' . PHP_EOL;
    $errorRaised = false;
    for($i = 1000; $i--; ){
        try {
            $x[] = DbFactory::getConnectin(
                DB_DSN, DB_USER, DB_PASS
            );
        }catch(Exception $e){
            if(!$errorRaised){
                echo $e->getMessage() . PHP_EOL;
            }
            $errorRaised = true;
        }
    }
    DbFactory::closeConnection();
    $x = array();
    // Here ends the factory-test-case


    Am Anfang des Scripts musst du zum testen natürlich noch die Konstanten ändern ;-)

    Mit freundlichen Grüßen
  • in: Textbox größe automatisch

    geschrieben von nemoinho

    Hi,

    meinst du vielleicht so etwas?

    Das Script ist nicht besonders flexibel, aber es zeigt wie es gehen könnte ;-)

    Viel Spaß damit.

    Mit freundlichen Grüßen
  • in: Linux Mint welcher Desktop ist der beste?

    geschrieben von nemoinho

    Moin,

    bladehunter hat es bereits gesagt, "den Desktop" gibt EA nicht, es kommt darauf an, welche Vorteile man erwartet, was man konkret haben will und womit man am besten klar kommt. Wie bladehunter nutze ich auch i3. Ich habe dazu mehrere durch probiert und bin bei dem hängen geblieben, weil er mir bei meiner täglichen Arbeit am besten gefällt, allerdings erfordert er viel Einarbeitungszeit.

    Mit freundlichen Grüßen
  • in: Column 'betreff' cannot be null

    geschrieben von nemoinho

    Hi, reden wir von der selben Sprache?

    Das kann nicht funktioniert haben!

    Den bei dem was du gelistet hast wirft PHP eine exception, weil es den code nicht richtig parsen kann.

    Mit freundlichen Grüßen
  • in: Column 'betreff' cannot be null

    geschrieben von nemoinho

    Hi,

    so wie dein geposteter Code aussieht, sollte das funktionieren. Das heißt entwederzeigst du uns hier nicht alles, oder das $_POST-Array wird an einer anderen Stelle manipuliert. Selbst wenn du nichts einträgst wird so eine leere Zeichenkette in der Datenbank gespeichert.

    Überprüfe doch einmal (via var_dump() oder print_r()) direkt nach dem if und dann nochmal vor dem execute, welche Daten überhaupt in dem $_POST-Array stehen.

    Mit freundlichen Grüßen
  • in: Classeninstanz 'updaten'

    geschrieben von nemoinho

    Hi,

    ehrlich gesagt sollte der Fall, so wie du ihn beschreibst, gar nicht unbedingt auftreten, deswegen ist das Problem auch eher abstrakt. Eine normale Lösung sähe etwa so aus, ich denke zwar nicht, dass es das ist was du haben willst, aber es ist eine übliche Praxis:
    Benutzer.php
    <?php
    class Benutzer
    {
      protected $name;
      protected $age;
    
      public function __construct($config = array())
      {
        $this->configure($config);
      }
    
      public function configure($config = array())
      {
        if(is_array($config)){
          $this->configureByArray($config);
        }else if($config instanceof Benutzer){
          $this->configureByObject($config);
        }
      }
    
      protected function configureByArray(array $config)
      {
        $attributes = array_keys(get_class_vars(__CLASS__));
        foreach($attributes as $key){
          if(isset($config[$key])){
            $this->{$key} = $config[$key];
          }
        }
      }
    
      protected function configureByObject(Benutzer $config)
      {
        $attributes = array_keys(get_class_vars(__CLASS__));
        foreach($attributes as $key){
          $this->{$key} = $config->{$key};
        }
      }
    
      public function __get($key)
      {
        if(property_exists($this, $key)){
          return $this->{$key};
        }
      }
    }

    Mitglied.php
    <?php
    require_once 'Benutzer.php';
    
    class Mitglied extends Benutzer
    {
      protected $clubnumber;
    
      public function configure($config = array())
      {
        parent::configure($config);
        if(is_array($config)){
          $this->clubnumber = $config['clubnumber'];
        }elseif($config instanceof Mitglied){
          $this->clubnumber = $config->clubnumber;
        }
      }
    }


    testscript.php
    <?php
    require_once 'Mitglied.php';
    
    $benutzer = new Benutzer(array('name' => 'Foo', 'age' => 20));
    $mitglied = new Mitglied($benutzer);
    $mitglied->configure(array('clubnumber' => 1));
    unset($benutzer);
    
    // Testausgaben
    echo 'Name: ' . $mitglied->name . PHP_EOL;
    echo 'Age: ' . $mitglied->age . PHP_EOL;
    echo 'Clubnumber: ' . $mitglied->clubnumber . PHP_EOL;

    Ich denke, dass sollte deine Probleme beheben, auch wenn ich nicht genau weiß, wie du in diese komische Situation geraten bist, denn die Situation die du beschreibst tritt zwischen 2 Aufrufen auf und sollte dadurch in PHP eher selten passieren.

    Mit freundlichen Grüßen
  • in: Eigne CMS (Probleme mit MySQL)

    geschrieben von nemoinho

    Hi,

    es ist auch nicht verwunderlich, dass du dich mit jedem Benutzernamen einloggen kannst, schließlich prüft du in deinem SQL auf den namen "benutzername" ;-)

    Ich würde das ganze übrigens etwas abstrakter gestalten und mit prepared Statements arbeiten, zum Beipiel so:

    config.php
    <?php
    // Fehlerbehandlung
    error_reporting(-1);
    ini_set('display_errors', 'ON');
    // Datenbank konfiguration
    define('DB_HOST', 'mysql.lima-city.de');
    define('DB_USER', 'db-username');
    define('DB_PASS', 'db-password');
    define('DB_NAME', 'db_220732_12');
    // Mögliche Ausgaben
    $msq = array(
      'mysql-connection' => "Connect failed: %s\n",
      'wrong-credentials' => 'Die Zugangsdaten waren falsch. <a href="login.html">Login</a>',
      'login-successful' => 'Login erfolgreich',
    );

    login.php
    <?php
    require_once 'config.php';
    
    session_start();
    
    $username = $_POST["name"]; 
    $password = $_POST["passwort"]; 
    
    $connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    
    if (mysqli_connect_errno()) {
        printf($msq['mysql-connection'], mysqli_connect_error());
        exit;
    }
    
    $sql = <<<END_OF_SQL
    SELECT COUNT()
      FROM anmelden
     WHERE benutzername = ?
       AND password = ?
    END_OF_SQL;
    
    if($stmt = $connection->prepare($sql)){
      $stmt->bind_param("ss", $username, md5($password));
      $stmt->execute();
      $stmt->bind_result($numberOfValidUsers);
      $stmt->fetch();
      if($numberOfValidUsers == 1){
        $_SESSION["benutzername"] = $username; 
        echo $msq['login-successful'];
      }else{
        echo $msg['wrong-credentials'];
      }
      $stmt->close();
    }
    $connection->close();

    Aber warum würde ich solch einen Aufbau vorziehen?
    1.) Die Konfiguration und die Texte, die ausgegeben werden sind getrennt von der Logik, das hat den Vorteil, dass ich immer nur eines von beidem anpassen muss.
    2.) Durch die Verwendung von prepared-Statements fällt es leichter Fehler zu finden und man kann sich ebenfalls einfacher vor SQL-Injections schützen, das Beispiel ist zum Beispiel bereits dagegen geschützt.
    3.) Ist der Code so wesentlich leichter nachzuvollziehen (auch wenn das für dich jetzt nicht unbedingt so wirkt), da nervige Ausgaben, die den Lesefluss stören in kompakte Platzhalter, nämlich Variablen gepackt werden. Ich will beim lesen ja nicht ständig gucken müssen, wo ich jetzt gerade bin.

    Darüberhinaus will ich dir auch erklären, was ich da mache.

    Als erstes habe ich alles was nicht zur Logik gehört in eine Datei (config.php) ausgelagert. Dazu gehört übrigens auch die Behandlung von Fehlern, da ich die später ja ändern kann wie ich will, ohne das es einen Einfluss auf das Programm nimmt. Darüber hinaus definiere ich hier einige Konstanten mit den Zugangsdaten für die Datenbank. Konstanten nehme ich, weil ich so leicht verhindern kann, dass die Variablen überschrieben werden und ich den Fehler nicht mehr finde ;-) Zu guter letzt habe ich noch ein Array erstellt, dass alle ausgaben enthält, die mein Programm erzeugen könnte. Dies hat mehrere Vorteile, zum einen kann ich die selbe Ausgabe mehrfach verwenden, ohne dass ich immer den Text kopieren muss, zum anderen kann ich den Text einfach ändern, ohne das Programm danach zu durchsuchen.

    So nun aber zu dem eigentlichen Programm, das erkläre ich am besten Zeilenweise.
    Zeile 2: Hier hole ich mir die zuvor definierten Konfigurationen, sodass ich diese nutzen kann
    Zeile 4: Die Session wird geöffnet, damit uns die Variable $_SESSION zur Verfügung steht und wir hier Werte hineinschreiben können, die mehrere Requests überleben.
    Zeile 6 und 7: Die Variablen aus $_POST in eine eigene Variable übertragen, damit wir damit besser arbeiten können.
    Zeile 9: Eine Verbindung zur Datenbank aufbauen, hier nutzen wir die definierten Konstanten.
    Zeile 11: Überprüfen, ob es Fehler bei der Verbindung gab, sollte dass der Fall sein wird der Inhalt der IF-Verzweigung ausgeführt.
    Zeile 12: Falls ein Fehler auftratt, geben wir die Ursache aus, zur Formatierung nutzen wir das Array aus der config.php.
    Zeile 13: Das Programm beenden, falls ein Fehler auftratt.
    Zeile 16 bis 21: Wir speichern in der Variablen $sql die SQL-Abfrage, die wir später nutzen wollen, hierbei sind die Fragezeichen zu beachten, die bei prepared-Statements als Platzhalter für die eigentlichen Werte dienen.
    Zeile 23: Hier wird, aus dem SQL das in $sql steht, ein prepared-Statement erzeugt und in der Variable $stmt gespeichert, wenn dies erfolgreich ist, geht es innerhalb der IF-Abfrage weiter.
    Zeile 24: Hier kommt die große Stärke von prepared-Staments zum tragen, denn hier ersetzen wir die beiden Platzhalter durch die Strings aus den Variablen $username und dem md5 von $password
    Zeile 25: Hier feuern wir endlich die Query an die Datenbank ab.
    Zeile 26: Das Ergebnis der Query ist nun in $stmt hinterlegt, allerdings kommen wir da so nicht ran, stattdessen müssen uns das Ergebnis abholen, am einfachsten geht das, indem wir definieren wo es hineingeschrieben werden soll, und zwar in die Variable $numberOfValidUsers.
    Zeile 27: So damit das Ergebnis auch in der Variablen steht müssen wir das PHP auch mitteilen. Jedesmal wenn wir nun $stmt->fetch() aufrufen wird eine neue Zeile des Ergebnisses ausgewertet und damit die Variable überschrieben. Wenn keine Zeile mehr gefunden wird, dann gibt die Funktion false zurück, sodass man weiß wann man alle Zeile hat. Das brauchen wir hier aber gar nicht alles, da wir ja nur eine Zeile haben wollen und das gegebene SQL auch immer eine Zeile liefert ;-)
    Zeile 28: Hier überprüfen wir einfach die Anzahl der gefunden Nutzer, wenn diese nicht 1 sind, dann waren die Anmeldedaten wohl falsch. Entsprechend sind auch die folgenden Zeilen nur noch aufräumarbeiten.
    Zeile 29: $_SESSION füllen, da sich der User erfolgreich einloggen konnte.
    Zeile 30: Ausgabe, dass man sich erfolgreich eingeloggt hat.
    Zeile 32: Ausgabe, falls man sich nicht einloggen konnte.
    Zeile 34 und 36: Die offenen Verbindungen zur Datenbank schließen, dies würde aber ohnehin beim beenden des Programms passieren.

    So das war es, ich hoffe, dir hilft meine ausführliche Antwort zukünftig. Du hattest dein Problem ja eigentlich schon gelöst, dennoch wollte ich dir noch einen kleine Einblick zeigen, wie du den Code noch verbessern könntest.

    Mit freundlichen Grüßen
  • in: Nur Daten auswählen, die nur einmal vorkommen?

    geschrieben von nemoinho

    Hi,

    das kannst du mittels COUNT und HAVING realisieren, allerdings sollte die Datenmenge dann nicht zu groß werden, da das irgendwann zu Performanceproblemen führen kann. Je nachdem wie kompliziert die Abfrage ist und wie häufig neue Daten in die Tabellen geschrieben werden kann die Obergrenze schon bei 100 liegen, aber eventuell auch erst bei 50 Millionen, dazu müsste ich wissen, wie deine komplette Abfrage aussieht.

    Hier ein Beispiel, wir haben folgende Tabelle foo:
    +----+-------+
    | id | value |
    +----+-------+
    |  1 |     1 |
    |  2 |     1 |
    |  3 |     2 |
    |  4 |     2 |
    |  5 |     3 |
    +----+-------+

    Jetzt wollen wir jede id finden, die zu einem eindeutigen value gehört. Das können wir machen, indem wir die Abfrage nach value gruppieren und zählen, wie viele gleiche Werte wir finden. Anschließend filtern wir mit HAVING noch heraus, weche Einträge eindeutig sind.
    SELECT `id`, COUNT(`value`) AS 'valuecount'
      FROM `foo`
     GROUP BY `value`
    HAVING `valuecount` = 1


    Alles was eindeutig sein soll wird hierbei in die GROUP BY Klausel aufgenommen, außerdem ist es sinnvoll eine genaue WHERE Klausel aufzunehmen, um die Performance zu steigern, ansonsten kann das wie gesagt sehr langsam werden!

    Wenn du mir deine Tabellenstruktur und deine Ziele sagst kann ich dir dann aber weiterhelfen, falls du Probleme damit hast.

    Mit freundlichen Grüßen
  • in: sort() asort() funktioniert nicht!

    geschrieben von nemoinho

    Hallo,

    bevor hier weiter wild rumspekuliert wird, will ich einmal intervenieren.

    Abgesehen davon, dass das Script nicht sehr lesbar ist, wüsste ich gerne, an welcher Stelle du denn eigentlich sort() oder asort() benutzt? – Denn in deinem Codeschnipsel benutzt du das definitv nicht, somit kann man auf deine Frage auch nicht sinnvoll antworten!

    Alles was dein Script macht ist so etwas ausgeben wie:
    var pics1=new Array('/tmp/1', '/tmp/3', '/tmp/2');


    Du willst also offenbar einen JS-Fetzen ausgeben, der die Ordner sortiert in einem Array enthält. Das sortieren könntest du also auch dem JS überlassen, das wäre auch eine einfache Lösung.

    Außerdem wäre es wahscheinlich schlauer
    var pics = [];
    statt
    var pics = new Array();
    zu benutzen, das hat aber mehr mit den Interna von JS zu tun und ist in dem Beispiel auch unerheblich.

    So um dir jedoch entsprechend eine Anregung zu geben, will ich dir mal unter die Arme greifen und dir ein Beispiel geben, wie ich das Ganze implementieren würde.

    1. Variante, PHP sortiert die Liste
    <?php
    // define $i, $data and FADER_BASE_PATH here
    $files = array();
    $disallowedFiles = array('.', '..', 'index.php', 'thumb.db');
    $handle = opendir(FADER_BASE_PATH . $data['dir']);
    while($file = readdir($handle)){
        if(!is_dir($file) && !in_array($file, $disallowedFiles)){
            $files[] = FADER_BASE_PATH . $data['dir'] . $file;
        }
    }
    closedir($handle);
    sort($files);
    printf(
        "var %s = [\n'%s'\n];\n",
        'pics' . $i,
        implode("',\n'", $files)
    );


    Zur Erklärung, das ist nicht der schönste Code, aber er ist zumindest praktikabel.
    - Zuerst definieren wir uns ein Array, in dem die gefunden Dateinamen zwischen gespeichert werden sollen (Zeile 3).
    - Anschließend definieren wir ein Array, welches eine Liste aller Dateinamen enthält, die wir nicht ausgeben wollen (Zeile 4).
    - Nun öffnen wir einen Zeiger auf den Ordner, den wir auslesen wollen. (Zeile 5)
    - Nun lesen wir in einer Schleife alle Einträge des Ordners ein und speichern diese pro durchlauf in der Variablen $file zwischen. (Zeile 6)
    - Innerhalb der Schleife prüfen wir, dass die Datei kein Ordner ist und nicht in der Liste der verbotenen Dateinamen steht. (Zeile 7)
    - Wenn diese Bedingungen erfüllt sind speichern wir den Dateinamen, inklusive des Pfades, in dem hierfür definierten Array. (Zeile 8)
    - Wenn die Schleife fertig ist schließen wir den Zeiger auf den Ordner um die Resourcen freizugeben. (Zeile 11)
    - Vor der Ausgabe müssen wir nun noch das Array sortieren, damit die Ausgabe auch sortiert ist ;-) (Zeile 12)
    - Danach bauen wir uns die Ausgabe zusammen, dazu habe ich in dem Beispiel die Funktion printf() benutzt, weil ich finde, dass man da besser sehen kann, wie die Ausgabe später aussehen wird.
    + Dazu definieren wir erstmal ein Format, welches angibt, wie die Ausgabe später aussehen soll. Dieses Format enthält ein paar Platzhalter für die Werte (%s). (Zeile 14)
    + Der erste Platzhalter wird mit dem Variablennamen des Arrays ersetzt. (Zeile 15)
    + Und der zweite Platzhalter wird mit der verketteten Liste ersetzt, sodass die Ausgabe korrektes JS ist. (Zeile 16)

    Ich denke das sollte dein Problem erschlagen, lies dir die Idee durch und überlege dir was da passiert.


    Mit freundlichen Grüßen
  • in: where vor join

    geschrieben von nemoinho

    unlikus schrieb:
    also mit unpräzise meine ich, dass der join ja erst mal eine ganze Menge datensätze liefert.
    Nämlich alle objecte in der Datenbank zusammen mit ihren locations. Erst dann kommt das Where.


    Nope, das macht optimiert sich MySQL schon so hin, dass es nur die objects läd, die auch zu laden sind. Du musst nur aufpassen, dass du keinen cross-join erzeugst, sonst hast du ein Performanceproblem, dazu ist es wichtig auch das ON zu definieren.

    Dein Code wäre also:
    SELECT objects.id
      FROM locations
     INNER JOIN objects
        ON locations.id = objects.location
     WHERE locations.id = 4
        OR locations.root = 4


    MySQL sucht sich nun alle locations, deren id, oder root = 4 ist. Anschließend läd es alle objects, deren location = der id von locations (in dem Fall halt 4) ist und fügt die Ergebnisse zusammen.

    Mit freundlichen Grüßen
  • in: Puppy LinuxAdmin Passwort vergessen

    geschrieben von nemoinho

    Ist die Festplatte verschlüsselt, so dass du nicht auf die root-Verzeichnisse zugreifen kannst?

    Wenn nicht, dann kannst du eine live cd starten und das Passwort auf der Festplatte ändern.


    Dazu gehst du wie folgt vor.
    1.) root im live-system werden
    2.) Du mountest in der live-Umgebung die Partition auf der /etc liegt
    3.) Anschließend nutzt du die folgenden 2 Zeilen, um das root-Passwort zu ändern.
    Hierzu musst du den Pfad zu der Datei /etc/shadow in dem gemounteten System anpassen!
    SHADOW=/ABSOLUTER/PFAD/ZUR/etc/shadow
    sed -e 's/^\(root\):[^:]*:\(.*\)/\1:$1$abc$w4QgUNlSaYbMOHG4lWxgn.:\2/' -i $SHADOW

    4.) Zum Schluss musst du wieder das normale System starten.

    Nun kannst du dich mit folgenden Userdaten einloggen:
    Username: root
    Passwort: admin

    Das Passwort solltest du anschließend wieder ganz entspannt mit passwd ändern, den das so eingerichtete Passwort ist in vielerlei hinsicht unsicher.

    Aber, ganz wichtig: Führe die Änderungen sorgfältig durch und spiele nicht an den Rechten, oder den Formaten der Datei rum, denn dann startet das Linux höchstwahrscheinlich gar nicht mehr!

    Bei Fragen solltest du definitv nachfragen, denn in dem Bereich kann man nämlich so richtig schön Mist bauen!

    Mit freundlichen Grüßen
  • in: [HTACCESS] Index.html ausblenden

    geschrieben von nemoinho

    c143 schrieb:
    Ich hab das Script jetzt grad noch probiert, funktionierte ehrlich gesagt nicht. Aber folgendes hat geklappt:
    RewriteEngine On
    RewriteRule ^index\.html$ / [R=301,L]
    RewriteRule ^(.*)/index\.html$ /$1/ [R=301,L]

    Jap, soweit hatte ich das gar nicht mehr ausprobiert, da ich eher versuche die Leute zu coachen, meiner Erfahrung nach hilft das nämlich einfach mehr und dann steigt auch deren Produktivität :cool:
    Aber deine Lösung sieht ziemlich korrekt aus, inkl. dem sinnlosen redirect :thumb:

    Mit freundlichen Grüßen
  • in: [HTACCESS] Index.html ausblenden

    geschrieben von nemoinho

    c143 schrieb:
    Aber mit Mod Rewrite wird keine Endlosschleife erzeugt, oder?

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.html?/$1 [L]


    Das ist auch nicht die Lösung für die Anforderung. Der TE möchte auf index.html verlinken und eine Weiterleitung auf / bekommen. Danach soll der Request beendet werden. Das geht aber nicht da, / wiederum auf index.html verweist und so der Redirect neu gestartet werden würde. Außer ich habe etwas an deinem Code komplett übersehen, das glaube ich aber nicht wirklich ;-)

    c143 schrieb:
    Es wird nach einer Lösung des Problems gesucht und nicht nach einem anderen Weg. Mit Mod rewrite sollte das gehen, ob es nötig ist wird der Threadersteller selbst entscheiden.

    Wie gesagt die schlaue Lösung wäre es seine Anforderungen korrekt zu definieren und Fakt ist, dass es bereits einen einfachen Weg gibt. Es ist einfach nur dämlich wegen solchen vorgeschobenen Gründen einfache Probleme komplex zu gestalten. Wenn es um "Programmanforderungen" ginge, dann würde ich sagen: "ja gut, lass uns mal alle Lösungen beleuchten." – Aber hier geht es nur darum eine eh schon gegebene, gut funktionierende Implementierung unnötig aufzublähen. Außerdem handelt es sich nur um HTML, nichts weltbewegend komplexes.

    Mit freundlichen Grüßen
  • in: [HTACCESS] Index.html ausblenden

    geschrieben von nemoinho

    Hey, @hpage
    hpage schrieb:
    Das geht so

    RedirectPermanent /index.html http://www.domain.de/


    Das ist mit großem Abstand die schlechteste mögliche Antwort!

    Wenn du dir auch nur Sekundenlang gedanken darüber gemacht hättest, dann wäre dir selber aufgefallen, dass du eine Endlosschleife vorschlägst!

    Zum Beweis habe ich diese Situation mal nachgebaut und das ist das Resultat:
    felix@laptop:~$ sudo bin/mkvirtualhost index-redirect
    [sudo] password for felix: 
    Create V-Host...
    Create log-dir...
    Create dev-dir...
    Link dev-dir...
    Enable V-Host...
    Reload apache...
    [ ok ] Reloading web server config: apache2.
    felix@laptop:~$ cd Entwicklung/web/index-redirect/
    felix@laptop:~/Entwicklung/web/index-redirect$ echo 'foo' > index.html
    felix@laptop:~/Entwicklung/web/index-redirect$ echo 'RedirectPermanent /index.html http://index-redirect.localhost/' > .htaccess
    felix@laptop:~/Entwicklung/web/index-redirect$ wget --max-redirect=3 index-redirect.localhost/index.html
    --2014-07-14 16:09:20--  http://index-redirect.localhost/index.html
    Auflösen des Hostnamen »index-redirect.localhost (index-redirect.localhost)«... 127.0.0.1
    Verbindungsaufbau zu index-redirect.localhost (index-redirect.localhost)|127.0.0.1|:80... verbunden.
    HTTP-Anforderung gesendet, warte auf Antwort... 301 Moved Permanently
    Platz: http://index-redirect.localhost/[folge]
    --2014-07-14 16:09:20--  http://index-redirect.localhost/
    Wiederverwendung der bestehenden Verbindung zu index-redirect.localhost:80.
    HTTP-Anforderung gesendet, warte auf Antwort... 301 Moved Permanently
    Platz: http://index-redirect.localhost/[folge]
    --2014-07-14 16:09:20--  http://index-redirect.localhost/
    Wiederverwendung der bestehenden Verbindung zu index-redirect.localhost:80.
    HTTP-Anforderung gesendet, warte auf Antwort... 301 Moved Permanently
    Platz: http://index-redirect.localhost/[folge]
    --2014-07-14 16:09:20--  http://index-redirect.localhost/
    Wiederverwendung der bestehenden Verbindung zu index-redirect.localhost:80.
    HTTP-Anforderung gesendet, warte auf Antwort... 301 Moved Permanently
    Platz: http://index-redirect.localhost/[folge]
    3: Die Anzahl der Verweise ist zu groß.
    felix@laptop:~/Entwicklung/web/index-redirect$

    Das ganze erzeugt eine wunderschöne Endlosschleife, wie man in der vorletzten Zeile sieht:
    3: Die Anzahl der Verweise ist zu groß.


    Die richtige Antwort wäre gewesen, warum willst du das anders haben? Wie ich das im HTML jetzt schreibe ist doch egal, schließlich sieht es im folgenden doch auch sauber aus:
    <!Doctype html>
    <html lang="de">
      <head>
        <base href="/" />
        <title>Foo</title>
      </head>
      <body>
        <a href="/">Home</a>
      </body>
    </html>


    Mit freundlichen Grüßen

    * Edit: Wording error
  • in: Musik Codecs auf dem Server installieren

    geschrieben von nemoinho

    Mhm ich denke dein Problem ist nicht sinnvoll zu lösen, indem du die verschiedenen Subdomains wild durch die Gegend verweist.

    Um das ganze etwas zu verdeutlichen stelle ich dir mal die Frage, warum du gerne hallo-robby.de hier hosten würdest, aber music.hallo-robby.de woanders. Wenn dein einziges Problem darin besteht, dass du einige Funktionen wie z.B. deine Codecs nicht nutzen kannst ist die sinnvollere Alternative diese Dienste auszulagern.

    Dazu müsstest du dir eine Umgebung suchen, wo diese Dienste zur Verfügung stehen und mittels einer API die Dienste dort nutzen, der eigentliche Webauftritt kann dann immernoch zentral über lima erfolgen.

    Mit freundlichen Grüßen
  • in: Mehrere MySQL-Abfragen (mehrere Tabellen) gleichzeitig

    geschrieben von nemoinho

    @fabo hat es schon gesagt, nur dass es vielleicht nicht so eindeutig ist, was willst du eigentlich genau machen?

    Nach allem was du uns jetzt geschrieben hast könnte ich mal meine Glaskugel bemühen und raten, dass du eine Seite mit einem bestimmten Inhalt anzeigen willst und dazu ein Menü, wo jeder Menüeintrag abgespeichert werden soll, oder?

    Warum machst du das dann nicht auch genau so? Beispiel gefällig?
    Template:
    <!Doctype html>
    <html>
    <head>
      <title><?php echo $inhalt['seite'] ?></Foo>
    </head>
    <body>
      <ul>
        <?php foreach($menu as $entry): ?>
        <li>
          <a href="<?php echo $entry['link']; ?>"><?php echo $entry['titel']; ?></a>
        </li>
        <?php endforeach; ?>
      </ul>
      <?php echo $inhalt['artikel']; ?>
    </body>
    </html>

    PHP:
    <?php
    $inhalt = array();
    $menu = array();
    $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB);
    $query = "SELECT `Seite`, `Artikel` FROM `Inahlt` WHERE id = ?";
    if($stmt = $mysql->prepare($query)){
      $stmt->bindParam('i', $pageId);
      $stmt->execute();
      $stmt->bindResult($seite, $artikel);
      if(!$stmt->fetch()){
        die("Fehler Seite existiert nicht");
      }else{
        $inhalt['seite'] = $seite;
        $inhalt['artikel'] = $artikel;
      }
      $stmt->close();
    }
    $query = "SELECT `Link`, `Titel` FROM `Menu`";
    if($stmt = $mysql->prepare($query)){
      $stmt->execute();
      $stmt->bindResult($link, $titel);
      while($stmt->fetch()){
        $menu[] = array(
          'link' => $link,
          'titel' => $titel,
        );
      }
      $stmt->close();
    }
    include_once 'template.php';

    Das Ganze ist wie immer ungetestet und weder besonders gut, noch besonders sinnvoll, aber es sollte funktionieren.
    Aber es bleibt dabei, gleichzeitig gibt es nicht ;-) und ohne Angabe, was du überhaupt machen willst können wir dir nicht helfen.

    Mit freundlichen Grüßen
  • in: Formular-Eingabe live prüfen (mit JS)

    geschrieben von nemoinho

    Hi,

    eigentlich ist das alles nichts kompliziertes, idealerweise ist das Script dabei natürlich einfach zu erweitern und ebenfalls einfach zu verwenden.
    Ich würde darum vorschlagen, dass man einfach nur ein Script einbindet und dann an jedem Input-Element, welches validiert werden soll ein neues Attribut hinzufügt, um anzugeben, dass das Element validiert werden soll.
    Das HTML sähe dann z.B. so aus:
    <input name="url" validate="url" />
    <input name="date" validate="date" />
    <input name="age" type="number" validate="int" />
    <input name="mail" type="email" validate="email" />
    <script type="text/javascript" src="formvalidator.js"></script>

    Das entsprechende JS sähe so aus:
    FormValidator = (function(){
      "use strict";
      var callback, dateFormat;
      var checks = {
        'date': function(src){
          return dateFormat.test(src.value);
        },
        'int': function(src){
          return src.value % 1 === 0 && !/\./.test(src.value);
        },
        'url': function(src){
          // hier check einfügen
        }
        /*
         * nach diesem Schema weitere Checks hinzufügen
         * jeder Check der in dieser Liste steht kann sofort im
         * HTML-Attribute validate verwendet werden!
         */
      };
      var runChecks = function(e){
        e = e || event;
        var src = e.target || e.srcElement;
        var validation = src.getAttribute('validate').toLowerCase();
        var ret = true;
        if(checks[validation]){
          ret = checks[validation](src);
        } else {
          console.log("The function checks." + validation + "() doesn't exists");
        }
        callback(src, ret);
      };
      return function(localCallback, localDateFormat){
        callback = localCallback || function(){};
        dateFormat = localDateFormat || /\d\d\.\d\d\.\d{4}/;
        var inputElements = document.querySelectorAll('input[validate]');
        for(var i = inputElements.length, tmp; i--; ){
          tmp = inputElements[i];
          tmp.onkeydown = tmp.onkeyup = runChecks;
        }
      }
    })()
    FormValidator();
    Ich habe den Code jetzt nicht getestet, sondern nur hier im Forum geschrieben, aber grundsätzlich sollte der so funktionieren.
    Alle Checks die in dem Object checks hinterlegt sind können sofort im HTML genutzt werden.
    Wenn du z.B. die Felder rot färben willst, die Falsch sind, kannst du das über einen callback lösen. Dazu ruft du nicht
    FormValidator()
    am Ende der Datei auf, sondern z.B. folgendes:
    FormValidator(function(element, result){
      element.style.background = result ? '' : 'red';
    })


    Insgesamt ist das doch recht einfach oder?

    FormValidator hat dazu noch einen zweiten Parameter, der das Datumsformat als Regex erwartet, ansonsten wird das Format "xx.xx.xxxx" erwartet.
    Außerdem wird in der Konsole mitgeloggt, wenn das Attribut validate einen falschen Wert enthält.

    Mit freundlichen Grüßen
  • in: php verstecken

    geschrieben von nemoinho

    Hi,

    als erstes ein wichtiger Hinweis, dein Code enthält eine üble Sicherheitslücke. Oder ist das hier etwa nicht der Quelltext deiner error.php im Root-Verzeichnis :smokin:
    <?php
        $myinclude = 'head/errorhead.php';
        if (file_exists($myinclude))
        require $myinclude;
    ?>
    <div id="errorlinks">
        <?php
            $myinclude = 'split/errorL.php';
            if (file_exists($myinclude))
            require $myinclude;
        ?>
    </div>
    <div id="errorrechts">
    	<?php
            $myinclude = 'split/regist.html';
            if (file_exists($myinclude))
            require $myinclude;
         ?>
    </div>
    <?php
        $myinclude = 'head/errorfooter.php';
        if (file_exists($myinclude))
        require $myinclude;
    ?>


    Aber zurück zu deiner Frage, erkläre doch bitte was du damit meinst, dass du keinen Bildlink mehr haben willst, wie willst du denn dann ein Bild einbinden?
    HTML ist nur eine Beschreibungssprache und in dem Fall beschreibt die URL halt die Bildadresse, wie sonst sollte der Browser wissen, welches Bild er laden soll?

    Also beschreibe einfach genauer, was dein Ziel ist, dann ist es leichter dir zu helfen!

    Mit freundlichen Grüßen
  • in: Rechnen mit Rest (modulo) in PHP

    geschrieben von nemoinho

    Da wirst du so ohne weiteres gar nichts finden.

    Die offizielle DB dazu findest du hier: https://www2.swift.com/directories/
    Allerdings musst du eine Bank sein um dir das herunterladen zu können ;-)

    Da kannst du mir durchaus glauben, da ich selbst für Banken gearbeitet habe und wir genau aus diesem Grund immer eigene Repositories benutzt haben.
    Diese internen Repositories enthielten dann alle wichtigen BICs, das heißt vor allem die BICs für die Kanalinseln wie z.B. Jersey und die französischen Überseegebiete wie z.B. Mauritius, da die Ländercodes dieser Gebiete von denen der IBANs abweichen. Bei allen anderen BICs kann man die BICs einer Plausibilitätsprüfung unterziehen und damit relativ sicher feststellen, ob diese korrekt sind.

    Wie gesagt, man findet das Repository für Deutschland, das du ja auch schon verlinkt hast und auch noch ein paar andere aber nicht alle, ist leider so.

    Alternativ gibt es aber im Internet einige Seiten, auf denen man BICs erfragen kann, eventuell bietet ja eine davon eine API an, die du nutzen könntest, z.B. über REST oder SOAP.

    Mit freundlichen Grüßen

    * Edit: Link verlinkt ;-)
  • in: Aufforderungscode zum Aktivieren von Scripten

    geschrieben von nemoinho

    Hi,

    ich möchte noch nachwerfen, dass es da auch noch eine andere etwas elegantere Methode gibt, die vollkommen darauf fusst, dass JS optional ist. Ich habe die Methode auf meinem lima-webspace hochgeladen, da sie insgesamt zwar sehr simpel ist, aber einer kurzen Erklärung bedarf.

    Insgesamt finde ich sehr viel angenehmer zu benutzen, als die noscript-Lösung. Das noscript-Tag habe ich noch nie wirklich benutzt, es zeugt auch meistens nur davon dass der Programmierer keine Lust hatte eine echte Lösung zu schreiben oder das der Code insgesamt von schlechter Qualität ist.

    Mit freundlichen Grüßen
  • in: Array Element löschen und andere nachschieben.

    geschrieben von nemoinho

    Hi,

    ehrlich gesagt verstehe ich nicht, welches Problem du hast, denn das was du beschreibst ist zumindest in Javascript nicht der Fall. Ich würde deswegen gerne sehen, wie dein Code dazu aussieht, denn ich würde fast drauf wetten, dass dort der Fehler ist.
    Weil so wie du das beschreibst ist es nicht so wie es ist, Beispiel gefällig:
    // zuerstmal 2 Hefer-variablen...
    var out = '', i;
    // erzeuge folgendes Array: arr = [0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f']
    var arr = 'a0b0c0d0e0f'.split(0);
    // entnehme ein Element 
    var spl = arr.splice(2,1);
    // spl enthält jetzt dieses Array: [0 => c]
    for(i in spl){out += 'spl[' + i + '] => "' + spl[i] + '"\n'}
    alert(out);
    // und arr sieht so aus: [0 => a, 1 => b, 2 => d, 3 => e, 4 => f]
    // das kann man auch so beweisen:
    out = '';
    for(i in arr){out += 'arr[' + i + '] => "' + arr[i] + '"\n'}
    alert(out);
    Ich verstehe also nicht, welches Problem hierbei auftreten soll!

    Mit freundlichen Grüßen
  • in: W3C validator Error wegen Content-Encoding

    geschrieben von nemoinho

    Hi,

    so jetzt kommt die Gegenfrage, hast du es mit dem folgenden ausprobiert:
    <FilesMatch ".*">
      SetOutputFilter identity
    </FilesMatch>


    Und wenn das nicht funktioniert, wäre die nächste Frage, was für ein Framework oder CMS du für den Webausftritt benutzt.

    Mit freundlichen Grüßen
  • in: [HTML und CSS] Codebox mit Zeilennummern

    geschrieben von nemoinho

    Hallo,

    ich hätte da so in etwa gelöst, es wird allerdings PHP benötigt: online-Beispiel

    Der Code dazu ist denkbar simpel PHP:
    <?php
    // $code wird hier hart gefüllt,
    // schlauer ist es natürlich den eigentlich code
    // in einer Datei zu speichern und $code dann 
    // wie folgt zu füllen:
    // $code = file_get_contents(CODE_FILE);
    $code = <<<'HERE_ENDS'
    Hallo
    Welt!
    Dieses ist
    ein einfaches Beispiel.
    Diese Zeile ist zwar äußerst unnötig, aber sie zeigt sehr gut, dass das Code-Fragment auch überlange Texte gut verabreitet. Und damit man dies auch definitiv sieht wird diese Zeile entsprechend lang gemacht. Und zwar indem einfach sinnlose Phrasen aneinander gereit werden, bis die Zeile eine stattliche Länge erreicht hat.
    HERE_ENDS;
    // code in einzelene Zeilen aufbrechen
    $codelines = explode("\n", $code);
    // ermitteln, wie breit der Platz für die Nummerierung sein muss
    $width = strlen(''.count($codelines))*7;
    // Ausgabe vorbereiten
    $code = '';
    foreach($codelines as $line){
        $code .= '<span class="line">' . $line . '</span>';
    }
    require_once 'code-box.html';

    HTML:
    <!Doctype html>
    <html lang="de">
    <!--[if IE]><![endif]--><!-- Hack for IE performance view: http://www.phpied.com/conditional-comments-block-downloads -->
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="description" content="Ein Beispiel für eine simple Code-box" />
        <title>Code-box</title>
        <style>
            @import url('code-box.css');
            code .line { padding-left:<?php echo $width+9; ?>px; }
            code .line:before { width:<?php echo $width; ?>px; } 
        </style>
    </head>
    <!--[if lt IE 7]><body class="ie ie6"><![endif]-->
    <!--[if IE 7]><body class="ie ie7"><![endif]-->
    <!--[if IE 8]><body class="ie ie8"><![endif]-->
    <!--[if !IE]><!--><body class="no-ie"><!-- <![endif]-->
    <code><?php echo $code; ?></code>
    </body>
    </html>

    CSS:
    code { display:block; overflow:auto; border:1px solid #000000; background:#fafafa; font:13px/16px inherit; counter-reset:foo; }
    code .line { display:block; position:relative; margin:0; padding:0; counter-increment:foo; }
    .pre code .line { white-space:pre; }
    code .line:before { position:absolute; top:0; left:0; height:100%; padding:0 3px; background:rgba(0,0,127,.3); text-align:right; content:counter(foo) ''; }
    code .line:nth-of-type(even) { background:#ccc; }
    code .line:hover { background:rgba(0,127,0,.7); }

    Wie man sieht sehr simpel.

    Im online-Beispiel kann man noch auswählen, ob Zeilen umgebrochen werden sollen, oder nicht.
    Aber das ist ja im Endeffekt auch egal.

    Mit freundlichen Grüßen
  • in: Textarea counter mit Javascript

    geschrieben von nemoinho

    menschle schrieb:
    Das wird in der Form nicht funzen, allerdings ist das Chatscript auch sehr verschachtelt.

    Warum sollte das nicht funktionieren?
    Wenn ich die Funktion noch ein wenig kleiner mache sieht meine Komplettlösung so aus (obwohl der TE damit vermutlich nicht viel anfangen kann):
    <!Doctype html>
    <html>
    <head>
    <style>
    *{margin:0;padding:0}.a{position:relative;margin:10px;width:400px}#b{width:100%}.a p{position:absolute;bottom:3px;right:3px}
    </style>
    <body>
    <div class="a"><textarea maxlength="200" cols="100" rows="8" id="b"></textarea><p></p></div>
    <script>
    !function(a,b,c,d){b=a.nextSibling,d=function(){b.innerHTML=a.maxLength-a.value.length};for(c in a)/onk/.test(c)&&d(a[c]=d)}(document.getElementById('b'))
    </script>

    Zugegeben das ist jetzt übel verstümmeltes HTML aber es funktioniert und das komplette JS ist gerade mal 154 Zeichen lang, viel kürzer gehts nicht mehr, da ich hier schon ein paar Tricks ausgegraben habe um den Code zu verkürzen :biggrin:

    Aber bevor ich hier jetzt einen Krieg anzettel möchte ich kurz darauf hinweisen, dass mein Lösungsvorschlag auch mehr als Anregung gedacht war. Der TE sollte einfach selber ein wenig gucken, wie er eine gescheite Lösung aus den Vorschlägen ableiten kann.

    Übrigens kann man sich meinen funktionierenden Code auch als Online-Beispiel ansehen.

    Mit freundlichen Grüßen
  • in: Textarea counter mit Javascript

    geschrieben von nemoinho

    menschle schrieb:
    Schaue es Dir in diesem Quelltext ab:
    http://diehoerbar.net/hbcomm/chat

    Aber vermutlich soll das Rad immer wieder neu erfunden werden, ne?

    ;)


    menschle hat schon recht, aber da ich immer gerne helfe ist hier ein Beispiel:
    HTML:
    <div><textarea maxlength="200"></textarea><p></p></div>
    CSS:
    div{position:relative}textarea{position:relative}p{position:absolute;bottom:3px;right:3px}
    JS:
    !function(a){a('textarea').onkeyup=function(){a('p').innerHTML=this.getAttribute('maxlength')-this.value.length}}(function(a){return document.getElementsByTagName(a)[0]})

    Nun kurz zu dem Code, ich habe das nicht getestet und mich daran gehalten, das menschle meinte, dass du doch bitte noch mal gugeln solltest. Das JS greift nicht in den globalen Namespace ein, es kann also ohne Bedenken genutzt werden, allerdings funktioniert es auch nur, wenn es genau so vorkommt, andernfalls knallts halt. Du musst also obwohl hier eine Lösung liegt nocheinmal den Code durchsehen und anpassen und viel wichtiger verstehen was passiert ;-) .

    Mit freundlichen Grüßen
  • in: (PHP) MySQL-Befehle werden nicht ausgeführt - Warum

    geschrieben von nemoinho

    hackyourlife schrieb:
    Außerdem ist dein Code gegen SQL-Injection anfällig, du solltest unbedingt mysql_real_escape_string() benutzen!


    Danke für den Hinweis, endlich sagt das hier mal jemand!

    Genau diese Lücken meinte ich in meinem Beitrag zum CMS als ich von den eklatanten Sicherheitslücken schrieb. Insgesamt bietet das Script keinen Schutz gegen Eingriffe von außen, oder anders gesagt kann jeder, auch ein nicht angemeldeter Gast Daten speichern oder Seiten löschen.

    Mit freundlichen Grüßen.
  • in: Bitte Feedback und Ideen für mein CMS

    geschrieben von nemoinho

    Hallo,

    nach dem guten Beitrag von imho kann ich ihm eigentlich nur Beipflichten.

    Vorweg, mein Anspruch an ein CMS ist sehr hoch deswegen benutze ich selbst modX, ein CMS, welches eigentlich gar keines ist, sondern mehr ein Framework. Es bietet keine Plugins oder Module im herkömmlichen Sinne an, sondern nur Chunks, Snippets und Template-Variablen, aus denen sich aber binnen kürzester Zeit ein Blog oder Gästebuch zusammensetzten lässt, welches komplett selbst gestaltet werden kannund bei dem der Code zu 100% in deiner Hand liegt!
    Für Leute, die nur schnell ein stabiles CMS brauchen, ohne so viel Eigenleistung zu investieren, empfehle ich dagegen meist Typo3, Joomla oder Drupal, je nachdem wo ich gerade mehr Lust zu habe und ob derjenige danach noch Hilfeleistungen von mir erhalten will.

    So, ich habe dein CMS also heruntergeladen und ausprobiert um zu sehen, ob sich das ganze den auch als CMS verwenden lässt und will nicht unhöflich sein, aber es ist großer Dreck. Von Anfang an gab es Probleme und ich muss ehrlich fragen ob das Teil bei dir wirklich läuft? Wenn ja dann installier ich es nochmal um mir noch ein paar Sicherheitslücken rauszusuchen um dir im Liveberieb zu zeigen, was du alles besser machen kannst. Über diese Lücken bin ich nämlich beim letzten Mal schon gestolpert.

    Damit du aber was lernen kannst, hiereinmal ein kleiner Erfahrungsbericht:

    Die Installation – Schon vorweg mehr habe ich nicht gemacht, warum das so ist steht am Ende.

    Damit die Installation starten kann entferne ich estmal die Leerzeichen im Pfad zum CMS, das macht man nicht!

    So danach stellt sich die nächste Frage – Welche Installation? Wenn man nicht aktiv nach dem Ordner installation sucht findet man die Installation nicht, statt dessen bekommt man eine Fehlermeldung, dass irgendwelche Datei nicht existieren, die erste davon soll wohl die Zugangsdaten beinhalten.
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-1.png
    Kurz um ich habe an den Anfang der index-Datei eine Weiterleitung zur Installation geschrieben, falls diese Datei nicht existiert. Das hättest du auch machen können, so ist die Installation doof. Außerdem fällt hierbei auch noch auf, dass du alle Zeichenketten harkodiert verwendest, so sind Änderungen schwer durchzuführen, da man immer alle Vorkommen des String finden muss und dann auch noch sicher sein muss, dass er auch so gemeint ist – Also habe ich das für diesen Fall auch angepasst.
    <?php
    define('ROOT_PATH', dirname(__FILE__));
    define('CONFIGURATION_PATH', ROOT_PATH . '/konfiguration');
    define('CONNECTION_DATA', CONNECTION_DATA . '/zugangsdaten.php');
    if(!is_readable(CONNECTION_DATA)){
        header('Location: installation/index.php');
        exit;
    }
        include CONNECTION_DATA;
    // …


    So danach kam auch endlich die Installation. [
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-2.png
    Aber auch an dieser Stelle war ich gemein und habe die beiden Links oben rechts ausprobiert und bin damit auf einer nicht definierten Seite gelandet. Das selbe ist mir dann nochmal mit dem Link passiert, auf dem man Bugs melden soll, auch das könnte man abstellen.
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-3.png

    Dann ging es weiter zur zweiten Seite der Installation.
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-4.png
    Doch auch auf dieser Seite wurde ich von einem Fehler begleitet.
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-5.png
    Also habe ich auch diesen berichtigt, wie bereits den Fehler auf der Startseite, so dass die Zeile 33 bei mir nun so aussieht:
    $fehler = isset($_GET['fehler']) ? $_GET['fehler'] : false;

    Anschließend habe ich die Datenbank konfiguriert, dazu habe ich eine neue DB angelegt und einen eigenen Nutzer, der nur auf diese DB zugriff hat. Nach den ganzen Anfängerfehlern, die bisher begangen wurden konnte ich es nicht riskieren das Programm auf eine andere DB losgehen zu lassen.

    Nach der DB-Konfiguration wollte ich aber auch noch sehen, wie dein CMS mit einer Falscheingabe bei den Zugangsdaten umgeht. Das Fazit muss lauten scheiße.
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-6.png
    Da sind wie ich befürchtet hatte gar keine Sicherungen eingebaut, die die Fehler sinnvoll behandeln könnten. Da es mir jedoch zu nervig war diese Fehler selbst zu bereinigen bin ich einen Schritt zurück gegangen und habe die korrekten Daten eingegeben.
    Doch auch nachdem ich die korrekten Daten eingegeben habe bin ich auf einer Seite bestehend aus Fehlermeldungen gelandet.
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-7.png
    Diese Fehler musste ich nun leider behandeln, um in der Installation fortzufahren.
    Und wie bereits bei den ganzen Fehlern zuvor sind auch diese Fehler echt strunzdumme Fehler, die gar nicht passieren dürfen! Wie man sieht sind die ersten Fehler alle in Zeile 38, danach folgen noch einige weitere Fehler. Also sehen wir uns mal Zeile 38 an.
    // Ich habe die Zeile umgebrochen,
    // um sie besser lesen zu können.
    $zugangsdaten = "<?php $server = '".$MySQL_Server."'; $user = '".
    $MySQL_User."'; $passwort = '".$MySQL_Passwort."'; $datenbank = '".
    $MySQL_Datenbank."'; ?>";
    Was fällt hier auf? – Richtig Variablen maskieren kennt der Autor nicht.
    Also auch diesen Fehler bereinigt und dabei gleich eine sinnvollere Schreibweise gewählt, damit der Code besser zu lesen ist.
    $zugangsdaten = sprintf(
        "<?php" . PHP_EOL
            . "\$server = '%s';" . PHP_EOL
            . "\$user = '%s';" . PHP_EOL
            . "\$passwort = '%s';" . PHP_EOL
            . "\$datenbank = '%s';",
        $MySQL_Server,
        $MySQL_User,
        $MySQL_Passwort,
        $MySQL_Datenbank
    );
    Nach dieser Korrektur habe ich mir die weiteren Fehler angesehen und siehe da schon wieder ein hart codierter String in Zeile 39 und interessanterweise ist es der selbe Teil den ich bereits ganz am Anfang der Installation korrigiert habe, es wäre also definitv sinnvoll diese ganzen Teile in einer Konfigurationsdatei auszulagern und sie dort als Konstanten zu speichern. In diesem Fall war die Datei übrigens nicht zu finden, da der falsche Ordner angegeben wurde zum Vergleich:
    // Original:
    $datei = fopen("../konfiguration/zugangsdaten.php","w");
    // Meine Korrektur
    $datei = fopen("../../konfiguration/zugangsdaten.php","w");
    Der Rest waren dann wieder Folgefehler, weil es keine vernünftige Fehlerbehandlung gibt!

    Anschließend wurde ich auf die 3. Seite der Installation weitergeleitet, wo ich meine Nutzerdaten eingeben sollte.
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-8.png
    Doch auch auf dieser Seite wurde ich von einer unschönen Fehlermeldung begleitet.
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-9.png
    Es ist übrigens genau (!?!) der gleiche Fehler wie bereits auf der vorherigen Seite, wo auch $_GET['fehler'] falsch abgefragt wurde.

    Nachdem ich auf dieser Seite meine Anmeldeinformationen eingegeben habe wurde ich, ohne Fehler, zu folgender Seite weitergeleitet:
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-10.png
    Durch einen Klick auf "Starten" wurde ich allerdings gleich zum nächsten Fehler weitergeleitet:
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-11.png
    Und dieser Fehler war in mehrfacher Hinsicht interessant.
    1. Warum werden die Nutzerdaten bereits aus der Datenbank geholt, obwohl ich mich zu diesem Zeitpunkt noch nicht eingeloggt haben kann?
    2. Es wurden offensichtlich wieder keine Fehler behandelt, den die Funktion mysql_fetch_array() wird ja erst zu einem späteren Zeitpunkt aufgerufen und an der Stelle hätte ja eine Instanz zurückkommen müssen, auf die man die Funktion anwenden kann.
    3. Wie kann es an dieser Stelle zu einem Fehler kommen, es hätte doch eine Instanz zurückgegeben werden müssen außer wenn die Datenbank leer ist, aber warum ist diese leer, wenn doch die Datenbank mindestens einen Nutzer beinhalten sollte?

    Um also den 3. Fehler zu korrigieren muss ich weiter ausholen, denn um ihn vollständig nachzuvollziehen musste ich einen Schritt zurück gehen und mir ansehen, wie den die Datenbank angelegt und befüllt wurde und habe dabei gleich die nächsten Fehler entdeckt.
    Wie sollte also die Datenbank angelegt werden? So:
    require_once('../../konfiguration/zugangsdaten.php');
    mysql_connect($server,$user,$passwort);
    mysql_select_db($datenbank);
    $befehl = file_get_contents('datenbank_erstellen.sql');
    mysql_query($befehl);
    mysql_close();
    header("Location: ../Installation_beenden");
    Das mit den hartcodierten Strings hatte ich ja bereits (es ist übrigens schon wieder der selbe…), danach folgt der DB-Login, dies ist zwar auch nervig, das das nicht zentral gesteuert ist, aber seis drum anschliessend wird eine SQL-Datei eingelesen und in der Variablen $befehl gespeichert. Diese soll anschließend mittels mysql_query() auf der DB ausgeführt werden. Und genau da ist das Problem, das geht nicht so, wie der Autor sich das vorgestellt hat, denn die Datei enthält alle SQL-Statements um alle nötigen Tabellen (übrigens nur 4, ungewöhnlich und wahrscheinlich auch nicht sinnvoll…) zu erstellen. Doch genau das kann PHP nicht. PHP verabschiedet sich nach dem ersten ; und sagt, danke, mehr brauche ich nicht. In diesem Fall sogar noch früher, warum weiß ich nicht, brauche ich auch nicht wissen, schließlich wurde hier schon in der Architektur gepatzt. Übrigens ist hier mal der DB-Stand nach der Installation, wie man sieht sind gar keine Tabellen erstellt worden.
    http://nemoinho.lima-city.de/ilg-test/img/ILG-install-12.png

    Und genau an dieser Stelle ist dann auch mein Test zuende, da offensichlich nicht mal ein CMS installiert wurde.

    Wie gesagt, ich würde jedem, wirklich jedem davon abraten dein CMS in dieser Form zu nutzen. Aufgrund meines Installationsversuchs habe ich viele Quelltexte aus dem CMS gesehen und würde deswegen davon abraten das CMS überhaupt zu benutzen, auch in der Zukunft mit neueren Versionen. Hier wurden einfachste Verfahren offensichlich nicht verstanden, da sie püberhaupt nicht angewendet wurden und entsprechend auch keine weiteren Programmiertechnischen Vorgehensweisen eingehalten. Außerdem ist das CMS im Installierten Zustand ein Einfallstor, um den Webspace zu kapern, da es keinerlei Prüfungen durchführt. Dies kann ich mit Sicherheit sagen, obwohl ich das CMS nicht zuende installiert habe. Da ich ich gesehen habe wie simpel die DB organisiert war und wie wenige Dateien insgesamt benötigt wurden habe ich den Quelltext einmal etwas überflogen und dabei harstäubende Sicherheitslücken gefunden.

    Kurz um ein typisches Anfängerprojekt, ich habe als ich angefangen habe auch häufiger solchen Dreck geschrieben, deswegen kann ich nachvollziehen, worum es in dem Programm geht. Aber um andere davor zu schützen ihr System aufzureißen solltest du das CMS definitiv nicht mehr verbreiten.

    Diese Lücken werde ich hier aber nicht veröffentlichen, da ich gesehen habe, dass du das CMS hier auf lima installiert hast und somit dein Webspace ohne Probleme gekapert werden kann, lösche also zuvor deine Installation oder schreibe mich per PN an, wie du das Problem beseitigen kannst.

    Bevor du dich aber nun daran setzt den ganzen Code zu verbessern möchte ich dir sagen, dass du (so leid mir das auch tut) am besten nochmal von vorne beginnst und nichts, aus der alten Codebasis wiederverwendest, das HTML ist gut, sauber strukturiert und so, aber das PHP solltest du komplett neu schreiben.

    Als kleine Hilfestellung solltest du dir überlegen, warum du ein und den selben String so oft benutzt und warum du alle Naselang eine neue mysql-Verbindung öffnest, das verlangsamt nur den Netzwerkverkehr, bzw. den Verkehr zwischen Rechner und Storage. Falls du wissen willst warum: Bei vielen professionellen Serversystemen liegt die Datenbank auf einem ganz anderen Rechner, obwohl sie zum Teil immernoch als localhost zu erreichen ist. Deswegen sollte man auf die Datenbankverbindung etwas achten.

    Übrigens habe ich die Installation auf einem Debian-system mit dem Apache aus den Repositories durchgeführt, welche genauen Einstellungen ich sonst noch vorgenommen habe weiß ich nicht mehr genau. Ich habe aber definitv etwas am Fehlerprocessing herumgespielt, um möglichst jeden Fehler zu finden.

    * Edit: Ich habe übrigens gerade gesehen, dass ich in der Nähe von dir zur Schule gegangen bin, ich war auf der G17 und hatte Deutsch an der GSK und Sport teilweise in der Schule am Stübenhofer Weg oder wie die das heißt…

    Mit freundlichen Grüßen
  • in: CSS Fixed Zoom

    geschrieben von nemoinho

    Hallo,

    dein Problem ist eigentlich ganz einfach.

    Für die Lösung deines Problems positionierst du das div in der Mitte und verschiebst es dann an den Rand, das sähe etwa so aus:
    #a1 { position:fixed; top:35px; left:50%; margin-left:280px }
    Wie gesagt ganz einfach, mit ein wenig Übung kommst du in Zukunft auch selbst darauf, aber jeder halt mal klein angefangen.

    Mit freundlichen Grüßen
  • in: PHP Vor- und Rechenzeichen (-)

    geschrieben von nemoinho

    Hallo alle zusammen,

    bevor hier noch mehr Antworten kommen, die versuchen mit viel Halbwissen eine Lösung mit regulären Ausdrücken zu finden will ich intervenieren.

    Die Aufgabenstellung kann man zwar mit regulären Ausdrücken lösen, allerdings ist die Lösung eher unschön und nicht mehr sehr übersichtlich.

    Besser ist es die Zeichenkette durch einen Parser zu schicken, dieser ist zwar erstmal langsamer aber die Geschwindigkeit nimt maximal linear zu. Diese Annahme kann man von einem regulären Ausdruck nicht annehmen.

    Ein Parser, welcher die gestellte Aufgabe löst sieht z.B. etwa so aus:
    function parse($string)
    {
        $result = array();
        $string = trim($string);
        $stringAsArray = str_split($string);
        $buffer = ''; 
        for($i=0,$end=count($stringAsArray);$i<$end;$i++){
            $local = $stringAsArray[$i];
            $last = $i > 0 ? $stringAsArray[$i-1] : '+';
            if(!ctype_digit($local)){
                if($buffer != ''){
                    $result[] = $buffer;
                }   
                if(ctype_digit($last)){
                    $result[] = $local;
                    $buffer = ''; 
                }else{
                    $buffer = $local;
                }   
            }else{
                $buffer .= $local;
            }   
        }   
        $result[] = $buffer;
        return $result;
    }
    
    $result = parse('20--1-3');
    print_r($result);
    Der gezeigte Code kann noch erheblich verbessert werden, z.B. durch eine flexiblere Abfragelogik, aber er erfüllt die gegebene Aufgabenstellung.

    Groß getestet habe ich den Code jedoch auch nicht.

    Mit freundlichen Grüßen
  • in: JS match gibt undefined zurück

    geschrieben von nemoinho

    Hallo,

    eine Anmerkung ist außerdem noch zu treffen, im Moment ist die Funktion getstr auch noch nicht mehr als ein unglaublich große join-Methode. Oder um es kurz zu machen könnte man den kompletten Funktionsaufruf so ersetzen:
    function a()
    {
    	var data = "(3+2)"
    	var splitdata = data.match(/[\+\-\*\/\(\)]|(\d+)/g);
    	data = splitdata.join('');
    	alert(data);
    }


    Mit freundlichen Grüßen
  • in: Ausgabe sortieren

    geschrieben von nemoinho

    Natürlich! Benutze einen anständigen Editor! Dreamweaver ist der größte Dreck…

    Ich selbst benutze vim, aber der erfordert richtig viel Einarbeitungszeit und ist auf Windows – naja eher suboptimal, halt nen Unix-Editor.

    Auf Windows benutze ich normalerweise Notepad++ oder auch Eclipse, wenn ich eine IDE haben will.

    Übrigens zeigt dir der Dreamweaver den Fehler an, weil diese Syntax erst mit PHP 5.3 eingeführt wurde und der Dreamweaver wie gesagt scheiße und noch nicht so aktuell ist.
    Vor PHP 5.3 musste man die Funktion noch als String übergeben und vorher bereits deklarieren, oder mittels create_function zur Laufzeit eine Funktion zusammenbauen, was aber noch umständlicher ist. Das sah dann etwa so aus:
    function sorter($arr1, $arr2){
        return $arr1['punkte_live'] < $arr2['punkte_live'] ? 1 : -1;
    }
    usort($rows, 'sorter');

    Die neuere Schreibweise nennt sich Lambda-Funktion. Eine Lambda-Funktion ist eine Funktion, die ohne Angabe eines Namens geschrieben wird und direkt als Argument übergeben wird. In Javascript ist das ein übliches Verfahren, wenn du z.B. an die each-Funktion aus diversen JS-Libs denkst, die erwartet ja auch eine Funktion als Argument. In MooTools sähe das so aus:
    // Variante 1
    var alertEntry = function(entry){alert(entry)};
    [1,2,3,4,5].each(alertEntry);
    // Variante 2
    [1,2,3,4,5].each(function(entry){alert(entry)});

    Bei JS kommt hierbei in bestimmten Situationen auch noch ein Performanceunterschied zustande, der jedoch normalerweise zu vernachlässigen ist. Wie der Unterschied in PHP ist weiß ich nicht, er dürfte jedoch ebenfalls zu vernachlässigen sein.

    Mit freundlichen Grüßen
  • in: Ausgabe sortieren

    geschrieben von nemoinho

    Hallo,

    das kannst du am leichtesten mittels eines Arrays und der Funktion usort machen.

    Ich nehme dazu einfach mal dein Beispiel und passe es etwas an.

    // Bereite das SQL vor
    $sql = <<<HERE_ENDS_SQL
    SELECT *
      FROM eintragen
     WHERE art = 2
       AND kw < %s
     ORDER BY endzeit DESC
    HERE_ENDS_SQL;
    $sql = sprintf($sql, $searchKW);
    $ergebnis = mysql_query($sql);
    $menge = mysql_num_rows($ergebnis);
    $rows = array();
    while($row = mysql_fetch_array($ergebnis))
    {
        // speichere das reultat im $rows-array
        $rows[$row['id']] = $row;
        // das hier ist großer scheiß, weil es total
        // unperformant und bestimmt noch verbesserungsfähig ist
        $url = "http://www.urlzurapi/api/user.{$row['id']}.xml";
        $xml_user  = simplexml_load_file($url);
        // wie auch immer speichere die Spalte ebenfalls im Array
        $rows[$row['id']]['punkte_live'] =  $xml_user->user[0]->points[0];
    }
    // Sortiere das array anhand von punkte_live absteigend
    usort($rows, function($arr1, $arr2){
        return $arr1['punkte_live'] < $arr2['punkte_live'] ? 1 : -1;
    });
    // Ausgabe des sortierten Ergebnisses...
    foreach($rows as $row)
        printf(
            "%s<br/>%s<br/>%s",
            $row['name'],
            $row['punkte'],
            $row['punkte_live']
        );

    Ich denke das sollte reichen, wobei dein Code nicht sehr übersichtlich ist, ohne Einrückungen und mit fehlenden Klammern…

    Mit freundlichen Grüßen
  • in: PHP - include Permissions

    geschrieben von nemoinho

    Hallo,

    du hast ein Verständnis Problem, auf Windows kann eine Datei nicht ?s=beispiel heißen, da weder das ? noch das = im Dateinamen erlaubt sind.

    Ich denke, dass du die index.php einbinden willst, oder?

    Wenn das der Fall ist mache das auch:
    <?php include '../index.php';


    Nun zu deinem Verständisproblem, include erzeugt keinen neuen Request, wie den, den du mit deinem Browser absetzt. Stattdessen läd es die entsprechende Datei nach und führt sie im Kontext des laufenden Scripts aus. Oder um es einfacher auszudrücken wird die includierte Datei in den Programmfluss eingefügt.

    Um dir das Beispielhaft zu zeigen sind hier zwei PHP-Dateien, a.php und b.php.
    a.php:
    <?php
    // Gebe den Parameter s aus z.B. bei
    // folgendem Aufruf: http://example.org/a.php?s=beispiel
    echo $_GET['s'] . PHP_EOL;
    // binde b.php ein
    include 'b.php';

    b.php:
    <?php
    // Gebe den Parameter s aus z.B. bei
    // folgendem Aufruf: http://example.org/a.php?s=beispiel
    // oder bei: http://example.org/b.php?s=beispiel
    echo $_GET['s'] . PHP_EOL;

    Intern macht php aus diesem Programm soetwas:
    <?php
    echo $_GET['s'] . PHP_EOL;
    echo $_GET['s'] . PHP_EOL;

    Wie man sieht wird die Datei einfach nur an der entsprechenden Stelle eingebunden.

    Verstanden?
    Ansonsten einfach nochmal nachfragen.

    Mit freundlichen Grüßen

    * Edit: Doppeltes Beispiel korrigiert…
  • in: Kommentare System Mit Smiley Aber es geht nicht so richtig.:

    geschrieben von nemoinho

    Hallo,

    da dein Code ziemlich unaufgeräumt daher kommt will ich da nicht näher drauf eingehen, aber dein Problem ist, dass die image-tags nicht geschlossen werden.

    Außerdem produziert dein Script falsches HTML und ist auch sonst eher mittelprächtig, aber nach Verbesserungen hast du ja nicht gefragt.

    Mit freundlichen Grüßen
  • in: <script> nach Ajax nachladen

    geschrieben von nemoinho

    online-capture schrieb:
    wenn du in deinem Projekt häufiger Ajax benutzt, solltest du dir wirklich überlegen jQuery zu nutzen, es macht die Sache um ein vielfaches leichter.
    Beispiel:
    $.post('game.php',{screen:'pn', modus:'send', reciver:reciver, betreff:betreff, inhalt:inhalt}, function(data)
    {
    alert("Es wurden "+data+" Nachrichten erfolgreich verschickt");
    });


    Was macht dich bei dieser Aussage so sicher? Die Funktion die er benutzt ist doch auch ok, außer dass sie nicht abwärtskompatibel zu älteren Internet Explodierern ist, aber das ist ja erstmal ok.
    Ich kann mir auch schnell und einfach eine kleine ajax-lib schreiben, die zuverlässig arbeitet, teilweise sogar mehr Comport bietet und nichtmal im Ansatz so groß ist wie jQuery…
    jQuery ist und bleibt ein tolles Tool, um Code zu manipulieren und ist auch durch viele Plugins erweiterbar, aber es gibt durchaus Situationen, in denen jQuery nicht die schlaueste Wahl ist…
    MooTools ist für Programmatische Situationen z.B. viel besser geeignet, da es vor allem spezialisierte "Klassen" zur Verfügung stellt. Wie z.B. eine extrem leistungsfähige Ajax-Anbindung, die der jQuery-Lösung doch überlegen ist. Dafür ist MooTools aber auch nicht so toll, wenn man nur mal schnell etwas ändern will.
    Das was ich gerade über MooTools geschrieben habe gilt übrigens zum Teil auch für Prototype.js und YUI.
    jQuery ist lediglich beliebt, weil es simpel ist, sobald man sich an die Benutzung gewöhnt hat.

    So und nun zu der kleinen Ajax-Lib die man beutzen könnte, meine eigene ajax-lib ist komprimiert gerademal 2286 Zeichen lang und abwärtskompatibel bis IE Version 5.5 zu der Zeit gab es Chrome noch nicht und Firefox konnte noch kein Ajax…
    Und der Code ist auch nicht viel aufwändiger als dein jQuery, nur wesentlich flexibler, man kann nämlich das komplette XMLHttpRequest-Objekt manipulieren und hat noch ein paar kleine Helfer mit an Board, wie z.B. ein JSON oder ein interval, halt Sachen, die man gelegentlich mal brauchen kann.
    Ein Beispiel für die Syntax gebe ich hier mal:
    // Funktion definieren, die den responseVerarbeitet
    var onComplete = function(requestObj, responseText){
        alert("Es wurden "+responseText+" Nachrichten erfolgreich verschickt");
    };
    // neues ajax-Objekt erstellen
    var request = new ajax('game.php');
    // Einstellungen festlegen
    request.set({
        data:{screen:'pn', modus:'send', reciver:reciver, betreff:betreff, inhalt:inhalt},
        oncomplete:onComplete
    });
    // Alle 500 millisekunden den request erneut abfeueren
    request.interval(5e2);
    // Das interval verwerfen und statt dessen nach 5 Sekunden aufrufen
    request.timeout(5e3);
    // als Post-versenden
    request.post();
    // usw. …

    Ah bevor ich es vergesse ist hier ein Beispiel: http://help.home.nehrke.info/ajax/ajax.html
    Und wie gesagt, die lib ist so wesentlich kleiner als wenn ich nur für sowas jQuery, MooTools oder YUI nachladen würde. Wobei MooTools vermutlich auch recht klein wäre…
  • in: Javascript - onmouseout-Event

    geschrieben von nemoinho

    Hi,

    das was du brauchst ist eine Funktion, die die Mausbewegung unabhängig von den Kindknoten abhandelt, das geht mit diversen JS-Libraries wie MooTools oder J-Dingsda natürlich sehr einfach, aber es ist auch Händisch kein großes Kunststück.

    Damit du das nachvollziehen kannst habe ich unter http://help.home.nehrke.info/web/js/mouseleave.html mal eine kleine Demonstration abgelegt, die komplett ohne Libs arbeitet und Browserunabhängig ist.

    Mit freundlichen Grüßen
  • in: Wert innerhalb Closure ändern

    geschrieben von nemoinho

    Hi,

    du hast einen Denkfehler in deinem Code, this steht immer für das innerste Objekt, von dem aus es aufgerufen wird.
    Um das zu verstehen will ich dir hier ein paar Beispiele geben:
    var fn = function(){return this};
    
    // Die Funktion gibt eine Referenz auf das window-Objekt zurück.
    fn();
    // Die Funktion gibt bei einem Klick eine Referenz auf den body zurück!
    document.body.onclick = fn;
    // Die Funktion gibt bei einem Klick eine
    // Referenz auf das window-Objekt zurück.
    document.body.onclick = fn.bind(this);


    Um jetzt dein Problem zu lösen würde ich den Code wie folgt ändern. Hierbei wird this in einer eigenen Variable zwischengespeichert:
    var self = this;
    while ( ! self.short) {
        for (i = 0; i < 5; i++) {
            randomNumber = Math.floor(Math.random() * chars.length);
            random += chars.substring(randomNumber, randomNumber + 1);
        }
    
        dpd.links.get({short: random}, function(res, err) {
            if (err)
                cancel('Error', 500);
    
            if ( ! res.length)
                self.short = random;
        }); 
    }


    Mit freundlichen Grüßen
  • in: Von Kapitälchen und dem ẞ

    geschrieben von nemoinho

    Hi,

    wenn ich mich nicht irre ist das Verhalten vom Firefox richtig! Zumindest war es definitiv bis 2008 richtig und ich meine auch, dass sich durch die Einführung des versalen ß in Unicode an den regularien für Kapitälchen von Unicode-Seite aus nichts geändert hat. Es liegt also im Gutdünken der Browserhersteller was bei einem small-caps-ß passiert.

    In diesem Typografieforum gab es ebenfalls eine rege Diskussion dazu, die allerdings auch darin endete, dass es keine wirkliche Pflicht gibt aus einem ß ein ẞ zu machen. Und wie gesagt ist die SS-Variante nicht falsch!

    Mit freundlichen Grüßen
  • in: Funktionen in Klammern

    geschrieben von nemoinho

    Hallo,

    das Konzept welches sich hinter diesen Funktionen verbirgt nennt sich übrigens Closure ein Closure ist eine Funktion, welche sofort ausgeführt wird und ein Objekt erzeugt.

    Zu der Funktionsweise gibt es auf selfhtml.org eine sehr gute Erklärung.

    Diese Methode wird vor allem benutzt um Konflikte mit anderen Scripten zu verhindern und um den Speicher effizienter zu nutzen.

    Übrigens gibt es selbst davon noch einen Shortcut, der allerdings nur sinnvoll benutzt werden kann, wenn der Rückgabewert der Funktion egal ist:
    var fn1 = function(){
      return "Dieser Funktion ist in einer Variablen gespeichert und "
             + "lässt sich dadurch mehrfach ausführen.\n"
             + "Dabei wird jedesmal dieser Text zurückgegeben.";
    }
    var var1 = fn1();
    var var2 = (function(){
      return "Dieser Funktion wird sofort ausgeführt und danach "
             + "aus dem Speicher entfernt!"
             + "Dabei wird dieser Text zurückgegeben.";
    })();
    var var3 = !function(){
      return "Dieser Funktion wird sofort ausgeführt und danach "
             + "aus dem Speicher entfernt!"
             + "Dabei wird dieser Text zurückgegeben und negiert, "
             + "wodurch false zurückgegeben wird.";
    }();
    alert(var1);
    alert(var2);
    alert(var3);


    Mit freundlichen Grüßen
  • in: Variable mit String ""erhalten""

    geschrieben von nemoinho

    Hallo,

    ich habe mir deinen Beitrag jetzt mehrfach durchgelsen und keine Ahnung was für eine Frage du hast.

    Das ist so verständlich als wenn ich fragen würde »Pudding und Tomatensoße, wie?«

    Die Frage könnte man nun so interpretieren:
    – Keine Ahnung was die Frage ist…
    – Wie gut passen Tomatensoße und Pudding zusammen?
    – Wie mache ich Pudding?
    – Wie mache ich Tomatensoße?
    – Wie mache ich Pudding und Tomatensoße?
    – Essen solltest du besser sein lassen, du weißt offensichlich nicht wie man es macht!!!
    – Ganz egal was es heißen soll stell die Frage so das man sie versteht!!!

    Also, du siehst die Frage ist nicht verständlich formuliert und ich neige dazu deine Frage wie einen der beiden letzten Punkte oder den ersten zu interpretieren deshalb:
    FRAGE DOCH BITTE EINFACH DANACH WAS DU WISSEN WILLST, GEBE EIN KLEINES BEISPIEL UND ERKLÄRE WONACH DU BEREITS GESUCHT HAST, ANSCHLIEẞEND HILFT DIR GERNE JEMAND.

    So ich gebe dir jetzt trotzdem noch eine Hilfe indem ich die Gegenfrage stelle und mal meine Glaskugel bemühe um zu raten was du machen willst.

    Willst du einen Integer in einem String einfügen? – Das ginge ganz einfach so:
    int x = 10;
    String y = ""+x;
    // Oder:
    String y = Integer.toString(x);


    Oder willst du eine Zahl, die in einem String steht in einem Integer schreiben? – Das wäre auch sehr einfach:
    String x = "10";
    int y = Integer.valueOf(x);
    // Oder das ist aber nicht so schnell, wenn es mehrfach vorkommt, 
    // wenn es einmalig ist, dann ist es schneller, das hat was mit der 
    // Speicherverwaltung von Java zu tun und ist für deinen 
    // Anwendungsfall vermutlich egal
    Integer.parseInt(x);


    Oder willst du einen Vergleich zwischen einem Integer und einem String durchführen?
    Dann müsstest du eine der beiden Umformungen benutzen und das ganze dann wie üblich vergleichen.

    Mit freundlichen Grüßen
  • in: Linux Bash Dateien Finden und Ersetzen

    geschrieben von nemoinho

    Hallo,

    wie sieht den die Ordnerstruktur aus?

    Sind die bearbeiteten Bilder in mehrere Unterordner zerstückelt oder liegen die alle in einem Ordner?

    Vorher können dir auch Experten nicht helfen.

    Mit freundlichen Grüßen
  • in: Gästebuch

    geschrieben von nemoinho

    Hallo,

    du hast in deinem Code einige kleine Fehler gemacht. Um dir bestmöglich zu helfen will ich dir kurz deine Fehler aufzeigen und zum Schluss meinen Vorschlag für deinen Code zeigen.

    1.) Als erstes fällt auf, dass du die Logik und die Auszeichnung, sprich die Ausgabe in einer Datei machst, dadurch wird der Code sehr unübersichlich, versuche hier eine Lösung zu finden, bei der diese beiden Bereiche möglichst gut getrennt sind, wie das aussehen kann, kann man in meinem Beispiel am Ende sehen, wo die Logik in einer PHP-Datei abgehandelt wird und zum Schluss eine weitere Datei inkludiert wird, die das HTML enthält. Meine Lösung ist zwar auch nicht optimal, aber sie reicht aus, um zu verdeutlichen was ich meine.

    2.) Du machst es die unnötig schwer herauszufinden, welche Seite angezeigt werden soll, denn ob die Variable per GET übergeben wurde kannst du mit isset($_GET['variable']) herausfinden. Außerdem solltest du überprüfen, dass auch nur Ziffern in der Variable stehen, dafür bietet PHP die Funktion ctype_digit($variable) an, Insgesamt sollte dein Code also etwa so aussehen:
    $page = 1;
    if(isset($_GET['page']) && ctype_digit($_GET['page']){
        $page = $_GET['page'];
    }

    3.) Um herauszufinden, welche Einträge angezeigt werden machst du zwei sehr langsame Datenbankabfragen, diese kannst du extrem beschleunigen. Insgesamt brauchst du zwar immernoch 2 Abfragen (eine für die Navigation und eine für die angezeigten Daten), aber diese sind viel schneller! Außerdem ist es sinnvoll die Queries für die Abfragen in einem String mit Platzhaltern zu schreiben, da so Fehler schneller auffallen. Um die Platzhalter einzufügen verwende ich, bei der veralteten DB-Anbindung die du benutzt, sprintf(STRING, REPLACEMENTS...), diese Funktion ist nämlich genau dafür gedacht. Wenn du die moderne PDO-Datenbankschnittstelle verwenden würdest wäre die Möglichkeit Platzhalter zu verwenden bereits in die Schnittstelle integriert und ebenfalls etwas schneller.
    (Das Beispiel mit der Verbesserung folgt nach Abschnitt 4, da die Lösung beide Abschnitte zusammenfasst)

    4.) Du bildest Logik im PHP-Code ab die man am besten (vor allem aus Performancegründen, aber auch weil es so leichter ist) im SQL-Query behandelt. Die Berechnung, von welcher ID bis zu welcher ID die Einträge ausgegeben werden sollen ist in SQL einfach schneller, als wenn PHP aus einer riesigen Menge Daten die relevanten Einträge heraussuchen soll.
    Die Abfrage welche Einträge angezeigt werden sollen sollte also eher so aussehen:
    $query = 'SELECT * FROM gaestebuch_neu ORDER BY id DESC LIMIT %d, %d';
    $result = mysql_query(sprintf($query, $page*$entries-$entries+1, $entries);
    $output = '';
    while($row = mysql_fetch_object($result)){
        $output .= sprintf(
            "<h3>%s <small style=\"color:grey;\">schrieb:</small></h3>\n<p>%s</p>\n<h5 style=\"color:grey;\">%s</h5>\n<hr />",
            $row->name,
            $row->nachricht,
            $row->darum
        );
    }

    Wie man sieht, wird die sprintf-Funktion benutzt um die Platzhalter %d und %d zu ersetzen, diese Platzhalter werden mit den Nummern ersetzt, die angeben welche Einträge gefunden werden sollen, zum einen ist dies der erste Eintrag, der gefunden werden soll ($page*$entries-$entries+1) und zum Anderen die Anzahl der Einträge, die ausgegeben werden sollen.
    * Beispielrechnung für den ersten Eintrag, Angenommen es soll der erste Eintrag auf Seite 1 gefunden werden und 5 Einträge ausgeben werden:
    ERSTER EINTRAG = $page*$entries-$entries+1
    ERSTER EINTRAG = 1*5-5+1
    ERSTER EINTRAG = 1
    für Seite 2 sähe das dann so aus:
    ERSTER EINTRAG = $page*$entries-$entries+1
    ERSTER EINTRAG = 2*5-5+1
    ERSTER EINTRAG = 6

    5.) Die Berechnung der Navigation kann erheblich vereinfacht werden, dies sollte aber aus dem Schlussbeispiel sehr einfach ersichlich sein.

    Wie gesagt kommt zum Schluss noch eine beispielhafte Umsetzung deines Problems. Wie ebenfalls bereits besprochen ist die Logik von der Darstellung weitestgehend getrennt und läd zum Schluss einfach die Datei nach, die das HTML enthält.

    Die Logik:
    <?php
    $connection = mysql_connect("mysql.lima-city.de", "***","***") or die ("Fehler im System");
    mysql_select_db("db_261067_1") or die ("Konnte keie Verbindung zur Datenbank herstellen...");
    
    $page = 1;
    $entries = 5;
    $output = '';
    $navigation = '';
    
    if(isset($_GET['page']) && ctype_digit($_GET['page'])
        $page = $_GET['page'];
    
    $query = 'SELECT * FROM gaestebuch_neu ORDER BY id DESC LIMIT %d, %d';
    $result = mysql_query(sprintf($query, $page*$entries-$entries+1, $entries);
    while($row = mysql_fetch_object($result)){
        $output .= sprintf(
            "<h3>%s <small style=\"color:grey;\">schrieb:</small></h3>\n<p>%s</p>\n<h5 style=\"color:grey;\">%s</h5>\n<hr />",
            $row->name,
            $row->nachricht,
            $row->darum
        );
    }
    
    $query = 'SELECT count(*)/%d FROM gaestebuch_neu';
    $result = mysql_query(sprintf($query,$entries));
    $pageCount = mysql_fetch_array($result)[0];
    
    if($page > 1){
        $navigation .= sprintf('<a href="/gaestebuch.php?page=%d">Seite zurück</a>', $page-1);
    }
    if($page < $pageCount){
        $navigation .= sprintf('<a href="/gaestebuch.php?page=%d">Seite vor</a>', $page+1);
    }
    
    include_once 'gb-html.php';


    und die Darstellung (gb-html.php)
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
        <title>Computer &amp; fun|Gästebuch</title>
        <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
        <meta name="google-translate-customization" content="8aaa0067c6bc0777-6ae1771768e61854-g850d033d9df28719-1a">
        <link rel="stylesheet" type="Text/Css" href="/style.css">
        <link rel="shortcut icon" href="favicon1.jpg" type="image">
    </head>
    <body>
    <div id="alles">
        <div id="nav">
    <?php include_once "navigation.php"; ?>
        </div>
        <div id="inhalt">
            <h4><a href="infos_gaestebuch.php">Informationen zum Gästebuch</a> <span style="color: red;">Bitte lesen!</span></h4>
            <center>
                <h1><u>Gästebuch</u></h1> 
                <fieldset>
                    <legend>Neuer Eintrag</legend>
                    <a href="eintragen.php">Neuen Eintrag schreiben »</a>
                </fieldset>
                <fieldset>
                    <legend>Gästebuch</legend>
                </fieldset> 
    <?php echo $output; ?>
                <fieldset>
                    <legend>Navigation</legend>
    <?php echo $navigation; ?>
                </fieldset>
            </center>
        </div>
    </div>
    </body>
    </html>


    Guck dir am besten an, was ich anders gemacht habe und google die Funktionen oder Befehle, die dir unverständlich sind oder frage hier nochmal nach. Wenn du die Ratschläge befolgst kannst du dein Programm bestimmt verbessern.

    Mit freundlichen Grüßen
  • in: Log in Problem php mysql.

    geschrieben von nemoinho

    Hallo,

    lass mich dir dein Problem erklären und zur Lösung führen.

    Lies mal was da als Fehlermeldung steht:
    Notice: Undefined variable: _ in C:\xampp\htdocs\1\index.php on line 17

    oder zu Deutsch:
    Hinweis: Undefinierte Variable: _ in Zeile 17 in C:\xampp\htdocs\1\index.php

    Was sagt uns das? Richtig, die Variable _ ist nicht definiert und erst recht nicht als Array, trotzdem versuchst du in Zeile 17, 18 und 19 auf diese Variable zuzugreifen:
    $user = $_['user'];
    $pass = $_['pass'];
    $login = $_['login'];


    Aus deinem Code kann man sehen, dass hier das globale Array $_POST gemeint ist und nicht das undefinierte $_ also solltest du einfach nur $_ durch $_POST ersetzten. Im weiteren Code machst du das doch auch richtig.

    Mit freundlichen Grüßen
  • in: Login Geburtstag Einbauen

    geschrieben von nemoinho

    Hallo,

    ich gebe dir mal eine Antwort, die genauso umfangreich ist wie deine Frage:
    <p>Geburtstag: <input /></p>


    Wie du siehst, hilft dir das überhaupt nicht, aber mehr kann ich aus meiner Glaskugel nicht lesen.

    Gebe uns doch einfach eine Beschreibung deines Problems, diese Beschreibung sollte folgende Punkte enthalten:
    • Was soll eingebaut werden?
    • Wie soll es eingebaut werden?
    • Wann soll es erscheinen?
    • Soll es eine Eingabe sein, oder eine Ausgabe, oder vielleicht auch beides?
    Wichtig: Wofür?

    Wenn du uns also eine ausführlichere Beschreibung deines Problems gibst, dann können wir dir auch helfen, so wie es jetzt aussieht ist das nicht möglich!

    Mit freundlichen Grüßen
  • in: W3C validator Error wegen Content-Encoding

    geschrieben von nemoinho

    Hallo,

    dein Problem ist für einen HTTP-Standard sogar ziemlich ausführlich beschrieben.

    Das Header-Feld „Content-Encoding“ wird in RFC 2616 » 14 Header Field Definitions » 14.11 Content-Encoding beschrieben, da werden auch die erlaubten Werte angegeben, welche in RFC 2616 » 3 Protocol Parameters » 3.5 Content Codings aufgelistet sind.

    Kurz gesagt verhält sich der Validator korrekt, da er den Wert nicht interpretieren kann und die Spezifikation nicht erläutert, wie bei einem falschen Wert verfahren werden soll. Die Variante des Validators die Verarbeitung einfach abzubrechen ist hier natürlich unschön, aber sinnvoller als den Inhalt möglicherweise Fehlerhaft zu verarbeiten!

    Die Lösung deines Problems ist denkbar einfach. Der Header sollte nicht gesendet werden, oder in dem Feld sollte „identity“ stehen, da dies der Default-Wert ist. Eine andere Lösung gibt es nicht, da wie gesagt die weiterverarbeitung nicht geregelt ist.

    Insgesamt können diese Werte in dem Feld stehen, je nach dem mit welchem Kompressionsverfahren die Inhalte gesendet wurden:
    gzip
    compress
    deflate
    identity

    Bei Text-Dateien bietet es sich z.B. an diese zu komprimieren. Lima-city benutzt dazu gzip, wie die meisten Websites. PNG's werden dagegen nicht nochmal komprimiert, da sie bereits komprimiert sind und der Rechenaufwand im Vergleich zum Nutzen (eventuell sogar negativ!) zu groß ist.

    In der .htaccess sollte also folgendes stehen, wenn die Daten unkomprimiert gesendet werden:
    Header set Content-Encoding: identity

    Für Textdateien ist es aber wie gesagt sinnvoll diese zu komprimieren, deswegen kann da sowas in die .htaccess geschrieben werden:
    <FilesMatch ".*\.(html|php|css|js|rss)$">
      SetOutputFilter DEFLATE
    </FilesMatch>

    Durch diesen Filter sollte der header automatisch mit deflate gefüllt werden.

    Außerdem solltest du zuerst gucken, ob nicht eines deiner Programme für den Fehler verantwortlich ist und dann dem Provider auf die Finger hauen, warum da ein falscher Header gesendet wird.

    Mit freundlichen Grüßen

    Übrigens, ich habe die Vorschläge jetzt nicht getestet, da mir so ein Problem noch nicht unterkam, deswegen solltest du wie gesagt erstmal gucken wo der Fehler herkommt.
  • in: W3C validator Error wegen Content-Encoding

    geschrieben von nemoinho

    Hallo,

    könntest du vielleicht mal einen Link zur Verfügung stellen. Die Glaskugel will bei mir heute nicht so richtig funktionieren und ich hab keine Lust hier zu raten, was den falsch sein könnte. Ich denke das geht hier allen so.

    Mit freundlichen Grüßen
  • in: Ajax durchgehendes Refresh funktioniert nicht

    geschrieben von nemoinho

    Hallo,

    dein Code ist richtig gedacht, wird aber in den meisten Fällen nicht funktionieren, später mehr dazu. Vorher solltest du mindestens 10 mal darüber nachdenken, ob diese Funktion sinnvoll ist und nötig ist, ich würde 10:1 wetten, dass dies nicht der Fall ist.

    Um dir das mal vorzustellen, wenn nur 100 user bei dir auf der Website sind erzeugst du 1.000 Anfragen pro Sekunde, wenn das 10 Leute hier bei lima machen, dann sind es schon 10.000 Anfragen, einen kleinen Server kannst du aber schon bei unter 10.000 Anfragen pro Sekunde abschiessen. Ich weiß nicht wie performant die Systeme hier bei lima versorgt sind, aber ich würde dich binnen Stunden sperren wenn du solchen scheiß bei mir abziehen würdest.

    Nun zu deinem Problem, deine Anfragen werden gecacht, das kannst du ändern indem du die Anfragen eindeutig machst, z.B. mit einem timestamp in der Anfrage.

    Mit freundlichen Grüßen
  • in: Ich brauche hilfe Fehlerbehebung.

    geschrieben von nemoinho

    Hallo,

    da fehlt eine schließende geschweifte Klammer am Ende der Funktion CMySQL und eine weiter schlißende Klammer für die Klasse CMySQL.
    sprich vor der letzten Zeile einfach folgendes einfügen:
    }
    }


    Mit freundlichen Grüßen
  • in: Formular ohne Pagerefresh senden

    geschrieben von nemoinho

    Hallo,

    die wesentlichen Punkte wurden hier schon genannt, damit du dir bei deiner Entwicklung aber nicht selbst auf den Füßen stehst solltest du dir überlegen, wie du die Funktion am besten aufrufst.

    Hierbei solltest du am besten den kompletten Aufruf über JS regeln, um dir zu zeigen, wie du das mit Prototype am besten regelst ist hier ein Beispiel, das auf deine Ausgangsstellung eingeht. Das einzige Problem ist, dass ich nicht genau weiß, wie welches deine ID ist, ist das die ID aus dem hidden-field?
    Wenn ja, dann passt diese Lösung.
    var doAjaxSubmit = function(form,id,params){
      form = $(this);
      id = $(form.select('input[type="hidden"]')[0]).readAttribute('id');
      params = {};
      form.select('input')).each(function(input){
        var name = input.readAttribute('name');
        if(!!name)
          params[name] = input.readAttribute('value');
      };
      new Ajax.Request(form.readAttribute('action'), {
        method:form.readAttribute('method'),
        parameters: params,
        onSuccess: function(response){
          alert('Request erfolgreich und wurde wie folgt beantwortet:\n'
                   + transport.responseText);
        }
      });
      return false;
    }
    $$('form').each(function(form){
      form.observe('submit', doAjaxSubmit);
    });


    Ich habe die Funktion jetzt nicht gestest, aber das Grundgerüst sollte damit ja gegeben sein und Fehler entsprechend leicht zu finden sein.

    Mit freundlichen Grüßen
  • in: || oder bei content.split

    geschrieben von nemoinho

    Hi,

    du hast zwar jetzt schon einige Antworten bekommen, aber keine davon ist die simpelste Lösung, den JS kann das schon von alleine.
    Man muss dazu nur RegEx statt Strings verwenden, dann gehts.
    Um das zu zeigen nehme ich mal dein Beispiel:
    // so war dein Code ursrpünglich
    var ht_name_all_on1 = content.split('class="petname ">')[1];
    var ht_name_all_off1 = !!ht_name_all_on1 ? ht_name_all_on1.split('<')[0].trim() : '';
    
    // sowas in der Art wolltest du haben
    var ht_name_all_on1 = content.split('class="petname ">' || 'class="anderer_petname ">')[1];
    var ht_name_all_off1 = !!ht_name_all_on1 ? ht_name_all_on1.split('<')[0].trim() : '';
    
    // und so sieht das aus, wenn du RegEx benutzt
    var ht_name_all_on1 = content.split(/class="petname ">|class="anderer_petname ">/)[1];
    var ht_name_all_off1 = !!ht_name_all_on1 ? ht_name_all_on1.split('<')[0].trim() : '';

    Wie man sieht ist das fast identisch zu deinem Entwurf, allerdings werden die Möglichkeiten durch eine einfache Pipe (|) per Oder verknüpft und es müssen alle Zeichen, die in RegEx besondere Bedeutung haben maskiert werden, allerdings ist das bei deinen Strings nirgends der Fall.

    Übrigens, die Schreibweise !!VARIABLE erzeugt bei der Abfrage das selbe Ergebnis wie VARIABLE!=undefined ist jedoch kürzer.

    Mit freundlichen Grüßen
  • in: Welche gratis HTML Editoren gibt es?

    geschrieben von nemoinho

    Guten Abend,

    ich werf mal alles ein, was ZenCoding beherscht, da schreibt man das HTML als CSS, ich hab das in meinen vim integriert. Das gibt es aber auch für diverse andere Editoren.

    Mit freundlichen Grüßen
  • in: Meine erste eigene Klasse - Fragen

    geschrieben von nemoinho

    Hallo,

    mir fallen bei deinem Code 2 Sachen auf.

    Zum einen sind deine Einrückungen nicht sehr konsistent, dadurch fällt es schwer den Code zu lesen und zum Anderen sind einige Strings schlicht falsch, oder weshalb sind die Header ab Zeile 333 jeweils durch 2 Zeilen voneinander getrennt und mit einem Haufen sinnloser, teilweise problematischer Leerzeichen versehen? Soweit ich mich erinnere müssten die Header in etwa so aufgebaut sein:
    $headers = "Content-Type: text/calendar; method=REQUEST; charset=utf-8\r\n";
    $headers .= "Content-Language: de-ch\r\n";
    $headers .= "\r\n";

    Ich mag mich zwar irren und gerade bei einer falschen Spec sein, aber ich meine Header werden hier wie auch bei HTTP durch "\r\n" getrennt und zwischen Header und Nutzdaten ist eine leere Zeile, welche ebenfalls so getrennt wird.
    Oder wenn du die sinnvollere, weil einfachere Variante nehmen willst, dann schickst du jeden Header einzeln an den PHPMailer:
    $this->phpmail->AddCustomHeader("Content-Type: text/calendar; method=REQUEST; charset=utf-8");
    $this->phpmail->AddCustomHeader("Content-Language: de-ch");

    Wenn ich die API richtig im Kopf habe ist das möglich und wie gesagt wesentlich sinnvoller, da man sich dann z.B. auch nicht um die Leerzeile kümmern muss.

    Zu guter Letzt noch die Info wie du die Meldung
    NOTICE Undefined offset: 0
    die du z.B. in Zeile 121 bekommst, mit einer einfachen Abfrage nach der Existenz des Schlüssels abfangen kannst:
    // Alte Zeile 121
    if($this->allowedSubType[$subtype])
    // neue Zeile 121
    if(isset($this->allowedSubType[$subtype]) && $this->allowedSubType[$subtype])
    Dann hast du das Problem abgefangen.

    Mit freundlichen Grüßen
  • in: Wörter, die der deutschen Sprache fehlen

    geschrieben von nemoinho

    Hallo zusammen,

    aus Schulzeiten kenne ich auch noch ein Wort, welches es im deutschen nicht gibt.
    Yakamoz kommt aus dem türkischen und bezeichnet das Spiegelbild des Mondes im Wasser.

    Allerdings ist mir auch keine andere Sprache bekannt, die dafür ein Wort kennt.

    Mit freundlichen Grüßen
  • in: Internal Server Error mit .htaccess

    geschrieben von nemoinho

    Hallo,

    ich konnte das Problem ebenfalls nicht nachvollziehen, deswegen hab ich es nachgestellt.

    Das wichtigste zuerst, das Problem lässt sich nachstellen und meine Logs sagen mir auch was falsch ist:
    [Sat Feb 23 00:49:01 2013] [alert] [client 192.168.2.102] /var/www/help/htaccess-500er/.htaccess: Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration


    Sprich deine letzte Zeile scheint falsch zu sein.
    Header append Vary User-Agent env=!dont-vary


    Ich weiß nicht genau was die macht, aber ich würde sie weglassen, da es so aussieht, als ob du den User-Agent validieren willst, was ziemlicher unfug ist, da dieser nicht sicher einem Browser zugeteilt werden kann.

    Mit freundlichen Grüßen
  • in: Array[1] wird zu Array[0]

    geschrieben von nemoinho

    Hi,

    du hast einfach einen Denkfehler drin, darum hier einmal die Ausgangsstellung:
    zahlen = [0,1,2]


    Und jetzt die Situation bei den verschiedenen Schleifendurchgängen:
    nach dem 1. Durchlauf:
        zahlen = [-1,1,2]
    nach dem 2. Durchlauf:
        zahlen = [-1,-1,2]
    nach dem 3. Durchlauf:
        zahlen = [-1,-1,-1]
    Wie du siehst wird immer eine Zelle mehr zur -1, damit du aber dein Ziel erreichst solltest du das Array von hinten nach vorne durchlaufen, dann wäre das Resultat so:
    nach dem 1. Durchlauf:
        zahlen = [0,1,1]
    nach dem 2. Durchlauf:
        zahlen = [0,0,1]
    nach dem 3. Durchlauf:
        zahlen = [-1,0,1]
    Der Code dazu sähe so aus:
    for(var i=zahlen.length;i--;)
        zahlen[i]=i==0?zahlen[i]-1:zahlen[i-1];


    Mit freundlichen Grüßen
  • in: Variable in nächster Variable weiterverwenden

    geschrieben von nemoinho

    So,
    und hier kommt der Crosspost, da du die selben Fragen schonmal in einem anderen Post gestellt hast, indem ich dir auch schon eine komplette Lösung geschrieben hatte! Die Enthält auch schon die Eingabe der Werte aus Eingabefeldern!

    Hier ist die Lösung: http://www.lima-city.de/thread/hochzaehlen-auf-450-und-wieder-runter

    Da wird die Kurve auch auf die Canvas-größe skaliert, ohne dass das Ergebnis verzerrt wird oder sowas in der Art.

    Hier ist die Lösung auch zu sehen: http://help.home.nehrke.info/web/canvas/wurfparabel/wurfparabel.html

    Mit freundlichen Grüßen

    * EDIT: Lösungslink hinzugefügt
  • in: Hochzählen auf 450 und wieder runter.

    geschrieben von nemoinho

    Hallo,

    wiedermal eine große Hilfeleistung, da wir jetzt wissen, was du haben willst, ein Programm, welches Wurfkurven zeichnet, hier mal eine umfangreiche Lösung dazu:
    <!DOCTYPE html>
    <html lang="de-DE">
    <head>
    	<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
    	<meta http-equiv="Content-Language" content="de-DE" />
    	<title>Wurfparabel</title>
    	<style type="text/css">
    		canvas { display:block; margin:0 auto; border:3px solid #000; }
    		div { text-align:center; }
    	</style>
    </head>
    <body>
    	<div>
    		<canvas id="diagramm" width="900" height="500">Ihr Browser unterstützt kein Canvas</canvas>
    	</div>
    	<script type="text/javascript">
    		var d = document,
    			$ = function(a){return d.getElementById(a)},
    			canvas = $('diagramm'),
    			context = canvas.getContext('2d'),
    			drawCurve = function(){
    				var	height = canvas.height, // Helfer, damits schneller wird.  
    					width = canvas.width,
    					v0 = ($('startspeed').value || 1) * 1, // Anfangsgeschwindigkeit in m/s
    					angle = ($('startangle').value || 45) * 1, // Winkel in DEG
    					h = ($('startheight').value || 0) * 1, // Höhe in m
    					g = 9.81, // Erdschwerebeschleunigung
    					yMax, // Wichtig zum Skalieren
    					xMax, // das selbe
    					factor, // Der Skalierungsfaktor
    					x = 0;
    
    				// Winkel umrechen von DEG zu RAD
    				angle = Math.PI/180*angle;
    
    				// yMax und xMax berechnen
    				yMax = h + Math.pow(v0, 2) * Math.pow(Math.sin(angle), 2) / (2 * g),
    				xMax = Math.pow(v0, 2) * Math.sin(2 * angle) / g * (1 + Math.sqrt(1 + 2 * g * h / (Math.pow(v0, 2) * Math.pow(Math.sin(angle), 2)))),
    
    				// Skalierungsfaktor berechnen
    				factor = width / xMax*2;
    				if(height < yMax * factor)
    					factor = height / yMax;
    
    				// Graph zeichnen
    				y = h;
    				canvas.width = canvas.width;
    				context.moveTo(x, height - h * factor);
    				for(;x < width; x++)
    					context.lineTo(x, height - ((h - (g / (2 * Math.pow(v0, 2) * Math.pow(Math.cos(angle), 2))) * Math.pow((x / factor), 2) + (x / factor) * Math.tan(angle))*factor));
    				context.stroke();
    				return false;
    			},
    			// Helfer um HTML zu erstellen
    			create = function(a,b,c){
    				var i,j;
    				a = d.createElement(a);
    				if(b)
    					for(i in b)
    						if(i == 'style')
    							for(j in b[i])
    								a[i][j] = b[i][j];
    						else
    							a[i] = b[i];
    				if(c && (j=c.length) && c+''!==c)
    					for(i=0;i<j;i++)
    						a.appendChild(''+c[i]===c[i]?text(c[i]):c[i]);
    				else if(c && ''+c===c)
    					a.appendChild(text(c));
    				else if(c && c.nodeType)
    					a.appendChild(c);
    				return a;
    			},
    			text = function(a){return d.createTextNode(a)};
    		if(!!context){
    			canvas.parentNode.appendChild(
    				create('form',{onsubmit:drawCurve},[
    						create('p',null,[
    								create('label',null,'Anfangsgeschwindigkeit [m/s]: '),
    								create('input', {id:'startspeed', value:1})
    						]),
    						create('p',null,[
    								create('label',null,'Wurfwinkel [DEG]: '),
    								create('input', {id:'startangle', value:45})
    						]),
    						create('p',null,[
    								create('label',null,'Wurfhöhe [m]: '),
    								create('input', {id:'startheight', value:0})
    						]),
    						create('p',null,[
    								create('input', {type:'submit', value:'Graph zeichnen'})
    						])
    				])
    			);
    		}
    	</script>
    </body>
    </html>


    Mit freundlichen Grüßen
  • in: Hochzählen auf 450 und wieder runter.

    geschrieben von nemoinho

    Hallo,

    das ist nicht weiter verwunderlich, da du immer den Cursor auf den Punkt ziehst, welchen du als nächstes mit einer Linie verbinden willst.
    Hier wäre die korrektere Lösung, wobei die auch nicht optimal ist, aber deine Problem behebt. (Ich habe mir erlaubt deine Schleifen zusammenzufassen)
    var canvas = document.getElementById('Diagramm');
    var context = canvas.getContext('2d'); 
    function count(event){
        var x = 0;
        var y = 0;
        context.moveTo(x, y);
        for(; x <= 900; x++){
            context.lineTo(x, y);
            x < 450 ? y++ : y--;
        }
        context.stroke();
    }
    Mit freundlichen Grüßen
    * Edit kleinen Fehler behoben ;-)
  • in: Highlight Wort mit goß/klein Schreibung egal ?

    geschrieben von nemoinho

    Hallo,

    das ist einfach:
    <?php
    $word = 'webspace';
    $str = 'Lima-City bietet kostenlosen Webspace und eine tolle Community im Forum';
    $transformed_str = preg_replace("/($word)/i", '<strong>$1</strong>', $str);

    Mit freundlichen Grüßen
  • in: prüfen ob 32bit oder 64bit Server

    geschrieben von nemoinho

    decbin(~0) .. was auch immer das ~0 ist .. ??
    Das ist ein binäres NICHT, das heißt alle bits, die auf 0 stehen werden zur 1 und umgekehrt. Beispiel:
    // 32 Bit-PHP
    ~0 === (int)bindec('11111111111111111111111111111111') === -1;
    // 64 Bit
    ~0 === (int)bindec('1111111111111111111111111111111111111111111111111111111111111111') === -1;
    Die Typenumwandlung zu int ist im Beispiel nötig, da PHP das ganze sonst in einem double speichern würde, dessen Wert wesentlich größer ist!
  • in: In welcher Programmiersprache wurde Android geschrieben?

    geschrieben von nemoinho

    php-test1 schrieb:
    Ich habe eine Internetseite gefunden wo steht das Androit mit Java Programmiert wurde
    Link: http://www.talkteria.de/forum/topic-186842.html


    Ich habe keine Ahnung, wie der Typ aus dem Forumsartikel zu der Annahme kommt, das Android in Java geschrieben wurde, aber der Kernel ist definitiv C und Assembler, wie der Aufbau der GUI oder ähnlichem geregelt ist entzieht sich meiner Kenntnis, da es mich auch ehrlich gesagt nicht interessiert, zur Not reicht mir auch eine Konsole, da brauch ich den anderen Scheiß nicht. Wenn es schnell sein soll ist das eh besser.

    hackyourlife schrieb:
    Android ist nicht mehr als eine Linux-Distribution, die dir 1. keinen Root-Benutzer gibt (jedenfalls nicht standardmäßig) und 2. eine Java-Laufzeit + GUI bietet, die für Deppen konstruiert ist.


    Android kann man auch mit einem root kompilieren, ansonsten gebe ich dir Recht, es ist ein Linux + GUI + native Java-Laufzeit und ist so aufgebaut, damit möglichst viele, vor allem auch Deppen :wink:, mit dem System etwas anfangen können.

    Übrigens, für die die es interessiert, Google hat für Android die Umgebung umgeschrieben, z.B. wird eine spezielle Standard-C Lib verwendet, das hat zur Folge, dass ein Programm, welches auf einem "normalen" Linux kompiliert wurde auch bei gleicher Hardware unter Android nicht unbedingt läuft. Das sollte man wissen, wenn man in C/C++ auf Android entwickelt.

    Mit freundlichen Grüßen
  • in: Strg+U blockieren

    geschrieben von nemoinho

    fuhnefreak schrieb:
    cyclobox schrieb:
    Allein schon eine erfolgreiche Validierung eines Dokuments mit dem Doctype Loose als fehlerfrei zu bezeichnen ist lächerlich.

    Wieso denn das? Das ist doch der Sinn dieser Seiten, oder nicht?

    Nein den Doctype Loose gibt es nur um alte schlecht designte Seiten nicht grundsätzlich als falsch abzutun. Und ja es ist etwas lächerlich Websites mit diesem Doctype als Fehlerfrei zu bezeichnen.

    Wenn du deine Seite fehlerfrei geschrieben hättest wären im Validator (im Strict-mode) keine 26 Fehler schon auf der Startseite zu sehen.

    Übrigens den Quelltext von dieser komischen "Sicheren Seite" gebommt man noch viel einfacher, im FireBug den Body auswählen und bearbeiten klicken, das sind vllt 4 Sekunden.

    Mit freundlichen grüßen
  • in: Java Editor gesucht

    geschrieben von nemoinho

    Textpad benutz ich auf der Firma in ein oder zwei Fällen, wenn kein x-Editor (das ist ein Ur-Uraltes Teil [ursprünglich OS2], aber genial) zur Verfügung steht, auf Solaris und Linux benutzen ich vim, dem man alles beibringen kann.

    Übrigens gibt es für vim noch ein zusätzliches Plugin, das Eclim heißt und die wichtigsten Eclipse-Funktionalitäten in vim einbaut und umgekehrt vim in Eclipse einbauen kann, ist allerdings relativ umständlich einzurichten und nur für unixoide.

    Ansonsten arbeite ich gerne mit ant-Scripten, das ist sowas ähnliches wie make im C/C++ Umfeld und sehr intuitiv zu bedienen um Java automatisiert compilieren zu lassen.

    Mit freundlichen Grüßen
  • in: Google-Maps-Karten in eine PDF wuchten

    geschrieben von nemoinho


    Mal ausprobiert, ob es was bringt, das Bild zuvor zu downloaden und als temporäre Datei einzubinden?

    Wenn du nämlich die Doku liest, merkst du, dass die komische Lib gerne eine Dateiendung haben möchte, wenn kein Dateityp angegeben ist.
    Wenn du dann wiederum in den Quelltext der Lib guckst, dann siehst du, dass folgenden Dateiendungen zulässig sind:
    .gif
    .jpeg
    .jpg
    .png

    Das ist die elegante und lahme Lösung.

    Die schnelle hackerlösung sieht so aus:
    Du nimmst deinen String für die statische google-Adresse und schreibst da irgendwas hinter, das wie eine Dateiendung für ein png aussieht, da google das Bild in diesem Format ausliefert. Z.B. &type=.png
    Dann sähe dein String so aus:
    http://maps.google.com/maps/api/staticmap?zoom=15&size=640x300&maptype=terrain&markers=color:red%7Csize:mid%7Clabel:S%7C20,20&sensor=false&type=.png

    P.S. die Vorrednerantwort stimmt auch, ist aber mit diesem Posting hinfällig.

    Mit freundlichen Grüßen
  • in: JS-Klasse in Datei auslagern

    geschrieben von nemoinho

    Eigentlich ist die einzige Möglichkeit, dass die Datei die du einbinden willst nicht existiert, vllt hast du dich ja vertippt, um das schnell und einfach zu überprüfen kannst du im Firefox Strg+U drücken um dir dern Quelltext anzeigen zu lassen und dann auf den link zu dem Script klicken.

    Mit freundlichen Grüßen
  • in: Cronjob Ubuntu 11.10 funktioniert nicht

    geschrieben von nemoinho

    imho würde dein cronjob jede Minute zwischen 14:00 und 22:59 versuchen ein Backup anzulegen, so wie ich dich verstanden habe soll das aber stündlich erfolgen. In diesem Fall müsste deine Cronzeile so lauten:
    0 14-22 * * * ./home/server/Maxi2011-Server/backup.sh > /dev/null 2>&1

    Ansonsten kann ich auf die schnelle nichts feststellen, wo du Probleme haben solltest, allerdings wäre ein Klassiker für diesen Fall, dass du keine Schreibrechte hast…
    Außerdem würde ich sagen dass du die Fehlerausgabe in ein error.log umleiten solltest, dann sähe deine cronzeile so aus:
    0 14-22 * * * ./home/server/Maxi2011-Server/backup.sh > /dev/null 2>/home/server/Maxi2011-Server/BACKUP-WELT/error.log

    Das dürfte die Auswertung von Fehlern wesentlich erleichtern.

    Mit freundlichen Grüßen
  • in: Programm für Seitenplan gesucht

    geschrieben von nemoinho

    Was ist ein Seitenplan?
    Den Ausdruck kenne ich nicht, weder als Fachausdruck im Schriftsatz, noch habe ich durch googeln eine Antwort dazu bekommen.

    Mit freundlichen Grüßen
  • in: CSS wird nicht erkannt

    geschrieben von nemoinho

    Ich tippe auf ein inline-Element, welches du nach unten verschieben willst, aber dass wird nicht funktionieren, da inline-Elemente, wie man am Namen schon erahnen kann in Ihrer Zeile bleiben.
    Als Grund für diesen Fehler nehme ich daher ein unpraktisch gestaltetes HTML an und als schnelle Lösung eine zusätzliche CSS-Regel.
    Schreibe einfach
    display:block;
    mit in die CSS-Definition und du kannst das Element verschieben wie du willst. Dann wirft es aber auch einen neuen Absatz!

    Außerdem gibt es im Firefox zu diesem Thema bereits seit der Version 1.0 einen Bug, welcher zu einem Effekten führt der noch unverstädlicher ist, wenn man ihn nicht kennt und relativ leicht nachgestellt werden kann, sowie leicht zu beheben ist.
    Im Folgenden ist ein Beispiel für eine Seite, bei der dieser Bug auftritt (das Element #wrapper wird nicht nach unten geschoben)
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de-de" lang="de-de">
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
        <meta name="description" content="" />
        <title>Firefox-bug: margin-top</title>
        <style type="text/css">
            * {margin:0;padding:0;}
            body {background:blue;}
            div {background:red;}
            h1 {margin:1em auto;}
        </style> 
    </head>
    <body>
        <div>
            <h1>Firefox-margin-bug</h1>
        </div>
    </body>
    </html>
    Wie man sieht soll das div nur einen roten Hintergrund bekommen und das h1 darin einen vertikalen Abstand von 1em haben, aber effektiv wendet Firefox die margin-Regel auf das div an. Um diesen Fehler zu beheben muss man lediglich einen sehr kleines padding in das div einfügen, welcher nicht angezeigt werden kann, aber noch vom Browser berechnet werden könnte, z.B. der unsinnige Wert 0.1px.
    So sähe die Definition für das div dann so aus:
    div {background:red;padding:.1px;}


    Mit freundlichen Grüßen
  • in: 2 Javascripte überschneiden sich :-(

    geschrieben von nemoinho

    Dein Problem ist ganz einfach, du vermischt 2 verschiedene große Biliotheken, Prototype und jQuery, die vertragen sich nicht wirklich gut, außer wenn jQuery im noConflict-Modus ausgeführt wird und als erstes im Quelltext steht.

    Der erste Schritt um diesen Umstand zu lösen wäre es das slidemenu.js als erstes aufzurufen, den darin verbirgt sich das jQuery, wie du dann aber weiterverfährst kann ich dir leider nicht sagen, da ich beide Libs nicht benutze, aber allgemein würde ich versuchen bei einer Lib zu bleiben, wobei Prototype wesentlich flexibler wäre, es aber für jQuery mehr Plugins gibt.

    Wie gesagt musst dur dir für eines von beidem eine alternative Implementierung suchen.

    Konkret würde ich für dich übrigens eine Lightbox in jQuery empfehlen, da sie für dich wahrscheinlich einfacher zu integrieren wäre als dein slidemenü in Prototype nachzuschreiben.

    Mit freundlichen Grüßen
  • in: 2 Javascripte überschneiden sich :-(

    geschrieben von nemoinho

    das hängt von den Scripten ab, denn zur Zeit geht das nur, wenn diese bestimmte Architektonische Vorraussetzungen erfüllen, wobei die Scripte dann meistens schon von Anfang an so geschrieben sind, dass sie it anderen Scripten parallel arbeiten können, ohne sich zu kennen.

    Aber um sich mal ein Bild von deiner Lage zu machen könntest du uns ja einen Link auf die betreffende Seite geben, oder zumindest sagen welche Scripte du dort benutzt hast.

    Mit freundlichen Grüßen
  • in: Colspan in CSS-Tabellen

    geschrieben von nemoinho

    Nein,
    da es sich hierbei nicht um ein layoutelement handelt, sondern der colspan in erster Linie ein logisches Konstrukt darstellt.
    Darum kann man dieses Element in CSS nicht "nachbauen". Stattdessen musst dir eine andere Lösung einfallen lassen, aber CSS ist eigentlich so flexibel, dass das gehen sollte.

    Mit freundlichen Grüßen
  • in: Was ist ECMAScript

    geschrieben von nemoinho

    Eigentlich stimmt das so schon, aber etwas komplizierter ist das doch noch, Grundsätzlich gibt es 2 Arten von Javascript:
    Normales Javascript und JScript, das ist die Microsoftvariante, die teilweise sogar gezielt inkompatibel zu normalem JS ist.

    Weshalb es diese beiden Arten gibt ist recht umfangreich zu erklären, aber eigentlich liegt es nur an lizenzrechtlichen Differenzen zwischen Sun (heute Oracle) und Microsoft Mitte der 90er.

    Aber zurück zum Thema, um dennoch einen unabhängigen Standard für JS zu schaffen, spricht man in diesem Zusammenhang oft von ECMAScript, da ECMA zumindest den Sprachkern definiert. Entsprechend kann man sich auf diesen Sprachkern auch in allen gängigen Browsern verlassen, bzw. kann damit rechnen eine aktuelle Version vorzufinden, außer halt im IE (von Version 6 bis 8). Die Vorgaben, welche Version jedoch aktuell kommt aber immernoch vom Firefox, dem Nachfolger des ursprünglichen Netscape Navigators.

    Aber eigentlich ist das einzige, was an ECMA für die Praxis relevant ist, die Syntax-Definition, so beschreibt der Standard z.B. wie ein Zeilenumbruch in einem String definiert werden muss, oder wie eine Zahl aussehen kann/muss.
    man kann z.B. "0" auf jede dieser Weisen schreiben: 
    
    0 === 0.0 === .0 === 0. === 0.e0 === .0e0 === 0e0 === 0x0
    Wäre dieser Standard nicht gegeben, wäre nicht sicher, ob z.B. .0e0 korrekt interpretiert wird.

    Mit freundlichen Grüßen
  • in: Bewertung ohne Browser-Reload speichern?

    geschrieben von nemoinho

    dafür brauchst du nicht unbedingt jQuery, da reicht auch schon das folgende JS:
    var voteImHintergrund = function(voteId){
        if(!voteId.nodeName){
            voteId = document.getElementById(voteId);
        }
        var ifr,
            a = voteId.getElementsByTagName('a'),
            i = a.length;
        if(!(ifr = document.getElementById('hintergrundfenster'))){
            ifr = document.createElement('iframe');
        }
        ifr.id = ifr.name = 'hintergrundfenster';
        document.body.appendChild(ifr);
        for(;i--;){
            a[i].target = 'hintergrundfenster';
        }
    };

    Das setzt allerdings vorraus, dass deine Votescripts eine Folgende Form haben (in CSS lässt sich das gut beschreiben):
    #deineVoteId a
    Und als HTML kann sowas so aussehen:
    <p id="deineVoteId">
      <a href="?v=1">1</a>
      […]
      <a href="?v=10">10</a>
    </p>

    Da ich dein HTMl nicht kenne kann ich da nur vermuten.
    Um das ganze jetzt in den Hintergrund zu schieben brauchst du nur noch am Ende der Seite folgendes schreiben:
    <script type="text/javascript">
    voteImHintergrund('deineVoteId');
    </script>
    Oder, wenn du mehrere Votebalken hast:
    <script type="text/javascript">
    voteImHintergrund('deineErsteVoteId');
    voteImHintergrund('deineZweiteVoteId');
    voteImHintergrund('deineDritteVoteId');
    </script>

    Wie gesehen relativ simpel…

    Mit freundlichen Grüßen
  • in: <a> im <li> mit CSS zentrieren

    geschrieben von nemoinho

    Bei dir reicht es, wenn du noch folgende Regeln hinzufügst:
    #nav li { height:100%; }
    #nav a {
        display:block;
        text-align:center;
        vertical-align:middle;
        line-height:32px; 
    }

    Die display-Eigenschaft sorgt dafür, das du das Layout verändern kannst, sonst passiert einfach gar nichts bei margin oder width oder ähnlichen Angaben.
    Das text-align zentriert den Text in der Mitte, das ersetzt auch das margin:auto.
    das vertical-align zentriert den Text vertikal auf der Textzeile.
    Und das line-height setzt dann die Zeilenhähe auf die selbe Höhe wie die Navigation ist.

    Mit freundlichen Grüßen
  • in: Validator Fehler

    geschrieben von nemoinho

    Hier sind die Definitionen die du brauchst:
    1.)
    http://de.selfhtml.org/html/referenz/elemente.htm#form
    2.)
    http://de.selfhtml.org/html/referenz/elemente.htm#input
    3.)
    http://de.selfhtml.org/html/referenz/elemente.htm#block_elemente
    das sollte selbsterklärend sein.

    Mit freundlichen Grüßen
  • in: Google+ Anmeldung jetzt ohne Einladung für alle möglich

    geschrieben von nemoinho

    Hi,

    ich bin schon länger bei G+, wie auch viele meiner Bekannten, und finde den kompletten Aufbau wesentlich angenemher und besser durchdacht als bei facebook. Sprich es ist nicht alles so überfrachtet und es kommen nicht in einer Tour irgendwelche irrelevanten Einladungen oder Spieleanzeigen, sowie sinnlose Kettennachrichten (die waren schon vor 10 Jahren out…).

    Aber solange die meisten User nicht so technikaffin sind, wird es wohl ein elitärer Kreis bei G+ bleiben.
    Allerdings war das auch mit facebook so, dort bin ich bereits seit 2007 und bis anfang/mitte 2009 war da praktisch niemand den man kannte aus Deutschland, ich hatte damals in meiner Freundeliste überhaupt nur einen deutsch sprach… das war allerdings nen guter Kumpel ;-)
    Man sieht also dass das etwas Zeit braucht, bevor man ein urteil darüber fällen kann.

    Zu den Datenschutzrechtlichen Dingen sage ich erstmal nichts, denn noch achte ich sehr auf meine Daten und mir ist noch nicht bekannt, dass google die gesammelten Daten konkret gegen oder für bestimmte User einsetzt, es geht halt vor allem um die Gewinnmaximierung durch Werbung und das geht am besten, wenn mir der User sagt, was er den überhaupt mag.

    Mit freundlichen Grüßen
  • in: html und sgml

    geschrieben von nemoinho

    Hallo,
    um es kurz zu machen einige Antworten hier sind ziemlicher Müll!

    Und jetzt zum Inhalt, SGML (Standard Generalized Markup Language) ist sozusagen der Vater von HTML, es wurde in den 80ern entwickelt und 1986 das erste mal Standartisiert.

    HTML (HyperText Markup Language) bildete Ursprünglich eine konkrete Anwendung von SGML, den SGML selbst legt nicht fest, welche Tags in dem Dokument vorkommen dürfen, sondern dies wird im Doctype festgelegt.
    Des weiteren legt SGML auch kein Layout für den ausgezeichneten Text fest, sprich man kann (und sollte) Überschriften zwar in SGML als solche Auszeichnen, aber das ändert nichts an der Anzeige. Denn die Anzeige wird durch eine eigene Stylesprache festgelegt, auf die Ich hier nicht eingehen will, es handelt sich um DSSSL.

    Da in der Anfangszeit des Internets die Entwicklung sehr rasant ging hat sich HTML in dieser Zeit vom SGML-Standard weg entwickelt, das heißt, dass die Entwickler nicht genug Zeit hatten, bzw. nicht genug Geld zur Verfügung stand, um echte SGML-Parser zum parsen des HTML zu entwickeln, außerdem wurde diese Zielsetzung relativ schnell hinfällig, da es zum Browserkrieg kam und sich die Implementierungen vor allem dadurch auszeichneten, vor allem die eigenen Erfindugen (font, marquee, blink, usw.) korrekt darstellen zu können und die Konkurrenz schlecht aussehen zu lassen. Diese Entwicklung stnd alleine schon dadurch, dass sie das Layout beeinflusste im krassen Wiederspruch zu SGML, so das entsprechende Parser spätestens hier hinfällig wurden und sogennante "Tag-Soup-Parser" zum defakto-Standard mutierten, welche diverse Eigenschaften nicht unterstützten aber selbst Fehlerhaftestes HTML irgendwie anzeigten (heute ist das etwas besser, mit HTML5 wird sogar definiert wie fehlerhaftes HTML verarbeitet werden muss.was für eine scheiße eigentlich, ein Fehlerhaftes Dokument irgendwie richtig machen wollen…).

    XML dagegen ist eine echte Untermenge von SGML und hat diese mittlerweile als wichtigste Beschreibungssprache abgelöst, vor allem wegen der wesentlich einfacheren Syntax und weil es zu XML wesentlich mehr ausgereifte Parser gibt als zu SGML.

    Um jetzt nochmal zu zeigen, worin sich die drei Sprachen hauptsächlich unterscheiden gebe ich hier einige Codebeispiele und sage welche Sprachen sie parsen können:
    HTML, SGML, XML: (das sollte eh bekannt sein…)
    <elementA attr="foo">bar</elementA>
    <elementA attr="foo"/>
    <elementA><elementB attr="foo">bar</elementB></elementA>
    <elementA><elementB attr="foo"/>bar</elementA>
    
    HTML, SGML:
    <elementA>bar (ohne schließendes TAG)
    <elementA attr=foo></elementA> 
    (keine Anführungszeichen bei alphanumerischen-Attributen)
    
    HTML: (Diese Dinge sind nie(!) valide)
    <elementA><elementB>foo</elementA>bar</elementB>
    (nicht valide, weil falsch geschlossen)
    
    SGML:
    <elementA>bar</>
    <elementA/bar/
    (Verkürzungen von <elementA>bar</elementA>)
    Um dem Thema noch etwas mehr tiefe zu geben empfehle ich diesen Podcast, der sehr gut und genau die Geschichte von HTML erklärt: http://molily.de/weblog/html-geschichte

    Mit freundlichen Grüßen
  • in: Automatisiertes Komplett Backup (Linux)

    geschrieben von nemoinho

    Moin,

    hier sind 101 Forumsseiten zu dem Thema, eigentlich ist die Variante die dort beschrieben wird ausreichend, sofern der Rechner und die Backupkiste halt eh die ganze Zeit "online" sind.

    Außerdem gab es dazu vor ca. nem halben Jahr auch noch nen Artikel in der c't der hieß glaube ich "Linux zieht um" oder sowas in die Richtung, der war eigentlich recht anfängerfreundlich, habe hier aber keine referenzen mehr darauf. Ergio musst du selbst danach suchen.

    Mit freundlichen Grüßen
  • in: Ein Linux im Browser booten

    geschrieben von nemoinho

    hemiolos schrieb:
    ... funktioniert nur in modernen Browsern, sprich Firefox 4, Chrome und Safari nightlybuilds.
    ich bin gerade dort mit fedora 14 und ff 3.6.20! also auch unter ff 4!

    Das stimmt.
    Mittlerweile, seit Bellard die Unterstützung für den IE hinzugefügt hat, funktioniert das auch in älteren Versionen anderer Browser (der IE ist halt veraltet ;-) ) , aber zu der Zeit als ich das schrieb hat das System tatsächlich nur in den gennanten Browsern funktioniert.

    hemiolos schrieb:
    also wenn man das ganze so ansieht ... glaube ich, dass es sich lohnt, in die sources reinzusehen (und wie geht das?).


    Er stellt das Script z.Zt. nur im minifizierten Zustand online und dort steht auch im ersten Kommentar direkt die folgende Einschränkung:
    Redistribution or commercial use is prohibited without the author's permission.

    Sprich wenn man kann sich das zwar ansehen, auf gar keinen Fall verbreiten umwandeln oder so…

    Um das ganze ein wenig lesbarer zu machen kann man ganz gut vim benutzen und dort folgende Befehle eingeben, wenn man die Datei darin öffnet:
    :%s/\(;\|{\)/\1\r/g
    :%s/}/\r}\r/g
    :%s/\(\([^\w]\|\n\)case[^:]\+:\)/\1\r/g
    :%s/\([^\w]\|^\)for\s*(/\1\rfor(\r/g
    ggqa
    /\nfor(\n
    /;
    /;
    /)
    :.s/\(){\?\)/\1\r/
    ?for(\n
    JJJq1000@a
    :%s/^\s\+//g
    :%s/\n\+/\r/g
    G
    :.s/$/\r}/
    gg
    :.s/^/{\r/
    gg
    =%
    dd
    G
    dd
    :%s/^\s//g
    Dann ist der Code zumindest ansprechend Formatiert… aber sinnvolle Namen fehlen halt immer noch.

    Um aber auf die Frage nach der Technik zurückzukommen, scheint es so, als ob seine größte Herausforderung die effiziente Speicherverwaltung war, weshalb er besonderen Wert auf die Verwendung der neuen typisierten Array legt.

    Mit freundlichen Grüßen
  • in: Rechnung mit Bedingungen in MySQL

    geschrieben von nemoinho

    ja das geht mit:
    SELECT
      CASE WHEN (spalteValue + spalteAdd) >= spalteMax
        THEN spalteMax
        ELSE (spalteValue + spalteAdd)
      END AS echteSpalteValue
    FROM tabelle;

    Mit freundlichen Grüßen
  • in: Andere Tabelle miteinbeziehen

    geschrieben von nemoinho

    Mhm, ich hätte das so abgefragt:
    SELECT
        vehicles.ownerid AS ID,
        user.username AS username,
        CASE WHEN type=1 THEN 'Auto' ELSE 'Moped' END AS type,
        COUNT(type) AS count
    FROM vehicles
    JOIN user ON cars.ownerid=user.id
    GROUP BY vehicles.ownerid, user.username, vehicles.type;


    Mit freundlichen Grüßen
  • in: binaerzahlumwandlung mit javascript

    geschrieben von nemoinho

    moin, dazu bietet Javascript schon eine eigene Funktion: toString.
    Die Funktion erzeugt nicht nur einen String, sondern sie wandelt eine Zahl auch in ein anderes Zahlenformat um dazu brauchst du nur das gewünschte Zahlenformat als Parameter übergeben, der default-Wert ist 10.
    var decZahl = 255;
    var binZahl = decZahl.toString(2);
    var hexZahl = decZahl.toString(16);
    alert(decZahl + ' sieht binär so aus: ' + binZahl + ' und hexadecimal schreibt man sie so: ' + hexZahl);
    Die Funktion reicht so für den normalen Gebrauch aus, das Limit, von wo aus die Zahl nicht mehr korrekt dargestellt wird liegt bei 2^53-1 das ist diese zahl: 9007199254740991 also ausreichend groß.

    Mit freundlichen Grüßen
  • in: Per JS einen link eine onclick funktion zuweisen!

    geschrieben von nemoinho

    nehme folgenden Code:
    function link(){
        var elementA = [],
            url = [],
            // Diese Funktion wird beim klicken ausgeführt!
            // Das Zurückgeben einer weiteren Funktion ist in
            // diesem Fall notwendig und dient der Performance!
            closureFN = function(url){return function(){
                alert(url)
                return false;
            }},
            // benötigte Variablen am besten schon am Anfang
            // der Funktion initialisieren!
            i,
            obj; 
        elementA = document.getElementsByTagName("a");     
        for(i = elementA.length; i--; ){ // Rückwärtzählen ist schneller
            obj = elementA[i];
            obj.onclick = closureFN(obj.href);
            url[i] = obj.href;
            obj.href = "#"+url[i];
        }
    }
    Das funktioniert auf jeden Fall.

    Für leichter lesbare Lösungen muss man wesentlich mehr Aufwand betreiben und sie sind nicht so performant.

    Mit freundlichen Grüßen
  • in: Menu Bar wird nicht markiert

    geschrieben von nemoinho

    lokalbook schrieb:
    nemoinho, ein dummy-layout habe ich von dir glaub noch keines bekommen.


    Mein Fehler, dann war das dein Bruder, aber wie soll sich den da etwas ändern, nur durch CSS und HTML, weder das eine noch das andere hat einen Einfluss darauf, unter welcher Adresse es sich gerade befindet, dein PHP muss das steuern und zwar über die Klasse im body da steht irgendwas von section04 wenn sich das auf section01 ändert ist der erste Menüeintrag aktiviert, wie gesagt, das muss dein PHP machen. Oder du kodierst es hart.

    Mit freundlichen Grüßen
  • in: Menu Bar wird nicht markiert

    geschrieben von nemoinho

    fatfreddy schrieb:
    Wäre es nicht sinnvoll, alle Probleme mit deiner Website in einem Thread zu bündeln? Und vor allem wäre es nützlich, einen Link zu einer funktionierenden Version mit anzugeben, denn mit Firebug und anderen Dev-Tools ist Hilfe einfacher als mit den ewigen Codeschnipseln und Bildchen.

    FF

    Danke, endlich sagt es mal jemand, zumal ich ihm die Seite glaube schonmal als dummy-layout geschickt hatte und er es einfach nicht hinbekommt Zeilen zu kopieren und entsprechend anzupassen…

    Mit freundlichen Grüßen
  • in: RAM einbauen

    geschrieben von nemoinho

    sebulon schrieb:
    nur so am rande...

    512er riegel, hört sich schonmal danach an, dass es 3 ram-technologien sein könnten... und das kann zu Problemen führen...

    SD-RAM(168Pins)
    DDR-Ram (184Pins)
    DDR2-RAM(240Pins)


    die alle haben eine unterschiedliche pinzahl, brauchen unterschiedliche spannungen und das interface unten ist anders.

    dazu kommen andere taktungen (geringste Taktung wird als resultat genommen -> langsamer Riegel bremst kompletten RAM aus.

    Die haben auch an einer anderen Position diese Unterbrechung in der Pinleiste, weshalb die nciht reinpassen.


    Hersteller ist total irrelevant, wenn der RAM funktioniert. Das ist dann eher ein problem des Mainboards(->Bios), ob er den Riegel erkennt oder nicht

    Danke @sebulon, dass du darauf hingewiesen hast, auch wenn du mir damit zuvor gekommen bist.

    Was ich noch sagen wollte, wenn es Speicherprobleme gibt, dann kann das Mainboard sich auf mehrere Weisen bemerkbar machen das musst du in den jeweiligen Beebcode-Tabellen nachlesen, aber geläufig sind wie schon gesagt ein langer Ton, oder einfach gar kein Ton (der PC startet dann auch nicht!) oder manchmal auch 2x ein längerer Ton (ca 1 Sekunde)

    Weiter solltest du mal darauf achten, was in deinem PC zur Zeit verbaut ist, wenn da ein Speicher mit einer 800 MHz Taktung drin ist, dann macht dieser zusätzliche Speicher deinen PC, wie von sebulon gesagt, wahrscheinlich langsamer, obwohl mehr Speicher da ist. Außerdem solltest du dir das Manual vom Mainboard (das findest du i.d.R. auch bei google) nochmal ansehen, da steht meistens noch was drin, in welcher Reihenfolge du die Brücken belegen solltest, auch bzgl. Geschwindigkeitsunterschieden von Modulen.
    Ansonsten ist noch zu sagen, dass die Geschwindigkeit für das Mainboard egal ist, bei DDR1 konnte man immer nur bestimmte Geschwindigkeiten verbauen, während bei DDR2 der Speicher zur Not vom Mainboard runterreguliert wird, auch dass kann man i.d.R im Manual des Boards nachlesen.

    Mit freundlichen Grüßen
  • in: Notepad++ unter wine gecrasht - Datei beschädigt

    geschrieben von nemoinho

    wenn du Linux benutzt hast du doch auch Linux-Editoren zur Verfügung in denen du das viel umfangreicher betrachten kannst…
    Öffne einmal ein Terminal und gib dort
    xxd DATEINAME | less
    ein. Das zeigt dir dann einen hexview, wenn dieser Scheiße aussieht, sprich die rechte Spalte enthält mist, dann würde ich sagen hast du das Sript tatsächlich richtig geschrotet, da ist das backup zu erneuern die leichteste Methode es wieder in den Ist-Zusatnd zu versetzten, alles andere ist schlicht zu aufwendig.

    Ich sprech da aus Erfahrung ich "rette" in meiner Firma immer gelöschte USB-Sticks es ist einfach nur aufwendig, und auch die meisten Programme sind ohne Partitionstabelle nicht in der Lage eine Datei wiederzufinden… Ich habe dazu selbst schon Programme geschrieben, die spezielle Dateien unserer Systeme wieder herstellen, weil das schlicht kein Programm auf dem Markt kann (wie auch ohne die Struktur zu kennen…)

    Mit freundlichen Grüßen
  • in: Replace Problem

    geschrieben von nemoinho

    replace(/\?.*$/,'').replace(/.*\/([^\/.]+).*/,'$1')
    Erstmal alle Parameter entfernen und dann den Wert zwischen dem letzten Slash und dem danach folgenden Punkt (oder Stringende) Referenzieren (die runden Klammern). In der Ausgabe gibt man nun die Referenz aus.

    Mit freundlichen Grüßen
  • in: CSS: Layout über die ganze Webseite el

    geschrieben von nemoinho

    so jetzt haben wir uns das hier alle mal angesehen und nun kommt die CSS-Lösung, die in Browsern natürlich schon lange funktioniert, aber nicht sehr bekannt ist, weil der Internetexplodierer das erst seit v9 unterstützt…
    body {
        background-image:url('url_zum_bild');
        background-size:100%;
    }
    Eine Alternative ist dazu noch diese:
    HTML
    <!-- head und so -->
    <body>
        <img id="background" src="url_zum_bild" alt="" />
        <!-- hier der Seiteninhalt -->
    </body>
    </html>
    CSS
    body {
        min-height:100%;
    }
    #background {
        width:100%;
        height:100%;
        position:fixed;
        top:0;
        left:0;
        z-index:-1000;
    }
    So und hier noch eine Frage, was willst du damit eigentlich erreichen??? Wenn du auf einem 17" Monitor entwickelst und sich dann jemand die Seite auf einem 22" Monitor ansieht, dann ist alles verpixelt => beschissen. Das selbe passiert auch wenn sich das jemand auf einem sehr kleinen Gerät, wie nem Netbook oder Smartphone ansieht, darum die Frage, wozu willst du das haben, ich wette es gibt eine bessere Lösung!

    Mit freundlichen Grüßen

    PS.: Anbei noch eine Tabelle, seit wann welcher Browser das background-size kann:
    Browser | aktuelle Version | seit Version | seit Jahren 
    --------+------------------+--------------+------------
    Firefox |              5.0 |          3.6 |        > 1½
    Chrome* |             12.0 |          0.3 |        > 2¾
    Opera   |             11.5 |         10.0 |        > 1¾
    Safari* |              5.1 |          3.1 |        > 3¼
    MS-IE   |          9.0/8.0 |          9.0 |         ~ ¼
    
    * Die Idee Wurde von Webkit erdacht, die Engine welche 
    Safari und Chrome zugrunde liegt, darum beherschten diese 
    beiden Browser das signifikant früher.
  • in: AJAX - onReadyStateChange wird nicht ausgelöst

    geschrieben von nemoinho

    dustboy schrieb:
    Was mache ich falsch?


    Es muss onreadystatechange heißen und nicht onReadyStateChange

    Mit freundlichen Grüßen
  • in: [JavaScript] Ist der Code gut?

    geschrieben von nemoinho

    Hallo,

    du wolltest ja wissen, ob dein javascript "gut" ist, bzw. ob man es verbessern sollte, dazu habe ich 2 Punkte.

    Zum einen ist es nicht sehr zielführend, wenn du für eine Sache (die bewegung des Bildes) vier Funktionen brauchst, das solltest du besser mit if-else oder mittels eines switch abfangen, außerdem ist dein HTML viel zu umfangreich, nur um so eine Situation abzubilden…

    Zum anderen solltest du dir eine saubere Schreibweise schon von anfang an angewöhnen, sonst kannst du deinen code später nicht mehr lesen, geschweige denn verstehen!

    Um dir zu helfen habe ich dein Script mal neu geschrieben und das HTML angepasst, das Ergebnis kannst du hier bewundern. Der dunkle Hintergrund war für Testzwecke und ist schlicht egal.

    Den Code kannst du hier einsehen, ich habe ihn extra durch meine Highlightscripte laufen lassen, außerdem ist das Javascript mit diversen Kommentaren versehen:
    Das HTML (inkl. CSS)
    Das Javascript

    Mit freundlichen Grüßen
  • in: Mit JS <input> Button betätigen

    geschrieben von nemoinho

    das ist die id vom <form>-Tag in dem das Input steht, wenn das noch keine id hat musst du ihm einfach eine geben.

    Mit freundlichen Grüßen
  • in: Gibt es einen signifikanten Unterschied zwischen ...

    geschrieben von nemoinho

    Kennst du den den Untershied zwischen MySQL und MySQLi in PHP?

    Anscheinend nicht, es handelt sich in beiden Fällen um eine MySQL Datenbank, es sind nur verschiedene PHP-Schnittstellen um mit dieser zu kommunizieren.

    Mit freundlichen Grüßen
  • in: Suche Online-Quelltext-Editor

    geschrieben von nemoinho

    Früher gab es dazu bespin, der wurde von Mozilla entwickelt, aber das Projekt ist mittlerweile praktisch nicht mehr relevant und die Möglichkeit den Editor in die eigene Seite einzubinden ist auch weggefallen… Schade eigentlich, der war frei zu konfigurieren konnte Syntaxhighlights und besaß diverse zusätzliche Features, aber wie gesagt es gibt ihn nicht mehr.

    Mit freundlichen Grüßen
  • in: Backgound-image geht net

    geschrieben von nemoinho

    kill-a-teddy schrieb:
    Die index ist im 'Root' Verzeichniss, die Style bei ROOT/Layout.. Daher muss ich ja erst zum Root zurückkehren mit .. und dann in images rein /images/ oder nicht?

    Das ganze ist wie gesagt Lokal ^^
    Dann haben wir den Fehler doch schon, der Pfad zum css in deinem HTML-Dokument ist flasch, der sollte Layout/style.css heißen. Ich hatte nämllich den Baum Anhand deiner Pfadangaben erstellt.

    Korrekt sollte dein HTML so aussehen:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>Mach ich später</title>
    <link href="Layout/style.css" rel="stylesheet" type="text/css" media="screen" />
    </head>


    Mit freundlichen Grüßen
  • in: Backgound-image geht net

    geschrieben von nemoinho

    Mit deiner Beschreibung kann man genau so viel anfangen: :confused:

    Es ist zwar irgendwas gepostet, jedoch schlecht zusammengefasst, denn die Dateien sind Fehlerfrei, das weißt du ja wahrscheinlich selbst. Aber viel wichtiger wäre es die Rahmenbedingungen zu kennen, mit denen du arbeitest, denn niemand weiß wo er anfangen soll zu suchen, wenn du einen Logikfehler hast und den beim zusammenfassen ebenfalls entfernt hast. Darum wäre es am einfachsten wenn du einen Link o.ä. zur verfügung stellen würdest, wo man dein Problem live sehen kann.

    Aber um dir auf noch ein paar weitere Ideen zu geben, will ich deine Verzeichnisstruktur ansprechen, ist die tatsächlich so?
    Im folgenden heißt deine Seite index.html und liegt in einem unbekannten Ordner, ich nene ihn HTML
    ROOT/
    + images/
    | + image01.jpg
    + HTML/
      + index.html
      + style.css
    Wenn deine Verzeichnisstruktur nicht so aussieht, dann hast du auf jedenfall schonmal einen logischen Fehler, denn wir nur durch die Glaskugel sehen können.

    Mit freundlichen Grüßen
  • in: kein Zeilenumbruch

    geschrieben von nemoinho

    wakeboarder schrieb:
    Hättest noch einmal ein <br> einsetzen sollen. An deiner Stelle würde ich Firebug verwenden hilft dir echt beim programmieren ist auch nicht umständlich.

    Nein hätte er ausdrücklich nicht!

    das <br> ist da total überflüssig, wie auch die Tabelle drumherum, sofern er sich mit CSS etwas auskennt…

    Und so als Info, HTML ist kein programmieren, sondern dient lediglich dazu dem Text eine Bedeutung zu geben, z.B. <h1> für eine Überschrift höchster ordnung, oder <blockquote> für ein mehrzeiligs (sowie <cite> für ein kurzes) Zitat. Das scheinen aber viele hier gar nicht zuverstehen.

    Mit freundlichen Grüßen
  • in: ScrollBALKEN entfernen, aber nicht das Scrollen

    geschrieben von nemoinho

    das geht relativ simpel zumindest mit CSS, dazu das passende HTML:
    <div class="container">
    <div class="scrollcontainer">
    <div class="realwidth">
    […]
    </div>
    </div>
    </div>
    Und das passende CSS:
    .container { width:500px; overflow:hidden; height:100%; }
    .scrollcontainer { width:600px; }
    .realwidth { width:500px; }
    Kannst du ja mal ausprobieren, aber ich möchte noch sagen, dass das nicht sehr angenehm zu nutzen ist, sprich kaum einer wird das freiwillig machen wollen.

    Mit freundlichen Grüßen

Login zum Webhosting ohne Werbung!