我试图使用的代码如下,我仔细检查了它和一切,它一直说这个错误:致命错误:调用未定义的函数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'] . '")');
}
如果您的代码格式化正确,您会看到函数是有条件定义的,因此,它的定义必须在调用函数之前发生:
<?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
执行之后才被定义,但是您在else
块的开始(在它被定义之前)调用foo()
。
你的函数应该在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
块的开头,但从可读性的角度来看,我不建议这样做。