php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 03-01-2013, 16:46
PizzaScampia
 Registrierter Benutzer
Links : Onlinestatus : PizzaScampia ist offline
Registriert seit: Mar 2006
Beiträge: 20
PizzaScampia ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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.

Zitat:
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());

Mit Zitat antworten
  #2 (permalink)  
Alt 03-01-2013, 17:28
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von PizzaScampia Beitrag anzeigen
Leider kann ich mir die aufkommende Fehlermeldung nicht erklären.
Zitat:
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().

Zitat:
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.
Mit Zitat antworten
  #3 (permalink)  
Alt 03-01-2013, 17:34
PizzaScampia
 Registrierter Benutzer
Links : Onlinestatus : PizzaScampia ist offline
Registriert seit: Mar 2006
Beiträge: 20
PizzaScampia ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Mit dem normalen RAND funktioniert leider auch nicht.

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

Zitat:
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()); 
Mit Zitat antworten
  #4 (permalink)  
Alt 03-01-2013, 17:43
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #5 (permalink)  
Alt 03-01-2013, 17:56
PizzaScampia
 Registrierter Benutzer
Links : Onlinestatus : PizzaScampia ist offline
Registriert seit: Mar 2006
Beiträge: 20
PizzaScampia ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #6 (permalink)  
Alt 03-01-2013, 18:00
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #7 (permalink)  
Alt 03-01-2013, 18:32
PizzaScampia
 Registrierter Benutzer
Links : Onlinestatus : PizzaScampia ist offline
Registriert seit: Mar 2006
Beiträge: 20
PizzaScampia ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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

Zitat:
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());
}
}
?>
Mit Zitat antworten
  #8 (permalink)  
Alt 03-01-2013, 21:19
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

Zitat:
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:
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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (03-01-2013 um 21:22 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 03-01-2013, 22:16
PizzaScampia
 Registrierter Benutzer
Links : Onlinestatus : PizzaScampia ist offline
Registriert seit: Mar 2006
Beiträge: 20
PizzaScampia ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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
Mit Zitat antworten
  #10 (permalink)  
Alt 03-01-2013, 23:32
hostbar_danny
 Registrierter Benutzer
Links : Onlinestatus : hostbar_danny ist offline
Registriert seit: Feb 2011
Beiträge: 66
hostbar_danny befindet sich auf einem aufstrebenden Ast
Standard

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

Geändert von hostbar_danny (04-01-2013 um 00:07 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 03-01-2013, 23:50
PizzaScampia
 Registrierter Benutzer
Links : Onlinestatus : PizzaScampia ist offline
Registriert seit: Mar 2006
Beiträge: 20
PizzaScampia ist zur Zeit noch ein unbeschriebenes Blatt
Standard

also RAND(0.37) ?
Mit Zitat antworten
  #12 (permalink)  
Alt 04-01-2013, 00:00
Marcoru
 Registrierter Benutzer
Links : Onlinestatus : Marcoru ist offline
Registriert seit: Jun 2012
Beiträge: 38
Marcoru befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #13 (permalink)  
Alt 04-01-2013, 00:46
hostbar_danny
 Registrierter Benutzer
Links : Onlinestatus : hostbar_danny ist offline
Registriert seit: Feb 2011
Beiträge: 66
hostbar_danny befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #14 (permalink)  
Alt 04-01-2013, 10:52
PizzaScampia
 Registrierter Benutzer
Links : Onlinestatus : PizzaScampia ist offline
Registriert seit: Mar 2006
Beiträge: 20
PizzaScampia ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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!

Geändert von PizzaScampia (04-01-2013 um 11:04 Uhr)
Mit Zitat antworten
  #15 (permalink)  
Alt 04-01-2013, 11:30
hostbar_danny
 Registrierter Benutzer
Links : Onlinestatus : hostbar_danny ist offline
Registriert seit: Feb 2011
Beiträge: 66
hostbar_danny befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit Kommazahlen aus Datenbank andyB PHP Developer Forum 11 15-09-2011 16:52
problem mit mt_rand() Skrok PHP Developer Forum 5 27-03-2003 15:43
mt_rand problem marko2 PHP Developer Forum 6 16-01-2003 13:01
Zufallszahlen mit mt_rand paddy PHP Developer Forum 4 04-01-2002 18:29
Random mit PHP? (mt_rand) Berni PHP Developer Forum 1 13-11-2000 00:26

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
jQuery Mobile ansehen jQuery Mobile

Touch-Optimized Web Framework für Smartphones & Tablets

09.12.2018 phpler | Kategorie: AJAX/ Framework
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:17 Uhr.