我有一个登录会话,在我的登录类中,我创建了一个为我提取用户信息的函数。现在我将此限制为user_id,因为我想将其保存到数据库中,以便我可以轻松地告诉哪个用户在我的数据库中发布了什么。
我正在尝试从另一个类我的Login类访问此函数。
我已经尝试过两种方法来调用我在网上找到的功能:
$user_id = Login::usersessioninfo();
和
$login = new Login(); $login->useressioninfo();
但是当我调用这两种方式中的任何一种时,我都会收到以下错误:
Fatal error: Call to a member function prepare() on a non-object in E:\xampp\htdocs\iproject\classes\class.Login.php on line 101
我不明白为什么PDO功能现在突然变成非对象:/
关于我做错了什么的任何想法?准备好的声明很好我已经在自己的课上单独测试了这个,但是我很难将它传递给另一个课程。
这是我的数据库:
<?php
# We are storing the information in this config array that will be required to connect to the database.
$config = array(
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'imanage'
);
#connecting to the database by supplying required parameters
$pdo = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['dbname'], $config['username'], $config['password']);
#Setting the error mode of our db object, which is very important for debugging.
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
在类中我连接到我的数据库:
编辑:添加完整登录类*
<?php
// Authentication
require_once 'init.php';
class Login {
private $pdo; // This variable will only be accessible from inside this class
public function __construct($database)
{
$this->pdo = $database;
} // end constructor method
public function validatelogin() {
$_SESSION['formAttempt'] = true;
if (isset($_SESSION['error'])) {
unset($_SESSION['error']);
}
$_SESSION['error'] = array();
$required = array("username","password");
//Check required fields
foreach ($required as $requiredField) {
if (!isset($_POST[$requiredField]) || $_POST[$requiredField] == "") {
$_SESSION['error'][] = $requiredField . " is required.";
}
}
//final disposition
if (count($_SESSION['error']) > 0) {
die(header("Location: ../index.php"));
} else {
unset($_SESSION['formAttempt']);
}
}//end validate login
function logged_in() {
if($_SESSION['authorized'] == true) {
return true;
} else {
return false;
}
}
function login_required() {
if($this->logged_in()) {
return true;
} else {
header("location: ../index.php");
}
}
public function loginuser() {
$username = (isset($_POST['username'])) ? $_POST['username'] : '';
$password = (isset($_POST['password'])) ? $_POST['password'] : '';
$Blowfish_Pre = '$2a£05$';
$Blowfish_End = '$';
$hashed_pass = crypt($password, $Blowfish_Pre . $row['salt'] . $Blowfish_End);
//$salt = "boo";
//$pw = crypt($password, $salt);
$stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1");
$stmt->bindParam(":username", $username, PDO::PARAM_STR);
$stmt->bindParam(":password", $hashed_pass, PDO::PARAM_STR);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$total = $stmt->rowCount();
if($total > 0){
session_regenerate_id(true);
$_SESSION['username'] = $username;
$row['name'] = $name;
$_SESSION['authorized'] = true;
header("location: ../users.php");
} else {
echo "Wrong password or username";
}
//old login script.
//if (!$row)
// {
// echo "Invaild username or password. Try again";
// } else {
// $_SESSION['authorized'] = true;
// $_SESSION['username'] = $username;
// header("Location: testloginrequired.php");
// }
}// end loginuser
public static function usersessioninfo() {
$username = $_SESSION['username'];
$stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->bindParam(":username", $username, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// i can put this foreach above .. change $row above to $esult and then use for $row for the foreach()
foreach($result as $row) {
$username = $row['username'];
$id = $row['id'];
}
}
//public function selectuser() {
//$username = "test";
//$password = "password";
// $stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1");
// $stmt->bindValue(":username", $username);
//$stmt->bindValue(":password", $password);
// $stmt->execute();
// $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// foreach($result as $row) {
// $username = $row['username'];
// $email = $row['email'];
// echo $username;
//echo $password;
//echo $email;
// }//end foreach
// } // end function
}// End login class
$login = new Login($pdo);
$login->logged_in();
$login->login_required();
if (isset($_POST['submitlogin'])) {
$login->loginuser();
}
*编辑项目类*
类/ class.Project.php
<?php
include ('init.php');
include('class.Login.php');
class Projects extends Login {
private $pdo; // This variable will only be accessible from inside this class
public function __construct($database)
{
$this->pdo = $database;
} // end constructor method
public function createproject() {
//$login = new Login($pdo)
$user_id = $this->usersessioninfo();
$project_name = isset($_POST['project_name']) ? $_POST['project_name'] : null;
$project_brief = isset($_POST['project_brief']) ? $_POST['project_brief'] : null;
$data = array($user_id, $project_name, $project_brief);
$stmta = $this->pdo->prepare("INSERT INTO projects (user_id, project_name, project_brief) VALUES (?, ?, ?)");
if (isset($_POST['submitproject'])) {
$stmta->execute($data);
echo 'Right thats the boring stuff out of the way, lets create some tasks.';
printf("%d Row inserted.\n", $stmta->rowCount());
header("refresh:5; url=../users.php");
} else {
echo "Sorry something we couldn't process your project, you're been redirected to the registration page shortly.";
header("refresh:5; url=../create.php");
}
} // end function
} // end projects class
$run = new Projects($pdo);
$run->createproject();
//$login = new Login($this->pdo);
?>
的init.php
<?php
session_start();
require 'class.Database.php';
//$errors = array();
?>
createproject.php
<?php
include('classes/class.Login.php');
include('header.html');
$run = new Login($pdo);
?>
<div id="maincontentWrapper">
<div id="maincontent">
<div id="contentWrapper"></div><!--End registerWrapper -->
<article>
<p>Right lets create your project! Fill in a few details...</p>
</article>
<div id="loginform">
<div id="registerWrapper">
<form id="registerForm" name="registerForm" method="POST" action="classes/class.Projects.php">
<h1><span class="log-in">Create a new project</span></h1>
<p class="required"><span class="log-in">*Required Fields</span></p>
<div id="errorDiv"><?php
if (isset($_SESSION['error']) & isset($_SESSION['formAttempt'])) {
unset($_SESSION['formAttempt']);
print "Errors encountered<br/>\n";
foreach ($_SESSION['error'] as $error) {
print $error . "<br />\n";
} //end foreach
} //end if
?></div>
<p class="float">
<label for="password"><i class="icon-lock"></i>Project Name*</label>
<input type="text" id="project_name" name="project_name" placeholder="Project Name" class="showpassword">
<span class="errorFeedback errorSpan" id="nameError">Project name is required</span>
</p>
<p class="float">
<label for="login"><i class="icon-user"></i>Project brief*</label>
<textarea rows="10" class="showpassword" name="project_brief" placeholder="Insert a short brief about your project"></textarea>
<span class="errorFeedback errorSpan" id="usernameError">Username is required</span>
</p>
<p class="float">
<label for="password"><i class="icon-lock"></i>Project Start Date*</label>
<input type="text" id="project_start_date" name="project_start_date" placeholder="Project Start Date" class="showpassword">
<span class="errorFeedback errorSpan" id="passwordError">Password is required</span>
</p>
<p class="float">
<label for="password"><i class="icon-lock"></i>Project End Date (Estimate if you can)*</label>
<input type="text" id="project_end_date" name="project_end_date" placeholder="Project End Date" class="showpassword">
<span class="errorFeedback errorSpan" id="password2Error">Passwords dont mat</span>
</p>
<p class="clearfix">
<input type="submit" name="submitproject" value="Register"></form>
</p>
</div>
</div>
</div>
</div>
</div>
<?php
include("footer.html");
?>
答案 0 :(得分:0)
根据您发布的信息,我看不到您将$ pdo对象传递给“Login”类。
你可以发布整个Login类吗?
修改强>
我看到你发布了完整的“登录”课程。据我所知,你没有将$ pdo对象传递给“Login”类:
$user_id = Login::usersessioninfo();
如果您确实执行了以下操作,我相信它会起作用:
$login = new Login($pdo);
$login->useressioninfo();
答案 1 :(得分:0)
在Project.php中它应该是
$login = new Login($this->pdo);
而不是
$login = new Login($pdo);
无法从类方法中访问全局$ pdo。