2013-01-07 55 views
-3

我正在嘗試使用的代碼如下,Ive再次檢查了它和一切,它一直說這個錯誤:致命錯誤:調用未定義的函數Votifier(),我不知道問題在這裏。這是我最後的問題,在這裏問,我一直在谷歌搜索2小時..在此先感謝。PHP身份不明的函數腳本

<?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'] . '")'); 
} 
+1

歡迎來到Stack Overflow! [**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 –

+2

這種縮進方式就是所謂的「代碼牆」。請格式化您的代碼以使其可讀,我不認爲您在編輯器中看起來像這樣。至少,我希望你不要。 – DaveRandom

回答

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塊的開頭放置,但我不會從可讀性的角度推薦它。

+2

+1但輕微(迂腐)修正 - 該功能是在正確的「範圍」中定義的,但由於它是有條件定義的,所以必須先定義才能使用。如果函數是在全局「範圍」中定義的(即在通話時沒有條件地或其他地方),那麼它們在文件中相對於調用代碼的位置並不重要。 – DaveRandom

+0

@Dave - 我以爲我在解釋這件事上做的不好。謝謝,我已經更新了我的答案。 – nickb

+0

你也沒有指出關於'$ timeStamp'的未定義變量警告...;) – hakre