继承我的代码以连接数据库
function createConnection($DB_USER, $DB_PASSWORD){
$dbc = new PDO('mysql:host=****', $DB_USER, $DB_PASSWORD);
}
及以下,是被称为
的函数的代码function checkIfUserExists($dbc, $username, $table){
global $dbc;
$stmt = $dbc->prepare("SELECT * FROM ? WHERE username = ?");
$stmt = bindParam(1, $table);
$stmt = bindParam(2, $username);
$stmt->execute();
}
下面是我用来调用它们的代码
$connect = new databaseOperations;
$connect->createConnection($DB_USER, $DB_PASSWORD);
$connect->checkIfUserExists($dbc, login, Username);
我的问题是为什么我在页面加载时对非对象错误的成员函数prepare()进行调用?
答案 0 :(得分:3)
您得到的是因为传递给$dbc
方法的checkIfUserExists
在全局范围内不可用,只在创建它的范围内(在这种情况下,{{1}的范围}})。
解决方案很简单:永远不要在代码中使用全局变量,并且应该使用全局变量的最后一个代码是OOP代码。
使用类似的东西:
createConnection
或者返回class DatabaseOperations
{
private $dbc;
public function createConnection(...)
{
$this->dbc = new PDO(...);
}
public function checkIfUserExists(...)
{
$this->dbc->prepare(...);
// ...
}
}
$db = new DatabaseOperations();
$db->createConnection(...);
$db->checkIfUserExists(...);
函数中的$dbc
变量并将其传递给其他函数。
重要的注意事项:这肯定不是您应该使用类的方式。阅读有关OOP和类似程序的内容。在这种情况下,您通常在
createConnection
(活动记录)或User
(DataMapper)对象上有一个方法来检查它是否存在。
答案 1 :(得分:0)
function createConnection($DB_USER, $DB_PASSWORD){
$dbc = new PDO('mysql:host=****', $DB_USER, $DB_PASSWORD);
return $dbc; // <---- add this...
}
function checkIfUserExists($dbc, $username, $table){
// ---> no need to use global, because you pass $dbc as an argument
...调用
$dbc = $connect->createConnection($DB_USER, $DB_PASSWORD);