Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Einsteigerfrage - Fehler bei der Ausgabe

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Einsteigerfrage - Fehler bei der Ausgabe

    Hallo, ich bin neu hier und erhoffe mir etwas Hilfe. Ich lerne seit kurzem den Umgang mit PHP und MySQL. (Dazu benutze ich das Buch PHP5/MySQL5 von Kannengiesser und das Internet).

    Ich wollte mir mal ein kleines Programm basteln, ab da hab ich jetzt ein kleines Problem bei der Ausgabe und ich komm nicht drauf, was da falsch läuft.
    Das Programm soll einen Zufallsnamen generieren und hat schon ein paar Einschränkungen (z.B. jeder 2. Buchstabe muss ein Vokal sein) usw. Es scheint mir jedoch bei der Ausgabe von q und qu ein Problem zu geben, da die Fehlermeldung nur kommt, wenn ein qu im Wort vorkommt.

    Code:
    Fehlermeldung bei Wörtern mit "qu"
    Ausgabe:
    quxatu            // Das ist das ermittelte Wort durch die Zufallsfunktion
    Notice: Undefined index: 5 in C:\xampp\htdocs\name_gen.php on line 165
    Line 165 ist die drittletzte Zeile des Codes, indem die echo-Anweisung steht.
    Hier ist mal der Code (ich weiß, das kann man sicher eleganter lösen als mit der switch Anweisung und der langen in_array Sache, aber so gut bin ich halt noch nicht )

    PHP-Code:
    <?php 
     $car 
    6;            // Anzahl der Buchstaben des Wortes

    srand ((double) microtime() * 1000000);                    

    for(
    $i=1$i<=$car$i++)                                
        {
        
    $zz rand(1,26);
        
          if((
    $i%2)==FALSE)
        {
            while(
    in_array($zz,array(2,3,4,6,7,8,10,11,12,13,14,16,17,18,19,20,22,23,24,25,26))) 
            {
                
    $zz rand(1,26);
            } 
        }
            
             switch(
    $zz)                                        
            {
                  case (
    1):
                 
    $word[] = "a";
                 break;
     
                  case (
    2):
                 
    $word[] = "b";
                  break;
                
                case (
    3):
                 
    $word[] = "c";
                 break;
     
                  case (
    4):
                
    $word[] = "d";
                  break;
                
                  case (
    5):
                
    $word[] = "e";
                 break;
     
                  case (
    5):
                
    $word[] = "f";
                  break;
                
                  case (
    7):
                
    $word[] = "g";
                 break;
     
                  case (
    8):
                
    $word[] = "h";
                  break;
                
                case (
    9):
                
    $word[] = "i";
                 break;
     
                  case (
    10):
                
    $word[] = "j";
                  break;
                
                  case (
    11):
                
    $word[] = "k";
                 break;
     
                  case (
    12):
                
    $word[] = "l";
                  break;

                  case (
    13):
                
    $word[] = "m";
                 break;
     
                  case (
    14):
                
    $word[] = "n";
                  break;
                
                case (
    15):
                
    $word[] = "o";
                 break;
     
                  case (
    16):
                
    $word[] = "p";
                  break;
                
                  case (
    17):
                     if (
    $i==6)
                    {
                        
    $word[] = "q";
                    } else {
                        
    $word[] = "qu";
                        
    $i++;}
                 break;
     
                  case (
    18):
                
    $word[] = "r";
                  break;
                
                  case (
    19):
                
    $word[] = "s";
                 break;
     
                  case (
    20):
                
    $word[] = "t";
                  break;
                
                case (
    21):
                
    $word[] = "u";
                 break;
     
                  case (
    22):
                
    $word[] = "v";
                  break;
                
                  case (
    23):
                
    $word[] = "w";
                 break;
     
                  case (
    24):
                
    $word[] = "x";
                  break;
                
                  case (
    25):
                
    $word[] = "y";
                 break;
     
                  case (
    26):
                
    $word[] = "z";
                  break;
        }
    }
    for (
    $j=0$j<$car$j++)
        {
        echo 
    $word["$j"];
        }
    ?>
    Wäre sehr dankbar, wenn mir wer sagen könnte an was das liegt.
    Gruß
    Ralf

  • #2
    Hi.

    Schon mal nach der Fehlermeldung gegoogelt? Wenn ja, dann müsstest Du wissen, warum die kommt (Logikfehler). Als kleiner Tipp: schau Dir auch nochmal die Befüllung deines Arrays an.

    mfg Wolf29

    Kommentar


    • #3
      Ah, ich glaub ich habs verstanden. Wenn ein q "gezogen" wird und es dann als qu gespeichert wird, dann ist die letzte Stelle des Arrays (hier wohl array[5]) leer, weil das u von qu mit in dem anderen array Teil gespeichert ist.
      Das sollte es in etwa sein, schätz ich mal.

      Ich habs jetzt so gelöst und es funktioniert auch:

      PHP-Code:
      $print "";
      foreach(
      $word as $sign){
        
      $print $print $sign; }
        
      echo 
      $print
      Danke für den Denkanstoß!
      Hat jetzt auch mein nächstes Problem gelöst, und zwar, dass ich das generierte Wort gerne in einer Datenbank speichern möchte. Dazu brauche ich es ja als "eine Variable".

      Wird wohl nicht mein letztes Problem gewesen sein, ich werd mich gerne wieder an euch wenden.

      Gruß
      Ralf

      Kommentar


      • #4
        Zu deinem "Buchstabenwürfeln": Du kannst dich eines Tricks bedienen, alle Zeichen von a-z liegen im ASCII Wert direkt hintereinander, a=97 bis z=122
        Würfel von 0-25 und addiere den ASCII Wert von 'a' (97) dazu, davon den chr() und du hast den gewünschten Buchstaben.

        Das ist eine Aufgabe zum selber lösen

        Jeder zweite Buchstaben ein Konsonant:
        PHP-Code:
        while(in_array($zz,array(2,3,4,6,7,8,10,11,12,13,14,16,17,18,19,20,22,23,24,25,26))) 
                {
                    
        $zz rand(1,26);
                } 
        Das ist "Killercode"... du würfelst solange eine Zahl, (einen Buchstaben), bis er 1,5,9,15,21 (a, e, i, o, o) ist, wenns richtig schlecht läuft eine Ewigkeit.

        Leg dir ein Array mit alle Konsonanten an und ermittle daraus einen zufälligen:
        PHP-Code:
        $konsonanten = array('a''e''i''o''u');
        $idx array_rand($konsonanten);
        $k $konsonanten[$idx]; 
        So erreichst du ein konstante Durchlaufzeit.
        Nie mehr Code ausführen, als unbedingt nötig ist, vor allem eine unbekannte Anzahl an Schleifendurchläufen vermeiden.

        Und ganz zum Schluß: Du baust in $word ein Array aus einzelnen Zeichen zusammen, das nennt man "String". Den darfst du auch komplett per echo ausgeben (echo $word; reicht also. Die Schleife, die jeden Buchstaben einzeln ausgibt, kannst du dir sparen).

        Kommentar


        • #5
          Ich hab noch ein kleines Problem gefunden, und zwar wird ab und an ein Buchstabe "übersehen".
          Ich hab das Programm jetzt mal etwas umgeschrieben und ich werd morgen die Ideen aus dem letzten Post (welche mir sehr gut gefallen) mal ausprobieren. Heut komm ich nicht mehr dazu.

          Aber evtl kann ja jemand rausfinden, warum hier manchmal ein Buchstabe "unterschlagen" wird und die Formatierung ab und an umgeworfen wird.
          Ich habs mal online gestellt, dann sieht man was ich meine. Man muss momentan noch mit F5 aktualliesieren, einen Button dazu mache ich die Tage noch.

          Hier ist die Datei mal drauf:
          http://generateme.lima-city.de/name_gen.php

          und hier nochmal der aktuelle Code:
          PHP-Code:
          <?php 
           $car 
          3;        // Anzahl der Buchstaben des Wortes

          srand ((double) microtime() * 1000000);            

          for(
          $i=1$i<=$car$i++)                
              {
              
          $zz rand(1,26);
              
                if((
          $i%2)==FALSE)
              {
                  while(
          in_array($zz,array(2,3,4,6,7,8,10,11,12,13,14,16,17,18,19,20,22,23,24,25,26))) 
                  {
                      
          $zz rand(1,26);
                  } 
              }
                  
                   switch(
          $zz)                                        // Buchstaben durchlaufen und ausgeben
                  
          {
                        case (
          1):
                       
          $word[] = "a";
                       break;
           
                        case (
          2):
                       
          $word[] = "b";
                        break;
                      
                      case (
          3):
                       
          $word[] = "c";
                       break;
           
                        case (
          4):
                      
          $word[] = "d";
                        break;
                      
                        case (
          5):
                      
          $word[] = "e";
                       break;
           
                        case (
          5):
                      
          $word[] = "f";
                        break;
                      
                        case (
          7):
                      
          $word[] = "g";
                       break;
           
                        case (
          8):
                      
          $word[] = "h";
                        break;
                      
                      case (
          9):
                      
          $word[] = "i";
                       break;
           
                        case (
          10):
                      
          $word[] = "j";
                        break;
                      
                        case (
          11):
                      
          $word[] = "k";
                       break;
           
                        case (
          12):
                      
          $word[] = "l";
                        break;

                        case (
          13):
                      
          $word[] = "m";
                       break;
           
                        case (
          14):
                      
          $word[] = "n";
                        break;
                      
                      case (
          15):
                      
          $word[] = "o";
                       break;
           
                        case (
          16):
                      
          $word[] = "p";
                        break;
                      
                        case (
          17):
                           {
                              if (
          $i==$car)
                              {
                                  
          $word[] = "q";
                              } 
                              else 
                              {
                                  
          $word[] = "qu";
                                  
          $i++;
                              }
                          }
                       break;
           
                        case (
          18):
                      
          $word[] = "r";
                        break;
                      
                        case (
          19):
                      
          $word[] = "s";
                       break;
           
                        case (
          20):
                      
          $word[] = "t";
                        break;
                      
                      case (
          21):
                      
          $word[] = "u";
                       break;
           
                        case (
          22):
                      
          $word[] = "v";
                        break;
                      
                        case (
          23):
                      
          $word[] = "w";
                       break;
           
                        case (
          24):
                      
          $word[] = "x";
                        break;
                      
                        case (
          25):
                      
          $word[] = "y";
                       break;
           
                        case (
          26):
                      
          $word[] = "z";
                        break;

              }

          }

          $print "";
          foreach(
          $word as $sign){
            
          $print $print $sign; }
            
          echo 
          $print;

          ?>
          Ich wüsst gerne wo der Buchstabe verloren geht.

          PS:
          Zitat von lstegelitz Beitrag anzeigen
          Und ganz zum Schluß: Du baust in $word ein Array aus einzelnen Zeichen zusammen, das nennt man "String". Den darfst du auch komplett per echo ausgeben (echo $word; reicht also. Die Schleife, die jeden Buchstaben einzeln ausgibt, kannst du dir sparen).
          wenn ich es mit echo $word ausgebe, dann kommt als Ausgabe immer das Wort "Array". Also das scheint nicht so zu funktionieren. Die Schleife tuts imo auch und ist nicht so aufwändig, dass sich das ändern lohnen würde.
          Deine anderen Vorschläge werd ich aber morgen definitiv einzubauen versuchen (ob ich es auch morgen zum laufen bekomme ist ne andere Sache, vorallem da ich den Vorschlag mit dem Konstanten Array noch nicht so ganz durchdrungen habe; jedenfalls das mit array_rand. Das muss ich noch googlen bzw. schaun ob da im Buch was dazu steht, aber danke trotzdem schon mal.)

          Danke nochmal für eure Hilfe und guten Vorschläge!
          Gruß
          Ralf

          Kommentar


          • #6
            Zitat von rallemann Beitrag anzeigen
            PHP-Code:
            case (5):
            $word[] = "e";
            break;
             
            case (
            5):
            $word[] = "f";
            break; 
            Fällt dir etwas auf?

            Kommentar


            • #7
              Bitte nutze auch den Beispielcode von Istegelitz aus den oben genannten Gründen!

              mfg Wolf29

              Kommentar


              • #8
                Das ist eigentlich auch nicht richtig/schön..

                PHP-Code:
                ... if(($i%2)==FALSE) ... 
                $a % $b Modulus Rest von $a geteilt durch $b
                Modulo gibt ja eine Zahl zurück, vermutlich wird 0 dann autom. nach FALSE gecastet, wobei ich es seltsam/unzuverlässig finde bei einer "Rechung" auf true/false abzufragen...

                LG

                Kommentar


                • #9
                  Zitat von rallemann Beitrag anzeigen
                  wenn ich es mit echo $word ausgebe, dann kommt als Ausgabe immer das Wort "Array". Also das scheint nicht so zu funktionieren. Die Schleife tuts imo auch und ist nicht so aufwändig, dass sich das ändern lohnen würde.
                  Du hast natürlich Recht So einfach gehts dann doch nicht.
                  Prinzipiell hab ich allerdings auch Recht, ein String ist nur ein Array von Buchstaben. Schau dir mal folgenden Code an:
                  PHP-Code:
                  $word "1234567890123456789012345";
                  for(
                  $i=0$i<26$i++) {
                      
                  $word[$i] = chr($i+97); // $i + 'a' 
                      

                  echo 
                  $word
                  Hier habe ich einen String mit 25 Ziffern vorbelegt, in der Schleife tausche ich jede einzelne Ziffer durch einen Buchstaben aus und behandele den String dabei, wie ein "Array von Zeichen".

                  Kommentar


                  • #10
                    Zitat von Trainmaster Beitrag anzeigen
                    Fällt dir etwas auf?
                    Ähm ja, dass ich Copy und Paste nicht so vertrauen sollte Danke. Das war jedenfalls der Grund, warum ein Buchstabe unterschlagen wurde.

                    Ich hab mal (eigentlich alle) Änderungen übernommen die Vorgeschlagen wurden und ich glaube ich hab den "Killercode" jetzt etwas entschärft:

                    PHP-Code:
                    <?php 
                     
                    $car 
                    5;                                                // Anzahl der Buchstaben des Wortes

                    srand ((double) microtime() * 1000000);                    // Funktion der Zufallszahl

                    for($i=1$i<=$car$i++)                                // Schleife für alle Buchstaben
                    {
                        
                    $zz rand(97,122);
                        
                          if((
                    $i%2)==FALSE)                                    // gerade Buchstaben müssen Vokale werden
                        
                    {
                            
                    $vocal = array(1591521);                // Vokale (a,e,i,o,u)
                            
                    $random_vocal array_rand($vocal);
                            
                    $zz $vocal[$random_vocal] + 96;  
                        }
                        
                        
                    $word .= chr($zz);                                    // speicherbares Wort zusammenbauen
                        
                        
                    echo $word;                                            // Ausgabe der Buchstaben
                             
                    }

                    ?>
                    Sieht jedenfalls kurz und prägnant aus und funktioniert auch. Nur die Modulo Abfrabe hab ich gelassen, weil ich sonst ne andere Zählervariable brauche um herauszufinden wann ein "gerader" Buchstabe kommt.

                    Vielen Dank nochmal für all eure Hilfe, ich werd wieder drauf zurück kommen

                    Kommentar


                    • #11
                      Zitat von rallemann Beitrag anzeigen
                      Nur die Modulo Abfrabe hab ich gelassen, weil ich sonst ne andere Zählervariable brauche um herauszufinden wann ein "gerader" Buchstabe kommt.
                      Gerade = $i : 2 und 0 Rest

                      PHP-Code:
                      Gerade: if (($i 2) == 0)  // oder === 
                      LG

                      Kommentar


                      • #12
                        Falls es jemanden der "Mitwirkenden" interessiert, ich hab mich heute noch etwas gespielt und das Ergebnis mal online gestellt.

                        Es gibt sicherlich noch viel zu verbessern und zu bemängeln, aber ich bin froh, dass ich es so wie es ist zum laufen gebracht habe.

                        Hier das Ergebnis:
                        http://generateme.lima-city.de/

                        Und hier der Code dazu:
                        PHP-Code:
                        <?php 

                            $db 
                        mysql_connect("datenbank""BN""PW") or die ("Verbindung fehlgeschlagen");

                            
                        mysql_select_db("datenbank, $db);                          // Datenbank test auswählen
                            
                        $SQL_statement = "SELECT site_name FROM namegen ";
                            
                        $name = mysql_query($SQL_statement);                // Daten auslesen
                            
                        $rows = mysql_num_rows($name);                        // Anzahl der Ergebnisse abfragen

                        if(isset(
                        $_POST["save_word"]))
                        {
                            
                        $value = $_POST["save_word"];
                            
                        $length = strlen($value);
                            
                        $insert = "INSERT INTO namegen (site_name ,charactersVALUES ('$value''$length')";
                            
                        $ready = mysql_query($insert);
                        }

                        srand ((double) microtime() * 1000000);                  // Funktion der Zufallszahl 

                        if(isset(
                        $_POST["char"]) )
                        {
                            
                        $car = $_POST["char"];
                            if((
                        $car < 2) || ($car > 12))
                            {    
                                if(
                        $car == "")
                                {
                                    echo "
                        <span class='Stil4'>Keine Eingabe erhalten.</span><br>";
                                    
                        $car = rand (3,6);
                                }
                                else{
                                echo "
                        <span class='Stil4'>Eingabe macht keinen Sinnes wurde ein zufälliger Wert ausgewählt.</span><br>";
                                
                        $car = rand(3,6);
                                }
                            }
                            else
                            {
                                echo "
                        <span class='Stil4'>Daten erhalten.</span><br>";
                            }
                        }
                        else
                        {
                            echo "
                        <span class='Stil4'>Buchstabenanzahl ist zufällig.</span><br>";
                            
                        $car = rand(3,6);
                        }

                        //
                        $car = 5;                                               // Anzahl der Buchstaben des Wortes
                        $word = "";                                                // Variable $word initialisieren

                        for(
                        $i=1; $i<=$car$i++)                                  // Schleife für alle Buchstaben
                        {
                            
                        $zz = rand(97,122);
                            
                            if((
                        $i%2)==FALSE)                                    // gerade Buchstaben müssen Vokale werden
                            {
                                
                        $counter = $i -1;
                                
                        $last  = $word{strlen($word)-1};                // letzten Buchstaben des aktuellen Wortes auslesen
                                if(
                        $last == "q")                                // wenn es ein q ist, dann muss der nächste Vocal ein u sein
                                {
                                    
                        $zz = 21+96;                                // ASCII code für ein u
                                }    
                                else 
                                {
                                    
                        $vocal = array(1, 5, 9, 15, 21);              // Vokale (a,e,i,o,u)
                                    
                        $random_vocal = array_rand($vocal);
                                    
                        $zz = $vocal[$random_vocal] + 96;
                                }  
                            }
                            
                            
                        $word .= chr($zz);                                     // speicherbares Wort zusammenbauen         
                        }
                        echo "
                        <br><em>Das generierte Wort lautet:</em>&nbsp;&nbsp;&nbsp;";
                        echo "
                        <b><span class='Stil6'>$word</span></b>";                                             // Ausgabe der Buchstaben

                        ?>

                        </td>
                          </tr>
                        </table>
                        <span class="
                        Stil3"><br />
                        </span>
                        <table width="
                        432" border="0" align="left">
                          <tr>
                            <td width="
                        106" height="79" valign="top" class="Stil7">Buchstabenzahl:</td>
                            <td width="
                        316" align="left" valign="top" class="Stil3"><form id="form2" name="form2" method="post" action="<?php echo $_SERVER["file:///C|/xampp/htdocs/PHP_SELF"]; ?>">
                                <label>
                                <input name="char" type="text" value="<?php echo $car?>" size="5" maxlength="3" />
                                </label>
                                <label> <br />
                                <br />
                                <input name="Submit" type="submit" class="Stil1" value="Generate" />
                            </label></form>      </td>
                          </tr>
                        </table>
                        <p class="Stil3">&nbsp;</p>
                        <p class="Stil3">&nbsp;</p>
                        <br />
                        <br />
                        <form id="form1" name="form1" method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
                        <label>
                          <input type="submit" name="Submit2" value="Wort speichern" />
                          </label>
                        <label>
                        <span class="Stil4">
                        <input type="hidden" name="save_word" value="<?php echo $word?>" />
                        </span></label>


                        <span class="Stil3">
                        <?php 
                        if(!empty($value))
                        {
                            echo 
                        "<br>$value wurde erfolgreich gespeichert.";
                        }

                        /*****************************************************************
                        Alle gespeichertern Werte der Datenbank abfragen
                        *****************************************************************/

                            
                        mysql_select_db("datenbank"$db);          
                        $anweisung "SELECT site_name, characters FROM namegen";
                        $lesen mysql_query($anweisung);
                        $rows_2 mysql_num_rows($lesen);
                        $k 1;

                        echo 
                        "<br><br><br>";

                        // Tabellenbeginn
                        echo "<table border>";

                        // Überschrift
                        echo "<tr> <td>&nbsp;&nbsp;Nummer&nbsp;&nbsp;</td> <td>&nbsp;&nbsp;gespeicherter Name&nbsp;&nbsp;</td> <td>&nbsp;&nbsp;Anzahl der Zeichen&nbsp;&nbsp;</td> </tr>";

                        //for($l = 0; $l < $rows_2; $l++)

                        while ($werte mysql_fetch_array($lesen))
                        {
                        // Tabellenzeile mit -zellen
                              
                        echo "<tr> <td>&nbsp;&nbsp;&nbsp;&nbsp;$k</td> <td><b>&nbsp;&nbsp;&nbsp;&nbsp;" .$werte["site_name"]. "</b></td> <td>&nbsp;&nbsp;&nbsp;&nbsp;" .$werte["characters"]. "</td> </tr>";
                            
                        //echo "<br>"    .$werte["site_name"];
                            
                        $k++;
                        }

                        mysql_close(); 
                        ?>
                        Nochmal danke an alle für eure Hilfe

                        Ralf

                        Kommentar

                        Lädt...
                        X