我有两节课: 1.数据库类
class Database extends Config{
private $connection;
function __construct()
{
$this->openConn();
}
public function openConn(){
$this->connection = new mysqli($this->dbHost . ":" . $this->dbPort,
$this->dbUser,
$this->dbPass,
$this->dbName);
if (mysqli_connect_errno()) {
echo 'Database connection failed ' . mysqli_errno() . mysqli_connect_error();
}
}
2。登录类
class Login{
private $connection;
function __construct(){
global $database;
$this->connection = $database;
$query = $this->connection->prep("
SELECT * FROM `Users`
WHERE `Email` = ?
AND `Password` = ?
LIMIT 1
");
}
绑定params并尝试运行Login.php后,我收到以下错误:
Fatal error: Call to undefined method Database::prepare()
在线搜索后我发现了许多想法,但没有实际的例子,据我所知,mysqli对象没有被正确传递,我应该使用另一种方法来传递它应该(如果可以防止扩展Database类 - 这是首选,因为我打算使用“扩展”选项进行其他用途。)
谢谢。
答案 0 :(得分:1)
你的 Openconn()没有返回任何内容。
确保它返回数据库光标
您可以将代码更新为:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView webView, String url) {
super.onPageFinished(webView, url);
mSurroundingLayout.requestLayout();
}
}
);
答案 1 :(得分:0)
很多事情我从哪里开始,我想我会先发布更正后的代码(未经测试)
class Database extends Config{
private $connection;
function __construct(){
$this->openConn();
}
protected function openConn(){
$this->connection = new mysqli($this->dbHost . ":" . $this->dbPort,
$this->dbUser,
$this->dbPass,
$this->dbName);
if (mysqli_connect_errno()) {
echo 'Database connection failed ' . mysqli_errno() . mysqli_connect_error();
}
}
public function getConnection(){
return $this->connection;
}
}
class Login{
private $Database;
function __construct(\Database $Database){
$this->Database = $Database;
$connection = $this->Database->getConnection();
$query = $connection->prep("
SELECT * FROM `Users`
WHERE `Email` = ?
AND `Password` = ?
LIMIT 1
");
}
}
你应该避免使用全局变量而是使用依赖注入。所以这个
global $database
替换为
$Database = new Database();
$Login = new Login( $Database );
我不确定那个全局是什么,如果它是一个数据库实例或实际连接,但是数据库类中的$connetion
是私有的,所以为了将它放到外面它应该有一个get方法。我还将openConn()方法更改为受保护,因为它从类外部进行无意义的调用。
我会改变很多其他事情,或者采取不同的做法,但这在很大程度上超出了问题的范围。
您的问题很可能是:
根据您报告的错误,它很可能是第二个,因为您在Database类上调用prepare而不是它存储的连接。