"未定义变量"通知

Dor*_*ori 2 php

我是php的新手,所以我确定这是一个简单的.我得到这个错误

Notice: Undefined variable: conn in C:\Dev\Webserver\Apache2.2\htdocs\EclipsePHP\thecock\php\db.php on line 23
Run Code Online (Sandbox Code Playgroud)

这个代码

<?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();  
    } 
} 
?>
Run Code Online (Sandbox Code Playgroud)

我该如何修复通知?

Fel*_*ing 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();
     }
}
Run Code Online (Sandbox Code Playgroud)

您不在$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();
     }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果没有别的办法,你应该这样做.Globals使调试和维护代码变得困难.

另请参见变量范围以及全局变量不良的原因.

编辑:

是的,例如你可以拥有一个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;
   }
}
Run Code Online (Sandbox Code Playgroud)

当然这不是最好的实现;)但它应该给你正确的想法.然后你可以获得连接:

DB::getConnection()
Run Code Online (Sandbox Code Playgroud)