注意:未定义的变量:conn

时间:2014-05-16 16:12:54

标签: php mysqli

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

$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.phpglobal.php中的连接位于foreach(glob(RUBY_BASE . '/app/includes/classes/class.*.php') as $class){ include_once($class); } 。 Class.core包含如下:

(global.php)

{{1}}

有什么答案吗? `

3 个答案:

答案 0 :(得分:7)

变量$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

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

答案 1 :(得分:0)

由于范围可变,$ 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();

答案 2 :(得分:-1)

如果$ 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;
                }
            }
        }