-5

我尝试使用的代码如下,我仔细检查了它和所有内容,它一直说这个错误:致命错误:调用未定义的函数 Votifier(),我不知道问题出在哪里。这是我在这里问的最后手段,我已经在谷歌上搜索了 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()直到else执行之后才定义,但是您在块foo()的开头调用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 回答