Problem mit MT_RAND und Kommazahlen

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

  • Problem mit MT_RAND und Kommazahlen

    Hallo,
    ich möchte gerne über mt_rand einen zufälligen Wert im Kommastellenbereich ausgeben. Ich habe schon mehrere Wege probiert und auch gegoogelt. Leider kann ich mir die aufkommende Fehlermeldung nicht erklären.

    FUNCTION germanblue.mt_rand does not exist
    Setze ich das mt_rand in "", kommt unexpected T-String. Es handelt sich garantiert um einen typischen Anfängerfehler.


    Könnt ihr mir auf die Sprünge helfen?

    Der Quelltext:
    PHP-Code:
    if ($kategorieindex == "A"){
    mysql_query("UPDATE 
                        flughafen 
                SET        
                        fuel_price      = mt_rand(0.86,1.23)
                Where                    
                          kategorieindex = '
    $kategorieindex'") or die(mysql_error());
        }
        
    elseif (
    $kategorieindex == "B"){
    mysql_query("UPDATE 
                        flughafen 
                SET        
                        fuel_price      = 'mt_rand(0.84,1.15)'
                Where 
                          kategorieindex = '
    $kategorieindex'") or die(mysql_error());
        }
        
    elseif (
    $kategorieindex == "C"){
    mysql_query("UPDATE 
                        flughafen 
                SET        
                        fuel_price      = mt_rand(0.80,0.97)
                Where 
                          kategorieindex = '
    $kategorieindex'") or die(mysql_error());
        }

    elseif (
    $kategorieindex == "D"){
    mysql_query("UPDATE 
                        flughafen 
                SET        
                        fuel_price      = mt_rand(0.75,0.92)
                Where 
                          kategorieindex = '
    $kategorieindex'") or die(mysql_error());
        }    
        
    else{
    mysql_query("UPDATE 
                        flughafen 
                SET        
                        fuel_price      = mt_rand(7.84,11.15)
                Where 
                          kategorieindex = '
    $kategorieindex'") or die(mysql_error());


  • #2
    Zitat von PizzaScampia Beitrag anzeigen
    Leider kann ich mir die aufkommende Fehlermeldung nicht erklären.
    FUNCTION germanblue.mt_rand does not exist
    Du benutzt die Funktion innerhalb deiner SQL-Abfrage, als ob sie eine MySQL-Funktion wäre – ist sie aber nicht, es ist eine PHP-Funktion.

    Entweder setzt du nur die Ausgabe der Funktion in die Query ein – oder du nutzt gleich das MySQL-Gegenstück, RAND().

    Setze ich das mt_rand in "", kommt unexpected T-String. Es handelt sich garantiert um einen typischen Anfängerfehler.
    Dabei handelt es sich in erster Linie um totale Unkenntnis der absoluten Grundlagen der PHP-Syntax. Bitte arbeite zunächst ein Anfänger-Tutorial durch, wenn dir nicht klar ist, warum es so nicht funktioniert.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Mit dem normalen RAND funktioniert leider auch nicht.

      Ich würde das gerne verstehen, ein sehr ähnliches Skript von mir läuft!

      Incorrect parameter count in the call to native function 'rand'
      PHP-Code:
      ($kategorieindex == "A"){
      mysql_query("UPDATE 
                          flughafen 
                  SET        
                          fuel_price      = rand(0.86,1.23)
                  Where                    
                            kategorieindex = '
      $kategorieindex'") or die(mysql_error()); 

      Kommentar


      • #4
        Zitat von PizzaScampia Beitrag anzeigen
        Mit dem normalen RAND funktioniert leider auch nicht.
        Nicht so, wie du es versuchst, denn das kennt kein min und max.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Wärst du so lieb und würdest mir etwas auf die Sprünge helfen?

          Wenn ich nach rand suche bei google, kommt immer dieses Schema.

          Kommentar


          • #6
            MySQL :: MySQL 5.5 Reference Manual :: 12.6.2 Mathematical Functions
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Ich bin nun zwar schon mal soweit, dass die Spalten gefüllt werden, allerdings kommt nach 60sekunden eine Fehlermeldung und der maximale Wert wird deutlich überschossen.

              Bei Kategorie A soll der Wertebereich zwischen 0.86- 1.23 liegn

              Rote Schrift = Zeile 40

              Fatal error: Maximum execution time of 60 seconds exceeded in D:\xampp\webdav\cronjob_fuel_price.php on line 40

              PHP-Code:
              <?php session_start ();
              include (
              "connect.php");
              ?> 
              <html>
              <head>
              </head>
              <body>
              <?php
              $abfrage 
              "SELECT
                                    
                                   `flughafen`.`flughafenid`, 
                                   `flughafen`.`kategorieindex` , 
                                   `flughafen`.`fuel_price`, 
                                   `flughafen`.`last_fuel_price`
                          FROM
                                   flughafen"
              ;
                                   
              $ergebnis mysql_query($abfrage) or die ("MySQL-Error: " mysql_error());


                  while (
              $dataset mysql_fetch_array($ergebnis)){ // <--- Klammerfehler, hier gehört die klammer auf

              $kategorieindex $dataset['kategorieindex'];

              if (
              $kategorieindex == "A"){
              mysql_query("UPDATE 
                                  flughafen 
                          SET        
                                  fuel_price      =(0.86 + RAND() * 1.23)
                          Where                    
                                    kategorieindex = '
              $kategorieindex'") or die(mysql_error());
                  }
                  
              elseif (
              $kategorieindex == "B"){
              mysql_query("UPDATE 
                                  flughafen 
                          SET        
                                  fuel_price      = (0.84 + RAND() * 1.15)
                          Where 
              ZEILE 40                      kategorieindex = '
              $kategorieindex'") or die(mysql_error())
                  }
                  
              elseif (
              $kategorieindex == "C"){
              mysql_query("UPDATE 
                                  flughafen 
                          SET        
                                  fuel_price      = (0.80 + RAND() * 0.97)
                          Where 
                                    kategorieindex = '
              $kategorieindex'") or die(mysql_error());
                  }

              elseif (
              $kategorieindex == "D"){
              mysql_query("UPDATE 
                                  flughafen 
                          SET        
                                  fuel_price      = (0.75 + RAND() * 0.92)
                          Where 
                                    kategorieindex = '
              $kategorieindex'") or die(mysql_error());
                  }    
                  
              else{
              mysql_query("UPDATE 
                                  flughafen 
                          SET        
                                  fuel_price      = (7.84 + RAND() * 11.15)
                          Where 
                                    kategorieindex = '
              $kategorieindex'") or die(mysql_error());
              }
              }
              ?>

              Kommentar


              • #8
                Hallo,

                Zitat von PizzaScampia Beitrag anzeigen
                allerdings kommt nach 60sekunden eine Fehlermeldung
                Dann musst du entweder das Zeitlimit ausschalten, das Script optimieren oder nicht alle Datensätze auf einmal bearbeiten.

                Zitat von PizzaScampia Beitrag anzeigen
                der maximale Wert wird deutlich überschossen.

                Bei Kategorie A soll der Wertebereich zwischen 0.86- 1.23 liegn
                PHP-Code:
                0.86 RAND() * 1.23 
                erzeugt Werte zwischen 0.86 (0.86 + 0.0 * 1.23) und 2.09 (0.86 + 1.0 * 1.23). Wenn 1.23 die obere Grenze sein soll, musst du als Faktor die Differenz zwischen Ober- und Untergrenze angeben, also 0.37.

                Gruß,

                Amica
                Zuletzt geändert von AmicaNoctis; 03.01.2013, 20:22.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  erzeugt Werte zwischen 0.86 (0.86 + 0.0 * 1.23) und 2.09 (0.86 + 1.0 * 1.23). Wenn 1.23 die obere Grenze sein soll, musst du als Faktor die Differenz zwischen Ober- und Untergrenze angeben, also 0.37.
                  Das ist mir gerade irgendwie zu hoch. Ich komme nicht mal mathematisch hinterher

                  Kommentar


                  • #10
                    Hi,

                    Eigentlich ganz einfach, RAND erzeugt eine Zufallszahl zwischen 0 und 1 (eigentlich < 1, aber sie konvergiet gegen 1).

                    Damit ist das kleinste mögliche Ergebnis von 0,86 + (RANd() * 1,23) = 0,86 nämlich dann wenn RAND 0 ergibt. Auf der anderen Seite ist das Extrem aber 0,86 + (1 * 1,23) = 2,09 und nicht wie gewünscht 1,23

                    Wenn die obere Grenze 1,23 sein soll musst du Berechnung wie Amica geschrieben hat anpassen.

                    EDIT:
                    Deine Herangehensweise des Scriptes ergibt für mich auch nicht wirklich Sinn. Ich denke da ist ein Fehler.
                    Du liest alle Daten aus "flughafen" aus, durchläuft alle Ergebnisse und updatest in JEDEM Durchlauf je nach kategorieindex wieder einen Großteil aller Datensätze. Das bedeutet bei beispielsweise 1500 Datensätzen in "flughafen" (gleichverteilt auf kategorieindex A-E => 500 Datensätze mit Kategorieindex A, 500 mit Kategorieindex B, usw. ) aber folgendes:

                    Im ersten Schleifendurchlauf von den 1500 hast du angenommen ein Fughafen mit Kategorieindex A, jetzt updatest du alle Datensätze mit dem Kategorieindex A, dass 500 Stück sind. Im zweiten Durchlauf hast du angenommen wieder ein Flughafen mit Kategorieindex A, jetzt updatest du die selben Datensätze noch einmal . Und immer so weiter. Insgesamt kommen nach allen Schleifendurchläufen 450000 bis 2250000 aktualisierte Datensätze raus.

                    Da du auch im o.g. Script nichts mit den ausgelesenen Daten machst kann man die Ganze sache auf wenige Zeilen reduzieren, dass dann wie folgt aussehen könnte:

                    PHP-Code:
                    $kategorieIndexGrenzen = array
                        
                    'A' => array(0.861.23),
                        
                    'B' => array(0.841.15),
                            
                    // ... usw.
                    );

                    foreach(
                    $kategorieIndexGrenzen as $kategorieIndex => $grenzen) {
                        
                    mysql_query("
                            UPDATE  
                                flughafen  
                            SET         
                                fuel_price = ("
                    .$grenzen['0']." + RAND() * ".($grenzen['1']-$grenzen['0']).")
                            WHERE  
                                kategorieindex = '"
                    .$kategorieIndex."'
                        "
                    ) or die(mysql_error());
                    }

                    // Sonderfall für andere kategorieIndizes
                    mysql_query("
                        UPDATE  
                            flughafen  
                        SET         
                            fuel_price = (7.84 + RAND() * (11.15-7.84) )
                        WHERE  
                            kategorieindex NOT IN ('A', 'B', 'C', 'D')
                    "
                    ) or die(mysql_error()); 
                    Das mit dem Sonderfall ist nicht schön gelöst, aber das Beispiel sollte dir zumindest schon einmal eine Richtung zeigen. Hier werden insgesamt nur 5 UPDATE Queries ausgeführt und nicht mehr 1500.

                    Gruß Danny
                    Zuletzt geändert von hostbar_danny; 03.01.2013, 23:07.
                    hostbar - Full Service Internet Agentur

                    Kommentar


                    • #11
                      also RAND(0.37) ?

                      Kommentar


                      • #12
                        setze doch einfach mt_rand in eine variable und lass den wert dann eintragen...

                        edit:
                        und aus denn kommazahlen kannst du einfach ganze int machen und dann einfach das komma nach zwei stellen einschieben

                        Kommentar


                        • #13
                          Nein
                          Das MySQL RAND() gibt immer Zahlen zwischen 0 und 1 aus, der Parameter von RAND(N) wird für andere Zwecke verwendet. Korrekt wäre der gesamte folgende Ausdruck :

                          0.86 + (RAND() * 0.37)

                          Gruß Danny

                          P.S. siehe auch mein Editierten Post oben bzgl. der Skriptlaufzeit.
                          hostbar - Full Service Internet Agentur

                          Kommentar


                          • #14
                            Hallo Danny,

                            das wirkt am Anfang sehr komplex, aber sieht logisch aus.

                            Ich habe das mal angepasst, die zeitmeldung kommt ebenfalls wieder, genau so wie die Grenzen überschritten werden.

                            PHP-Code:
                            <?php
                            $abfrage 
                            "SELECT
                                                  
                                                 `flughafen`.`flughafenid`, 
                                                 `flughafen`.`kategorieindex` , 
                                                 `flughafen`.`fuel_price`, 
                                                 `flughafen`.`last_fuel_price`
                                        FROM
                                                 flughafen"
                            ;
                                                 
                            $ergebnis mysql_query($abfrage) or die ("MySQL-Error: " mysql_error());


                                while (
                            $dataset mysql_fetch_array($ergebnis)){ // <--- Klammerfehler, hier gehört die klammer auf

                            $kategorieindex $dataset['kategorieindex'];

                            $kategorieIndexGrenzen = array(
                                
                            'A' => array(0.861.23),
                                
                            'B' => array(0.841.15),
                                
                            'C' => array(0.800.97),
                                
                            'D' => array(0.750.92)
                            );

                            foreach(
                            $kategorieIndexGrenzen as $kategorieIndex => $grenzen) {
                                
                            mysql_query("
                                    UPDATE  
                                        flughafen  
                                    SET         
                                        fuel_price = ("
                            .$grenzen['0']." + RAND() * ".($grenzen['1']-$grenzen['0']).")
                                    WHERE  
                                        kategorieindex = '"
                            .$kategorieindex."'
                                "
                            ) or die(mysql_error());
                            }

                            // Sonderfall für andere kategorieIndizes
                            mysql_query("
                                UPDATE  
                                    flughafen  
                                SET         
                                    fuel_price = (7.84 + RAND() * (11.15-7.84) )
                                WHERE  
                                    kategorieindex NOT IN ('A', 'B', 'C', 'D')
                            "
                            ) or die(mysql_error()); }
                            ?>
                            Es sind überings 8,859 Datensätze derzeit!
                            Zuletzt geändert von PizzaScampia; 04.01.2013, 10:04.

                            Kommentar


                            • #15
                              Hallo PizzaScampia,

                              du hast ja auch noch die SELECT Abfrage und die while Schleife mit drin, die brauchst du nicht.
                              Mit einem UPDATE kannst du mehrere Datensätze gleichzeitig aktualisieren, nämlich z.B. alle mit kategorieindex = 'A'. Ob das 100 Datensätze, 1000 oder 1000000 sind, spielt keine Rolle.

                              Dafür musst/solltest du nicht erst alle Datensätze per SELECT auslesen. Nimm die erste SELECT Anweisung und deine While Schleife mal noch mit raus .

                              Gruß Danny
                              hostbar - Full Service Internet Agentur

                              Kommentar

                              Lädt...
                              X