Visualizzazione risultati 1 fino 7 di 7

Discussione: Funzione non restituisce valore

  1. #1
    L'avatar di foreach
    foreach non è connesso Altervistiano Junior
    Data registrazione
    11-06-2008
    Residenza
    3 metri sotto terra
    Messaggi
    501

    Predefinito Funzione non restituisce valore

    Salve a tutti,

    ho creato una funzione in php che mi permette di vedere se un indirizzo IPv4 fa parte di un determinato range:
    Codice PHP:
    function ipfaparte($ip, $range) {
    list(
    $rete, $bit) = explode('/', $range);
    $n1 = substr(decbin(ip2long($ip)), 0, $bit);
    $n2 = substr(decbin(ip2long($rete)), 0, $bit);
    if(
    $n1 == $n2) {
    return(
    true);
    } else {
    return(
    false);
    }
    }
    dove per $ip gli scrivo "192.168.54.32" e per $range scrivo "192.168.32.0/12", ma quando provo a scrivere questo:
    Codice PHP:
    echo (ipfaparte("192.168.54.32", "192.168.32.0/12") ? "si" : "no");
    non mi stampa niente.

    Però ho notato che se io aggiungo un var_dump() all'interno della funzione, facendola diventare così:
    Codice PHP:
    function ipfaparte($ip, $range) {
    list(
    $rete, $bit) = explode('/', $range);
    $n1 = substr(decbin(ip2long($ip)), 0, $bit);
    $n2 = substr(decbin(ip2long($rete)), 0, $bit);
    var_dump($ip, $range, $n1, $n2);
    if(
    $n1 == $n2) {
    return(
    true);
    } else {
    return(
    false);
    }
    }
    mi fa vedere il dump delle variabili e il sì/no come risultato della funzione così:
    Codice:
    string(10) "87.16.78.0"
    string(2) "25"
    string(25) "1010111000100000100111000"
    string(25) "1010111000100000100111000"
    si
    (vabbè in questo risultato non ho messo i valori ip e range che ho scritto sopra)


    Come posso risolvere questo?






    Grazie,
    foreach
    Codice PHP:
    foreach($vettore as $chiave => $valore) {
    echo 
    "Ciao";


  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,761

    Predefinito

    A me scrive "si":
    Codice PHP:
    <?php
    function ipfaparte($ip, $range) {
    list(
    $rete, $bit) = explode('/', $range);
    $n1 = substr(decbin(ip2long($ip)), 0, $bit);
    $n2 = substr(decbin(ip2long($rete)), 0, $bit);
    if(
    $n1 == $n2) {
    return(
    true);
    } else {
    return(
    false);
    }
    }
    echo (
    ipfaparte("192.168.54.32", "192.168.32.0/12") ? "si" : "no");
    ?>
    Non sono entrato nel merito della funzione, ma mi è balzato all'occhio che:
    Codice PHP:
    if($n1 == $n2) {
    return(
    true);
    } else {
    return(
    false);
    }
    Puoi scriverlo semplicemente:
    Codice PHP:
    return ($n1 == $n2);
    Ciao!
    Ultima modifica di alemoppo : 11-03-2015 alle ore 22.39.33

  3. #3
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    A parte quanto già scritto da Alemoppo, perché tutte quelle parentesi? Alcune non servono: return non è una funzione, ma una istruzione e non necessita di quelle parentesi. Lo stesso vale per echo.
    Le parentesi possono sì servire quando si hanno operatori con diversa precedenza o per rendere più chiaro a chi legge un'espressione aritmetica o booleana, o spesso ancora per evidenziare le precedenze di alcuni operatori poco usati, come quelli bit a bit, per evitare di commettere errori.
    Ma nei casi che ti ho scritto sopra non vedo perché inserirle.
    Ultima modifica di karl94 : 11-03-2015 alle ore 22.45.45

  4. #4
    L'avatar di foreach
    foreach non è connesso Altervistiano Junior
    Data registrazione
    11-06-2008
    Residenza
    3 metri sotto terra
    Messaggi
    501

    Predefinito

    Ho creato il file a.php con questo codice:
    Codice PHP:
    <?php
    error_reporting
    (E_ALL);

    function
    ipfaparte($ip, $range) {
    list(
    $rete, $bit) = explode('/', $range);
    $n1 = substr(decbin(ip2long($ip)), 0, $bit);
    $n2 = substr(decbin(ip2long($rete)), 0, $bit);
    return(
    $n1 == $n2);
    }

    echo(
    ipfaparte("192.168.54.32", "192.168.32.0/12") ? "si" : "no");

    if(isset(
    $_GET['dump'])) {
    var_dump(ipfaparte('87.16.78.50', '87.16.78.0/25'));
    }

    ?>
    Allora innanzitutto vorrei sapere dove posso togliere le parentesi inutili, e poi ho notato che visitando il file a.php normalmente non mi stampa niente, ma visitandolo a.php?dump mi stampa sibool(true), il file è raggiungibile qui, ora ditemi voi se ho sbagliato qualcosa io o è il server (non AV) che fa brutti scherzi. Se proprio serve, posso anche farvi vedere phpinfo() del mio sito.




    Grazie,
    foreach
    Codice PHP:
    foreach($vettore as $chiave => $valore) {
    echo 
    "Ciao";


  5. #5
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Sicuro non sia problema di cache? Da come lo descrivi sembra proprio così. Comunque le parentesi superflue sono quelle che ti ho indicato: dopo echo e dopo return.

  6. #6
    L'avatar di foreach
    foreach non è connesso Altervistiano Junior
    Data registrazione
    11-06-2008
    Residenza
    3 metri sotto terra
    Messaggi
    501

    Predefinito

    Può essere, perché ho notato che visualizzandolo da un altro computer mi dice "si" chiamando il file a.php senza ?dump. Ho notato anche se vedo il codice sorgente di a.php in chrome, mi dà file vuoto. E' un po' strano secondo me.

    Però ora quella funzione mi serve per un controllo serio, non per un semplice echo, e facendo una cosa tipo così:
    Codice PHP:
    if(ipfaparte("192.168.54.32", "192.168.32.0/12") || altri controlli) {
    header("HTTP/1.1 303 See Other");
    header('Location: errore.php');
    die();
    }
    e vedo che anche se l'indirizzo IP fa parte del range scritto, non mi manda all'errore e quindi continua lo script dando per buono una cosa che non è.

    Può essere anche qui un problema di cache?



    Grazie,
    foreach
    Ultima modifica di foreach : 12-03-2015 alle ore 10.47.56
    Codice PHP:
    foreach($vettore as $chiave => $valore) {
    echo 
    "Ciao";


  7. #7
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Credo proprio di sì, la cosa più semplice per verificarlo è provare usando la navigazione anonima.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •