代码之家  ›  专栏  ›  技术社区  ›  Dori

“未定义变量”通知

php
  •  2
  • Dori  · 技术社区  · 16 年前

    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();  
        } 
    } 
    ?>
    

    2 回复  |  直到 14 年前
        1
  •  7
  •   Felix Kling    16 年前

    将您的功能更改为:

    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();
         }
    }
    

    但只有在没有其他办法的情况下,你才应该这样做。Globals使得调试和维护代码变得困难。

    Variable scope 和 why 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()
    
        2
  •  1
  •   cletus    16 年前

    conn

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

    否则函数将无法看到它。

    推荐文章