Je suis un peu nouveau en PHP et j'essaie d'écrire un script qui compte les points après qu'un utilisateur saisit des valeurs.

Voici le code:

<?php

$pla = $_GET['players'];
$plu = $_GET['plugins'];
$type = $_GET['type'];
$location = $_GET['location'];
totalPoints();

function typePoints($type) { //Returns points depending on server type
    switch (strtolower($type)) { //Switch the type of server between all types and see how many points to return :)
        case "standard minecraft": return 1;
            break;
        case "snapshot": return 2;
            break;
        case "craftbukkit": return 2;
            break;
        case "bungeecord": return 1;
            break;
        case "spigot": return 2;
            break;
        case "paperspigot": return 2;
            break;
        case "feed the beast": return 3;
            break;
        case "technic": return 3;
            break;
        case "pixelmon": return 3;
            break;
        default: echo 'Incorrect Server Type!';
            exit;
            break;
    }
}

function playerPoints($players) { //Returns points depending on amount o players
    if ($players >= 2 && $players <= 5) {
        return 2;
    } elseif ($players >= 6 && $players <= 10) {
        return 4;
    } //Between 6-10, return 4 points... AND SO ON...
    elseif ($players >= 11 && $players <= 16) {
        return 8;
    } elseif ($players >= 17 && $players <= 25) {
        return 12;
    } elseif ($players >= 26 && $players <= 30) {
        return 16;
    } elseif ($players >= 31 && $players <= 36) {
        return 18;
    } elseif ($players >= 37 && $players <= 45) {
        return 20;
    } elseif ($players >= 46 && $players <= 50) {
        return 22;
    } elseif ($players >= 51 && $players <= 56) {
        return 24;
    } elseif ($players >= 57 && $players <= 65) {
        return 26;
    } elseif ($players >= 66 && $players <= 70) {
        return 28;
    } elseif ($players >= 71 && $players <= 76) {
        return 30;
    } elseif ($players >= 77 && $players <= 85) {
        return 32;
    } elseif ($players >= 86 && $players <= 90) {
        return 34;
    } elseif ($players >= 91 && $players <= 96) {
        return 36;
    } elseif ($players >= 97 && $players <= 105) {
        return 38;
    } elseif ($players >= 106 && $players <= 110) {
        return 40;
    } elseif ($players > 110) {
        return 44;
    }
}

function pluginPoints($plugins) {
    if ($plugins == 0) {
        return 0;
    } elseif ($plugins >= 1 && $plugins <= 3) {
        return 2;
    } //Between 1-3, return 2 points.... AND SO ON...
    elseif ($plugins >= 4 && $plugins <= 15) {
        return 6;
    } elseif ($plugins >= 16 && $plugins <= 30) {
        return 10;
    } elseif ($plugins >= 31 && $plugins <= 40) {
        return 14;
    } elseif ($plugins >= 41 && $plugins <= 50) {
        return 20;
    } elseif ($plugins > 50) {
        return 24;
    }
}

function locationPoints($location) {
    switch (strtolower($location)) { //Switch between locations, easy to add a new one later in the future. :)
        case "montreal": return 1;
            break;
        case "france": return 1;
            break;
        default: echo "Incorrect Location!";
            exit;
            break;
    }
}

function totalPoints() { //Call this function to get the amount of points finally.
    $totalPoints = typePoints($type) + playerPoints($pla) + pluginPoints($plu) + locationPoints($location);
    echo 'Total points: ' . $totalPoints;
}

?>

Le problème est que l'instruction switch dans function typePoints($type) renvoie toujours default: echo 'Incorrect Server Type!'; exit; break;.

De plus, function playerPoints($players) renvoie 0 même si j'ai mis un nombre comme 37.

J'ai utilisé ceci:

http://website.com/planpicker.php?players=121&location=france&plugins=80&type=technic

Quelqu'un peut-il me dire pourquoi?

Ce n'est pas une question en double, le "doublon marqué" parle de différents fichiers, mais c'est dans le même fichier.

php
3
Raghav J. 31 déc. 2015 à 11:25

3 réponses

Meilleure réponse

Les 4 variables ne sont pas accessibles depuis la fonction totalPoints. Vous devez transmettre ces paramètres pour fonctionner. Vous devez appeler la fonction comme:

totalPoints($type,$pla,$plu,$location);

Et définissez la fonction comme

function totalPoints($type,$pla,$plu,$location)
2
AnkiiG 31 déc. 2015 à 08:33

C'est parce que vous appelez vos fonctions dans une autre fonction sans passer les valeurs en paramètre.

La fonction totalPoints n'a pas connaissance de la valeur de $ type ou $ pla par exemple car ils ne sont pas GLOBALS.

Vous devez passer les variables à la fonction que vous souhaitez appeler:

function totalPoints($type, $pla, $plu, $location) //Call this function to get the amount of points finally.
{
    $totalPoints = typePoints($type) + playerPoints($pla) + pluginPoints($plu) + locationPoints($location);
    echo 'Total points: '.$totalPoints;
}

Et puis appelez la fonction comme ceci:

totalPoints($type,$pla,$plu,$location);
0
jiboulex 31 déc. 2015 à 08:31

Les variables déclarées en dehors des fonctions doivent être rendues accessibles à la fonction totalPoints. Le moyen le plus simple est d'utiliser global

 function totalPoints() {
  global $pla;
  global $plu;
  global $type;
  global $location;

  $totalPoints = typePoints($type) + playerPoints($pla) + pluginPoints($plu) + locationPoints($location);
  echo 'Total points: '.$totalPoints;

}

0
Professor Abronsius 31 déc. 2015 à 08:33