2010-01-27 124 views
2

即時通訊新的PHP所以我確信這是一個簡單的。即時得到這個錯誤「未定義的變量」通知

Notice: Undefined variable: conn in C:\Dev\Webserver\Apache2.2\htdocs\EclipsePHP\thecock\php\db.php on line 23 

此代碼

<?php 
$host = "localhost"; $database = "dbname"; $username = "user"; $password = "pass"; 

$conn = new mysqli($host, $username, $password, $database); 

if (! $conn) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
}else{ 
    echo("all ok!"); 
} 

function getContent($id) { 
    $sql = "SELECT content FROM blocktext WHERE id=$id"; 
    if ($rs = $conn->query($sql)) { # line 23 
     if ($row = $rs->fetch_assoc()) {  
      echo stripslashes($row['content']); 
     } 
     $rs->close(); 
    } 
} 
?> 

如何解決這個通知?

+0

第23行是?.... – Pentium10 2010-01-27 10:31:45

+0

可能的重複[爲什麼我在PHP中獲得「未定義變量」通知?](http://stackoverflow.com/questions/1050359/why-am-i-getting -an-undefined-variable-notice-in-php) – outis 2012-07-08 18:02:01

回答

7

的功能更改爲:

function getContent($id, $conn) { 
    $sql = "SELECT content FROM blocktext WHERE id=$id"; 
    if ($rs = $conn->query($sql)) { 
     if ($row = $rs->fetch_assoc()) { 
      echo stripslashes($row['content']); 
     } 
     $rs->close(); 
    } 
} 

您不要在函數的範圍申報的「原始」 $conn。在函數內部,您只能訪問在函數內聲明的變量或通過參數提供的變量。

另一種方法是將變量聲明爲global在你的函數:

function getContent($id) { 
    global $conn; 
    $sql = "SELECT content FROM blocktext WHERE id=$id"; 
    if ($rs = $conn->query($sql)) { 
     if ($row = $rs->fetch_assoc()) { 
      echo stripslashes($row['content']); 
     } 
    $rs->close(); 
    } 
} 

但是,你只能這樣做,如果沒有其他的辦法。全局變量很難調試和維護代碼。請參閱Variable scopewhy global variables are bad

編輯:

是如你可以有一個DB類:

class DB { 
    private static $conn = null; 

    public static function getConnection() { 
     if (is_null(DB::$conn)) { 
     $host = "localhost"; $database = "dbname"; $username = "user"; $password = "pass"; 
     DB::$conn = new mysqli($host, $username, $password, $database); 
     } 
     return DB::$conn; 
    } 
} 

當然這不是最好的實現;)但它應該給你正確的想法。然後你可以得到連接:

DB::getConnection() 
+0

刪除我的,upvoted你的,因爲它更簡潔 – Gordon 2010-01-27 10:31:47

+0

好的謝謝,因爲現在的作品。我在這裏有點困惑,因爲現在它看起來像這樣 $康恩=(獲取連接代碼) 功能getStuff($ ID,$康恩){ (獲取ID碼) } getStuff(IDREF,$康恩) ; 現在怎樣才能通過getStuff調用傳入的$ conn可訪問,但是如果它沒有傳入函數,函數不能訪問它。我認爲所有這些代碼都駐留在一個類中是錯誤的,因此$ conn會是一個類變量,可以通過類方法訪問嗎?即時通訊新的PHP,通常編碼Java! – Dori 2010-01-27 10:37:07

+0

好的感謝編輯。現在有道理。如果這包含在一個類中,函數可以訪問類變量,但是對嗎? – Dori 2010-01-27 10:42:05

1

conn是一個全局變量。要在函數內部訪問:

function getContent($id) { 
    global $conn; 
    ... 
} 

否則功能無法看到它。

+2

這個答案很好,因爲它解釋了爲什麼它不起作用,但是就實際實現而言,Felix示例是一個稍微好一點的示例,因爲最好真正嘗試並儘可能避免在函數中引用全局變量,特別是在PHP中。在這種情況下,你可能想放棄一個功能。如果它需要可重用,你可能想看看像http://www.php-editors.com/articles/simple_php_classes.php這樣的一個簡單的指南來創建漂亮的,可重用的PHP OO類。 – 2010-01-27 10:42:38

+2

@Iain:嗯......我有一件關於PHP過度複雜的事情,並試圖讓它不是。我實際上認爲全局數據庫連接是好的(而且很簡單)。我看到人們無時無刻地在這類事物之上創建令人費解的類層次結構,並且不一定會增加任何價值。 – cletus 2010-01-27 10:48:29

+0

我理解你關於簡化的觀點 - 對於PHP來說,有太多複雜且編寫不好的庫,但我認爲「試圖讓PHP不是這樣」的評論有點諷刺。我認爲在方法中使用全局變量也會使事情複雜化,就像不使用面向對象的原則一樣(除了微不足道的用例外)。如果你確實在任何地方使用全局變量,那麼我強烈建議使用超全局的$ GLOBALS(例如$ GLOBALS ['conn']),因爲它在任何地方立即清除,並且不需要顯式聲明。 – 2010-01-27 11:34:33