Fehler im Code

Gigammc

Neues Mitglied
Hallo Community,

ich bin relativ neu im Programmieren und habe in meinem Code auf einmal ein paar probleme und ich weiß Leider nicht wie ich sie beheben kann da ich den Fehler nicht ganz verstehe

Fatal error: Uncaught TypeError: number_format(): Argument
#1 ($num) must be of type float, string given in F:\xampp\htdocs\shop\index.php:16 Stack trace:
#0 F:\xampp\htdocs\shop\index.php(16): number_format('', '1', ',', '.')
#1 F:\xampp\htdocs\shop\index.php(111): formatNumberByLocale('', 'de')
#2 {main} thrown in F:\xampp\htdocs\shop\index.php on line 16


Zeile 1 - 18:
<?php require_once '../settings.php';
function formatNumberByLocale($number, $lang, $silver = false) {
    $formats = [
        'de' => ['.', ','], 'en' => [',', '.']
    ];

    $thousandSep = $formats[$lang][0] ?? (',');
    $decimalSep = $formats[$lang][1] ?? ('.');

    if ($silver && $number >= 1000) {
        $decimalPlaces = 1;
   }
   else {
        $decimalPlaces = (int) ($number != (int) $number);
    }
    return number_format("$number", "$decimalPlaces", "$decimalSep", "$thousandSep");
}
?>
Zeile 110 - 112:
<span style="white-space: nowrap;">
<img src="img/soul.png" style="width: 25px; height: 25px;"> <?=formatNumberByLocale($player['soul'], $player['language'])?>
</span>
würde mich freuen wenn mir jemand dabei helfen könnte ich verzweifle langsam

Mit Freundlichen Grüßen
Gigammc
 
Zuletzt bearbeitet:
Hallo und herzlich willkommen,

das Problem steckt in Zeile 16:

Zeile 1 - 18:
<?php require_once '../settings.php';
function formatNumberByLocale($number, $lang, $silver = false) {
    $formats = [
        'de' => ['.', ','], 'en' => [',', '.']
    ];

    $thousandSep = $formats[$lang][0] ?? (',');
    $decimalSep = $formats[$lang][1] ?? ('.');

    if ($silver && $number >= 1000) {
        $decimalPlaces = 1;
   }
   else {
        $decimalPlaces = (int) ($number != (int) $number);
    }
    return number_format("$number", "$decimalPlaces", "$decimalSep", "$thousandSep");
}
?>

Du übergibst der Funktion number_format() als erstes Argument einen string statt dem geforderten Datentyp float.
Grundsätzlich gibt es keinen Grund, die Variablen in Anführungszeichen zu übergeben, da die Variablen bereits den richtigen Datentyp haben sollten, vorausgesetzt dein Code funktioniert.

Mehr Infos zur Funktion number_format() findest du in der PHP-Dokukentation:
 
Mahlzeit,

na ja das Problem ist aber hierbei das egal ob in '' oder in "" oder ohne der Fehler immer noch besteht ich habe mitlerweile herausgefunden das es an Zeile 111 Liegt sobald ich zeile 111
Code:
<?=formatNumberByLocale($player['soul'], $player['language'])?>
das klaue ist auf einmal jeder fehler weg und es funktioniert auser das zeile 111 den wert nicht mehr erkennen kann

Mit Freundlichen Grüßen
Gigammc
 
Zuletzt bearbeitet:
Ja, der Fehler verschwindet selbstverständlich, wenn man den Funktionsaufruf rausnimmt, da dann der fehlerhafte Code nicht mehr ausgeführt wird.
Du solltest in Zeile 16 auf jeden Fall keine Anführungszeichen einfügen, die haben da nichts zu suchen.

Eine weitere Fehlerquelle kann die Variable $player sein. Hier geht aus deinem geposteten Codeschnipsel leider nicht hervor, was die Variable genau ist und wo die herkommt.
Wenn der Typ von $player['soul'] ein string statt ein float ist, wird genauso der gleiche Fehler auftreten, da der Wert ja an die Variable $number in deiner Funktion übergeben wird und diese wiederum an number_format() übergeben wird, was ja den Fehler darstellt.

Oder verstehe ich irgendwas falsch?

Es wäre jedenfalls hilfreich, wenn du mal darstellen könntest, was genau sich hinter $player verbirgt, falls das Problem noch nicht mit meinen bisherigen Hinweisen gelöst ist.

Ist dir bekannt, dass du mit der Funktion var_dump() Variablen samt Inhalt und deren Typ ausgeben kannst, um eventuelle Fehler zu finden?
 
