【问题标题】:mysqli in class not working课堂上的mysqli不起作用
【发布时间】:2016-03-23 21:08:23
【问题描述】:

我是 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()

【问题讨论】:

    标签: php class mysqli


    【解决方案1】:

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

    您的连接:

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

    应该是,

    $this->mysqli[...]
    

    其他信息

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

    阅读材料

    Class Properties

    【讨论】:

    • 谢谢,其实我是新来的类其实我想在构造函数方法中创建一个mysqli对象,并在类中的其他方法中使用它。如果您可以编辑我的问题并在此处发布,那将非常有帮助
    • @SugumarVenkatesan 那么我认为您应该从头开始,不要跳入数据库类。了解类的一般知识并使用试错法来习惯类中涉及的功能。如果对您有帮助,请采纳答案。
    • 在使用任何一种方法时,我都会不断收到“找不到类 'CronClass\mysqli'”。
    • @user2924019 以后你应该问一个新问题,但是,在new mysqli 放一个反斜杠之前new \mysqli(...);,这将检查 mysqli 类的全局命名空间而不是你的类的命名空间。
    • 我的英雄!我本来打算提出一个新问题,但是因为被投反对票和我的帐户因提出人们认为已经有答案的问题而被关闭的焦虑太多了。 \ 起作用了,我很困惑为什么我发现的所有例子包括这个问题似乎都不需要 \。谢谢。
    【解决方案2】:

    我希望以下内容有意义 - 它未经测试,但看起来或多或少是正确的。 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;
    ?>
    

    【讨论】:

    • 我不断收到“MyClass\mysqli' not found”。
    猜你喜欢
    • 2013-08-03
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多