我正在研究php并尝试将它与oop集成在一起,有人可以解释这个错误的想法吗?
因为我猜它找不到查询,但我无法理解,因为在$query
中一切都是正确的,ps global $mysqli
仅用于测试目的,我知道使用它粗心大意。
<?php
class Index{
public function connect(){
$mysqli=new mysqli();
$mysqli->connect('localhost',"root","");
$conn=$mysqli->select_db("webartisan");
if($mysqli->errno){
echo "Unable to connect to the database: ".$mysqli->error;
exit();
}
}
public function select_data($table,$id){
$query="SELECT * FROM {$table} WHERE id=$id ";
}
public function insert_data(){
global $conn;
$username=$_POST['username'];
$password=$_POST['password'];
$query="INSERT INTO artisan(username,password) VALUES('$username','$password')";
$result=$conn->query($query);
if($result->num_rows){
return true;
}
}
public function register(){
if(isset($_POST['submit'])){
self::insert_data();
}
}
}
$index=new Index();
$index->register();
?>
<form method="POST" action="index.php">
<input type="text" name="username"><br><br>
<input type="password" name="password"><br><br>
<input type="submit" name="submit">
</form>
错误:
致命错误:未捕获错误:在null上调用成员函数query() 在C:\ xampp \ htdocs \ webartisan \ index.php:23堆栈跟踪:#0 C:\ xampp \ htdocs \ webartisan \ index.php(31):Index-&gt; insert_data()#1 C:\ xampp \ htdocs \ webartisan \ index.php(36):Index-&gt; register()#2 {main} 在第23行的C:\ xampp \ htdocs \ webartisan \ index.php中抛出
答案 0 :(得分:3)
$conn
变量无法作为全局变量访问,因为您在$conn
方法中将connect()
声明为局部变量。
要解决此问题,您需要声明为类字段,然后您可以在类$conn
的任何方法中访问$this->conn
Index
。这样您就不需要global $conn
。
例如:
<?php
class Index{
private $conn;
public function connect() {
...
$this->conn = $mysqli->select_db("webartisan");
...
}
public function insert_data() {
...
$result = $this->conn->query($query);
...
}
}
<强>更新强>
select_db()
返回布尔值,而不是连接对象。如您在评论中所述,以下行会导致Call to a member function query() on boolean
错误。
$this->conn = $mysqli->select_db("webartisan");
您应该阅读mysqli documentation。