Der Player kommt ja nicht nur 1 mal vor das ist ja das Problem warum er auf einmal Sagt es ist nen fehler obwohl es keiner sein kann ich denke eher es liegt an der Variable soul aber so genau bin ich mir da auch wieder nicht sicher
Zeile 91 - 121:
    <div class="row mx-5 mt-3">
        <div class="col-lg-12">
            <div class="card">
                <div class="card-body">
                    <span style="white-space: nowrap;" class="text-uppercase">
                        <?=$player['name']?>
                    </span> |
                    <span style="white-space: nowrap;">
                        <img src="img/gold.png" style="width: 25px; height: 25px;"> <?=formatNumberByLocale(($player['silver'] / 100), $player['language'], true)?>
                    </span>
                    <span style="white-space: nowrap;">
                        <img src="img/mush.png" style="width: 25px; height: 25px;"> <?=formatNumberByLocale($player['mush'], $player['language'])?>
                    </span>
                    <span style="white-space: nowrap;">
                        <img src="img/wood.png" style="width: 25px; height: 25px;"> <?=formatNumberByLocale($player['wood'], $player['language'])?>
                    </span>
                    <span style="white-space: nowrap;">
                        <img src="img/stone.png" style="width: 25px; height: 25px;"> <?=formatNumberByLocale($player['stone'], $player['language'])?>
                    </span>
                    <span style="white-space: nowrap;">
                        <img src="img/metal.png" style="width: 25px; height: 25px;"> <?=formatNumberByLocale($metal, $player['language'])?>
                    </span>
                    <span style="white-space: nowrap;">
                        <img src="img/arcane.png" style="width: 25px; height: 25px;"> <?=formatNumberByLocale($arcane, $player['language'])?>
                    </span>
                    <span style="white-space: nowrap;">
                        <img src="img/soul.png" style="width: 25px; height: 25px;"> <?=formatNumberByLocale($player['soul'],$player['language'])?
                    </span>
                </div>
            </div>
        </div>

Die anderen Funktionen mit '' funktionieren ja nur die Soul nicht

Sobald ich die '' raus nehme bekomm ich den fehler

Code:
Fatal error: Uncaught Error: Undefined constant "soul" in F:\xampp\htdocs\shop\index.php:117 Stack trace: #0 {main} thrown in F:\xampp\htdocs\shop\index.php on line 117

und der fehler sagt jetzt nach meinem sehr sehr guten nicht english aus das soul keine definisation hat oder

oder kann das an der Datenbank liegen das er den wert soul gar nicht finden kann weil er in der datenbank nicht ausgegeben wird
Mit Freundlichen Grüßen
 
Zuletzt bearbeitet:
Moment mal, die Anführungszeichen bei $player['soul'] sind natürlich richtig. Da hast du mich falsch verstanden.
Die Variable $player ist ja wahrscheinlich ein assoziatives Array, sprich du hast Strings als Key für das jeweilige Element des Arrays anstatt einen numerischen Array-Index von 0-n zu haben. Bei einem assoziativen Array brauchst du dementsprechend die Anführungszeichen innerhalb der eckigen Klammern, weil sonst der "Undefined constant"-Fehler auftritt, der im Grunde aussagt, dass PHP dachte, du hättest eine Konstante namens soul definiert, die es aber ja nicht gibt.

Wie in meinem ersten Beitrag erwähnt, musst du nur die Anführungszeichen innerhalb des Aufrufs der Funktion number_format() in Zeile 16 entfernen.
Also so:
PHP:
return number_format($number, $decimalPlaces, $decimalSep, $thousandSep);

Hier noch etwas Lektüre zu assoziativen Arrays und Konstanten:
 
Also Technisch ist die nummer eine zahl denn alle anderen werte werden ja auch ausgegeben nur die soul nicht

Die "" habe ich jetzt enfernt dennoch wird der fehler nicht weniger
 
Hab das im interaktiven PHP-Terminal getestet, und die Funktion läuft ohne Exception.

Dein Player-Objekt hat bestimmt, wie bereits erwähnt wurde, einen String statt float bei soul. $player['soul'] ist bestimmt sowas wie "150000.75" , und es wäre besser, wenn es immer float ist. Bei einem String kannst du nämlich abhängig von der Schreibweise Komma oder Punkt kriegen wodurch auch Casting wie (float)$player['soul'] als Notlösung eher zu weiteren Fehlern führen wird.

Gib doch mal wie schon vorgeschlagen deinen Player mit var_dump($player) aus. Oder ruf die betroffene Zeile erstmal mit einem festen Wert auf, um Fehlerquellen auszuschließen. Zum Beispiel so: <?= formatNumberByLocale(1234567.89, "de")?>

Achja, und in Zeile 27 von deinem neuen Beispiel ist der PHP-Tag nicht geschlossen: <img src="img/soul.png" style="width: 25px; height: 25px;"> <?=formatNumberByLocale($player['soul'],$player['language'])?
 
Woher kommt denn überhaupt $player? Wird das mit Werten aus einer Datenbank befüllt oder kommt das aus einer User-Eingabe?

Und wenn du noch weitere Fehler bekommst, solltest du diese ebenfalls posten, damit wir verstehen können, wo es noch hakt.
Es ist durchaus möglich, dass mehrere (Folge-)Fehler existieren.
 
Zurück
Oben Unten