Php mysqli在课堂上不工作

Php mysqli在课堂上不工作,php,class,mysqli,Php,Class,Mysqli,我不熟悉PHP类 class metacountry { public $mysqli; function metacountry() { global $config; $mysqli=new mysqli($config['DBHostName'],$config['DBUserName'],$config['DBPassword'],$config['DBName']); $mysqli->set_charset("utf8"); if (m

我不熟悉PHP类

class metacountry
{
  public $mysqli;
  function metacountry()
  {

    global $config;
    $mysqli=new mysqli($config['DBHostName'],$config['DBUserName'],$config['DBPassword'],$config['DBName']);
   $mysqli->set_charset("utf8");
   if (mysqli_connect_errno()) {

      printf("Connect failed: %s\n", mysqli_connect_error());
      exit();

    }

  }

  function InsertCountry()
  {

    $stmt=$mysqli->prepare("insert into tbl_metacountry values(?,?,?,?,?)");
    $stmt->bind_param('sssss', $country, $meta_title, $meta_keywords, $meta_description, $active);
    $country=addslashes(addcslashes($mysqli->real_escape_string($_POST['country'], "%_")));
    $meta_title=addslashes(addcslashes($mysqli->real_escape_string($_POST['meta_title'], "%_")));
    $meta_keywords=addslashes(addcslashes($mysqli->real_escape_string($_POST['meta_keywords'], "%_")));
    $meta_description=addslashes(addcslashes($mysqli->real_escape_string($_POST['meta_description'], "%_")));
    $meta_active=addslashes(addcslashes($mysqli->real_escape_string($_POST['active'], "%_")));
    $stmt->execute();
    $stmt->close();

  }

 }  
它抛出一个错误:

致命错误:在/var/www/html/country.php中调用null上的成员函数prepare()


必须使用
$this
引用类属性

您的连接:

$mysqli=new mysqli($config['DBHostName'],$config['DBUserName'],$config['DBPassword'],$config['DBName']);
应该是,

$this->mysqli[...]
其他信息

您不应该使用
global
,而应该在类中定义数据库设置,使其更加面向对象

阅读材料


您必须使用
$this
来引用类属性

您的连接:

$mysqli=new mysqli($config['DBHostName'],$config['DBUserName'],$config['DBPassword'],$config['DBName']);
应该是,

$this->mysqli[...]
其他信息

您不应该使用
global
,而应该在类中定义数据库设置,使其更加面向对象

阅读材料


我希望以下内容有意义——它没有经过测试,但看起来或多或少是正确的。db连接是在公共构造函数中创建的,为了清晰起见,使用
$this->conn
引用它-当然,您可以根据需要将其重命名为任何名称

<?php
    class metacountry{
        private $conn;
        private $config;

        public function __construct($config=array()){
            /* initialise actual values at runtime */
            $this->config=(object)array_merge(array(
                'DBHostName'    =>  false,
                'DBUserName'    =>  false,
                'DBPassword'    =>  false,
                'DBName'        =>  false
            ),$config);


            $this->conn=new mysqli( $this->config->DBHostName, $this->config->DBUserName, $this->config->DBPassword, $this->config->DBName );
            $this->conn->set_charset("utf8");

            if( $this->conn->connect_errno ) {
                printf( "Connect failed: %s\n", $this->conn->connect_error );
                exit();
            }       
        }



        function InsertCountry(){
            $stmt=$this->conn->prepare("insert into `tbl_metacountry` values (?,?,?,?,?)");
            $stmt->bind_param('sssss', $country, $meta_title, $meta_keywords, $meta_description, $active );

            $country=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['country'], "%_" ) ) );
            $meta_title=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['meta_title'], "%_" ) ) );
            $meta_keywords=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['meta_keywords'], "%_" ) ) );
            $meta_description=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['meta_description'], "%_" ) ) );
            $meta_active=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['active'], "%_" ) ) );

            $stmt->execute();
            $stmt->close();
        }
    } 



    /* example */
    $config=array(
        'DBHostName'=>'localhost',
        'DBUserName'=>'root',
        'DBPassword'=>'password',
        'DBName'    =>'mydb'
    );
    $meta=new metacountry( $config );
    if( $_SERVER['REQUEST_METHOD']=='POST' ) $meta->InsertCountry();
    $meta=null;
