-5

私が使用しようとしているコードは以下のとおりです。私はそれとすべてを再確認しましたが、このエラーを言い続けています: Fatal error: Call to undefined function Votifier() , I don't know what the problem is here. これは、ここで尋ねる最後の手段です。私は 2 時間グーグルで検索しました..よろしくお願いします。

<?php
if (isset($_COOKIE['votfed']) && $_COOKIE['vofted'] == 'true') {
    exit();
} else {
    mysql_connect("", "", "")or die("cannot connect");
    mysql_select_db("")or die("cannot select DB");
    $result = mysql_query('SELECT * FROM servers WHERE id = "' . $_GET["server"] . '"');
    while ($row = mysql_fetch_array($result)) {
        $public_key  = $row['votifier_key'];
        $server_ip   = $row['ip'];
        $server_port = $row['votifier_port'];
        $username    = 'USERNAME';
    }
    $username = preg_replace("/[^A-Za-z0-9_]+/", '', $username);
    if (Votifier($public_key, $server_ip, $server_port, $username)) {
        echo 'Success!';
    } else {
        echo 'Error!';
    }
    ini_set('error_reporting', E_ALL);
    function Votifier($public_key, $server_ip, $server_port, $username) {

        $public_key = wordwrap($public_key, 65, "\n", true);
        $public_key = <<<EOF
-----BEGIN PUBLIC KEY-----
$public_key
-----END PUBLIC KEY-----
EOF;
        $address    = $_SERVER['REMOTE_ADDR'];
        $timestamp  = time();
        $string     = "VOTE\MC-ServerLists.com\n$username\n$address\n$timeStamp\n";
        $leftover   = (256 - strlen($string)) / 2;
        while ($leftover > 0) {
            $string .= "\x0";
            $leftover--;
        }
        openssl_public_encrypt($string, $crypted, $public_key);
        $socket = fsockopen($server_ip, $server_port, $errno, $errstr, 3);
        if ($socket) {
            fwrite($socket, $crypted);

            return true;
        } else
            return false;
    }

    mysql_connect("", "", "")or die("cannot connect");
    mysql_select_db("")or die("cannot select DB");
    mysql_query('insert into voters (server_id, ipaddress) VALUES ("' . $_GET["server"] . '", "' . $_SERVER['REMOTE_ADDR'] . '")');
}
4

1 に答える 1

5

コードを正しくフォーマットすると、関数が条件付きで定義されていることがわかります。このため、関数を呼び出す前にその定義を行う必要があります。

<?php
if (isset($_COOKIE['votfed']) && $_COOKIE['vofted'] == 'true') {
    // ...
} else {
    // ...
    $username = preg_replace("/[^A-Za-z0-9_]+/", '', $username);
    if (Votifier($public_key, $server_ip, $server_port, $username)) {
        echo 'Success!';
    } else {
        echo 'Error!';
    }
    function Votifier($public_key, $server_ip, $server_port, $username)
    {
        // ...
    }
    // ...
}
?> 

基本的に、次のコードを実行しています。

<?php
if( false) {
} else {
    if( foo()) { 
        echo 'Foo!'; 
    }
    function foo() { 
        return true;
    }
}

これは、実行foo()後まで定義されていないことを示しているはずですが、ブロックの先頭(定義される前) に呼び出します。elsefoo()else

次のように、関数はifステートメントの外にある必要があります。

<?php
function Votifier($public_key, $server_ip, $server_port, $username)
{
    // ...
}
if (isset($_COOKIE['votfed']) && $_COOKIE['vofted'] == 'true') {
    // ...
} else {
    // ...
    $username = preg_replace("/[^A-Za-z0-9_]+/", '', $username);
    if (Votifier($public_key, $server_ip, $server_port, $username)) {
        echo 'Success!';
    } else {
        echo 'Error!';
    }
    // ...
}

または、ブロックの先頭に配置することもできますがelse、読みやすさの観点からはお勧めしません。

于 2013-01-07T21:24:47.320 に答える