【问题标题】:Notice: Undefined variable: conn注意:未定义变量:conn
【发布时间】:2014-05-16 16:12:53
【问题描述】:

当我像这样进行数据库连接时:

$conn = new MySQLi(RUBYDBUSER, RUBYDBNAME, RUBYDBPASS, RUBYDBDATA);
if($conn->errno) {
    throw new Exception($conn->connect_error, $conn->connect_errno);
}

我想像这样运行一个准备好的语句:

public function getSitename() {
            $stmt = $conn->prepare("SELECT value FROM cms_options WHERE title = 'sitename' ");
            $db->stmt_init();
            $stmt->execute();
            $stmt->bind_result($sitename);
            if($stmt->num_rows > 0) {
                while ($stmt->fetch) {
                    return $sitename;
                }
            }
        }

我收到此错误:

注意:未定义变量:第 26 行 C:\xampp\htdocs\ruby\app\includes\classes\class.core.php 中的 conn

查询位于class.core.php,连接位于global.php。 Class.core 是这样包含的:

(global.php)

foreach(glob(RUBY_BASE . '/app/includes/classes/class.*.php') as $class){
    include_once($class);
}

有答案吗? `

【问题讨论】:

  • 您需要吗?我不确定是否包含,但require_once 还要确保如果您在同一个文件上声明,请使用global 关键字,以便 PHP 知道它是一个已经存在的变量,而不是函数范围内的变量。

标签: php mysqli


【解决方案1】:

变量$conn 不在您的类方法的范围内。您需要执行以下操作之一:

A.) 将 $conn 变量传递给您要调用的方法。

 public function getSitename($conn) {
        $stmt = $conn->prepare("SELECT value FROM cms_options WHERE title = 'sitename' ");
        $db->stmt_init();
         //and so on...
}

B.) 在每个方法中建立连接(不是好选择,因为您没有重用已建立的连接)

C.) 使用静态定义使连接变量成为全局变量。可以在类的构造函数中设置,例如:

   public function __construct($conn) {
       if(empty(static::$conn) {
           static::$conn = $conn;
       }
   }

   public function getSitename() {
       $stmt = static::$conn->prepare("SELECT value FROM cms_options WHERE title = 'sitename' ");
        //... and so on

还有许多其他类似的变体,但它们是通用方法

【讨论】:

  • 第一个解决方案给了我Welkom op Warning: Missing argument 1 for Core::getSitename(), called in C:\xampp\htdocs\ruby\app\themes\default\index.php on line 118 and defined in C:\xampp\htdocs\ruby\app\includes\classes\class.core.php on line 25
  • 第二种解决方案 = 坏主意。第三个想法给了我这个:Warning: Missing argument 1 for Core::__construct(), called in C:\xampp\htdocs\ruby\app\includes\classes\class.core.php on line 42 and defined in C:\xampp\htdocs\ruby\app\includes\classes\class.core.php on line 8 Fatal error: Access to undeclared static property: Core::$conn in C:\xampp\htdocs\ruby\app\includes\classes\class.core.php on line 10
  • @LisaW 您必须更改对各种函数的调用才能传入 $conn 变量。如果您使用构造函数(示例 C.)或调用方法 $object->getSiteName($conn)(示例 A),则在执行 new YourThing($conn)
  • 你的两个答案都不起作用。感谢您的回答槽
  • 答案 A 刚刚对我有用。非常感谢。 @LisaW,我认为您在调用函数时没有再次添加“$conn”。
【解决方案2】:

这是由于变量作用域,$conn 是在函数外部定义的,所以要么将其作为参数传递,要么将其设置为全局,要么使用匿名函数。

$getSitename = function() use($conn) {
            $stmt = $conn->prepare("SELECT value FROM cms_options WHERE title = 'sitename' ");
            $db->stmt_init();
            $stmt->execute();
            $stmt->bind_result($sitename);
            if($stmt->num_rows > 0) {
                while ($stmt->fetch) {
                    return $sitename;
                }
            }
}
// Uses
$getSitename();

【讨论】:

    【解决方案3】:

    如果 $conn 在同一个文件或任何其他文件中初始化并包含在定义 getSitename() 函数的文件中,那么您可以在函数内将 $conn 变量标记为 gloabl 并且它将起作用。

    public function getSitename() {
    
                global $conn; 
    
                $stmt = $conn->prepare("SELECT value FROM cms_options WHERE title = 'sitename' ");
                $db->stmt_init();
                $stmt->execute();
                $stmt->bind_result($sitename);
                if($stmt->num_rows > 0) {
                    while ($stmt->fetch) {
                        return $sitename;
                    }
                }
            } 
    

    【讨论】:

      猜你喜欢
      • 2022-06-17
      • 2012-09-24
      • 2021-03-07
      相关资源
      最近更新 更多