嘿伙计我正在使用OOP PHP开发数据库连接,而且我遇到了这个错误;
警告:mysqli_query()要求参数1为mysqli,在第26行的C:\ Users ... \ function.php中给出null。
我是OOP的新手,所以任何帮助都非常感谢
<?php
class MyClass{
var $HOST = "localhost";
var $USER = "user";
var $PASS = "pass";
var $DB = "image_blog";
public $con;
function _construct(){
$this->host = $HOST;
$this->user = $USER;
$this->pass = $PASS;
$this->db = $DB;
$this->con = mysqli_connect($this->host, $this->user, $this->pass, $this->db);
}
public function query($sql)
{
$query = mysqli_query($this->con,$sql);
return $query;
}
}
$obj = new Myclass;
echo $obj->query("SELECT * FROM posts");
答案 0 :(得分:2)
构造函数的名称必须为__construct
两个下划线,而不是一个。
您可以自己调试此类问题。从错误开始向后工作,您首先要var_dump()
$this->con
mysqli_query()
的第一个参数。这将显示$this->con
未定义。接下来,您将返回到您定义的位置并添加die()
语句或类似内容,以查看该代码是否正在运行。你会发现它不是。
从那里,您可以尝试从PHP文档中的已知工作函数中复制/粘贴,然后您会发现构造函数可以正常工作。那么你要做的就是比较你的两个构造函数,你可能会立即发现你的错误。
答案 1 :(得分:1)
var $HOST = "localhost";
var $USER = "user";
var $PASS = "pass";
var $DB = "image_blog";
阅读this answer,您在这里使用过时的语法来声明类属性(事实上,它们本身并不是变量)。在构造函数中(其他人是正确的,缺少第一个下划线),您只是引用未定义的局部变量,而不是属性本身。这里的解决方案是:
_construct
方法之前添加第二个下划线以使其__construct
和我建议将变量作为参数传递给构造函数并以这种方式设置它们(这样你就可以new MyClass( $host, $user, $pass, $db)
)。我也会更改,而不是使用var
关键字来声明这些属性:
protected $host = 'host';
// etc.
另一种选择可能是将它们定义为常量,因为正如您目前使用它们一样,它们永远无法真正改变:
const HOST = 'host';
您可以稍后引用它们:
self::HOST
以下是documentation的相关引用:
为了保持与PHP 4的向后兼容性,PHP 5将会 仍然接受在属性声明中使用关键字var 而不是(或除了)公共,受保护或私人。然而, 不再需要var。在从5.0到5.1.3的PHP版本中 使用var被认为已弃用,并将发布E_STRICT 警告,但自PHP 5.1.3以来,它不再被弃用,也没有 发出警告。
答案 2 :(得分:0)
构造函数以2个下划线function __construct()
答案 3 :(得分:0)
class maindb_con
{
private $hostname;
private $username;
private $password;
private $dbname;
private $con;
function __construct()
{
$this->hostname = "**********";
$this->username = "**********";
$this->password = "**********";
$this->dbname = "**********";
if(!mysql_connect($this->hostname, $this->username, $this->password,$this->dbname))
{
echo'Error:: 1001 Couldnot connect to database. Please update hostname, username and password';
}
else
$this->con=mysql_connect($this->hostname, $this->username, $this->password);
}
/*function maindb_con($hname, $uname, $pwd, $dbname)
{
$this->hostname = $hname;
$this->username = $uname;
$this->password = $pwd;
$this->dbname = $dbname;
}*/
function get_con()
{
mysql_select_db($this->dbname,$this->con);
return $this->con;
}
function get_dbname()
{
return $this->dbname;
}
public function __destruct()
{
mysql_close($this->con);
}
}
并且您可以添加以下方法来运行查询并获取结果,如果查询无法按需要运行,则添加false
public function runQuery($query)
{
//echo "query on runQuery(): ".$query;
if($result=mysql_query($query,$this->con)) //or die("couldnt run mysql_query on runQuery for ".$query)
return $result;
return false;
}
或此类可以按以下方式使用
$dbcon=new maindb_con();
$con=$dbcon->get_con();
//echo "query on runQuery(): ".$query;
if($result=mysql_query($query,$con))
......
请访问here,它将为您提供PHP的高级编程,并提供反馈....
答案 4 :(得分:0)
安全级别更改1
define("DB_HOST", 'yourhostaname');
define("DB_USER", 'dbusername');
define("DB_PASSWORD", 'dbpassword');
define("DB_DATABSE", 'databasename');
安全级别更改2
对受保护的成员变量公开。
1)您的数据库连接代码是非OOP的过程样式
OOP风格:$ this-> con = new mysqli($ this-> host,$ this-> user,$ this-> pass,$ this-> db)
2)您应该更改构造函数__construct()
3)检查条件($ this-> con-> connect_error)是否死了('Database error->'。$ this-> con-> connect_error);
4)更改echo $ obj-> query(“ SELECT * FROM posts”);到print_r($ obj-> query(“ SELECT * FROM posts”));或var_dumb 5)
public function query()
{
return $this->con;
}
6)obj->query("SELECT * FROM posts") or die(obj->error);