?>

我希望以下内容有意义——它没有经过测试,但看起来或多或少是正确的。db连接是在公共构造函数中创建的,为了清晰起见,使用
$this->conn
引用它-当然,您可以根据需要将其重命名为任何名称

<?php
    class metacountry{
        private $conn;
        private $config;

        public function __construct($config=array()){
            /* initialise actual values at runtime */
            $this->config=(object)array_merge(array(
                'DBHostName'    =>  false,
                'DBUserName'    =>  false,
                'DBPassword'    =>  false,
                'DBName'        =>  false
            ),$config);


            $this->conn=new mysqli( $this->config->DBHostName, $this->config->DBUserName, $this->config->DBPassword, $this->config->DBName );
            $this->conn->set_charset("utf8");

            if( $this->conn->connect_errno ) {
                printf( "Connect failed: %s\n", $this->conn->connect_error );
                exit();
            }       
        }



        function InsertCountry(){
            $stmt=$this->conn->prepare("insert into `tbl_metacountry` values (?,?,?,?,?)");
            $stmt->bind_param('sssss', $country, $meta_title, $meta_keywords, $meta_description, $active );

            $country=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['country'], "%_" ) ) );
            $meta_title=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['meta_title'], "%_" ) ) );
            $meta_keywords=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['meta_keywords'], "%_" ) ) );
            $meta_description=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['meta_description'], "%_" ) ) );
            $meta_active=addslashes( addcslashes( $this->conn->real_escape_string( $_POST['active'], "%_" ) ) );

            $stmt->execute();
            $stmt->close();
        }
    } 



    /* example */
    $config=array(
        'DBHostName'=>'localhost',
        'DBUserName'=>'root',
        'DBPassword'=>'password',
        'DBName'    =>'mydb'
    );
    $meta=new metacountry( $config );
    if( $_SERVER['REQUEST_METHOD']=='POST' ) $meta->InsertCountry();
    $meta=null;
?>


谢谢,实际上我对类是新手,实际上我想在构造函数方法中创建一个mysqli对象,并在类中的其他方法中使用它。如果你能编辑我的问题并在这里发布,那将非常有帮助ful@SugumarVenkatesan那么我认为你应该从头开始,不要跳进数据库类。了解类的一般情况,并使用试错法来习惯类中涉及的特性。如果答案对您有帮助,请接受。当使用任何一种方法时,我都会得到“Class'CronClass\mysqli'notfound”。@user2924019但是,在
new mysqli
之前,您应该问一个新问题,所以
new\mysqli(…),这将检查mysqli类的全局命名空间,而不是您的类的命名空间。我的英雄!我本打算提出一个新问题,但由于人们认为我已经有了答案,我担心被否决,我的账户被关闭。如果\成功了,我很困惑,为什么我在这个问题上找到的所有例子似乎都不需要\。谢谢。谢谢,实际上我是新来的类。实际上我想在构造函数方法中创建一个mysqli对象,并在类中的其他方法中使用它。如果你能编辑我的问题并在这里发布,那将非常有帮助ful@SugumarVenkatesan那么我认为你应该从头开始,不要跳进数据库类。了解类的一般情况,并使用试错法来习惯类中涉及的特性。如果答案对您有帮助,请接受。当使用任何一种方法时,我都会得到“Class'CronClass\mysqli'notfound”。@user2924019但是,在
new mysqli
之前,您应该问一个新问题,所以
new\mysqli(…),这将检查mysqli类的全局命名空间,而不是您的类的命名空间。我的英雄!我本打算提出一个新问题,但由于人们认为我已经有了答案,我担心被否决,我的账户被关闭。如果\成功了,我很困惑,为什么我在这个问题上找到的所有例子似乎都不需要\。谢谢。我一直收到“找不到MyClass\mysqli”。我一直收到“找不到MyClass\mysqli”。