【发布时间】:2017-03-31 00:11:27
【问题描述】:
我正在尝试使用 PHP OOP 创建一个注册系统,但是当我执行它时出现此错误
注意:未定义变量:在第 14 行的 C:\wamp64\www\news\classes\user.php 中连接
致命错误:在第 14 行的 C:\wamp64\www\news\classes\user.php 中的 null 上调用成员函数 prepare()
我相信我的问题是我的 calsse 无法获得数据库连接实例,即使我在启动时传递它。我有 2 个课程和一个注册页面 我的第一堂课是 dbconnect.php
<?php
include "./config.php";
class dbconnect{
public function __construct(){
try {
$conect = new PDO('mysql:host='.SERVER.'; dbname='.DATABASE, USERNAME, PASSWORD);
$conect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conect;
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
}
}
?>
我的第二个类是 user.php
<?php
class user{
public $username;
public $connect;
function __construct($username,$connect){
$this->username=$username;
$this->connect=$connect;
}
protected function user_exist(){
$request="SELECT * FROM `users` where username='".$this->username."'";
$sql=$connect->prepare($request);
$sql->execute();
$results = $sql->fetch(PDO::FETCH_ASSOC);
if(is_array($results)){
//echo "utilisateur exist";
return true;
}
else{
//echo "utilisateur n'existe pas";
return false;
}
}
public function register($firstname,$lastname,$email,$user,$password){
if(!($this->user_exist())){
$request="INSERT INTO USERS (nom,prenom,email,user,pass,role,statut,date ) VALUES (:firstname, :lastname, :email, :username, :password, :role,:staut, :now())";
$sql = $connect->prepare($request);
$sql->bindParam(':fistname', $firstname);
$sql->bindParam(':lastname', $lastname);
$sql->bindParam(':email', $email);
$sql->bindParam(':username', $username);
$sql->bindParam(':password', $password);
$sql->bindParam(':role', 'subscriber');
$sql->bindParam(':statut', 'waiting for validation');
//$sql->bindParam(':date', $date);
try{
$sql->execute();
}
catch(Exception $e){
if ($e->getCode() == 1062) {
echo $e;
} else {
throw $e;
}
}
}
}
}
?>
然后是我的注册页面
<?php
include "classes/dbconnect.php";
include "classes/user.php";
if((isset($_POST["submit"])) and $_POST["verificaation"]=="submit1"){
$nom = $_POST["nom"];
$prenom = $_POST["prenom"];
$email = $_POST["email"];
$username = $_POST["username"];
$pass = $_POST["password"];
$passver = $_POST["passver"];
$conect=new dbconnect();
$user= new user($username,$conect->connect);
$msg=$user->register($nom,$prenom,$email,$user,$pass);
print_r ($conect);
}
?>
<form method="post" action="register.php">
<label>Nom</label>
<input type="text" name="nom"/><br />
<label>Prenom</label>
<input type="text" name="prenom"/><br />
<label>Email</label>
<input type="email" name="email"/><br />
<label>Nom d'utilisateur</label>
<input type="text" name="username" /><br />
<label>Mot de passe</label>
<input type="password" name="password" /><br />
<label>Recrivez le mot de passe</label>
<input type="password" name="passver"/><br />
<input type="submit" name="submit" value="submit" /><br />
<input type="hidden" name="verificaation" value="submit1" />
</form>
【问题讨论】:
-
:now()这就是为什么:fistname和:staut。您需要检查整个代码并继续调试它。 -
应该是
$this->connect而不是$connect。 -
这包含太多错误
-
哇!错误。需要指出几个错误。您的绑定参数占位符不匹配。好好检查一下。检查用户是否存在的功能也是错误的。你知道数组可以是空的。在你的用户存在函数中将 $connect 更改为 $this->connect。建议。请使用 IDE
-
您不会“为每个条目添加斜杠”。不要使用
addslashes,使用带有占位符值的准备好的语句。这将根据需要正确转义字符串。在 PDO 中,您实际上可以在一次调用中使用execute与所有占位符的关联数组,无需单独拼出每个bindParam。