昨天,脚本运行得很好,当我填写正确的信息时,我仍然被重定向,但是当我没有得到以下错误时:
注意:未定义的变量:第26行的C:\ xampp \ htdocs \ webshop \ resources \ library \ login.class.php中的状态
致命错误:在第26行的C:\ xampp \ htdocs \ webshop \ resources \ library \ login.class.php中的非对象上调用成员函数rowCount()
<?php
require_once('../resources/config.php');
class user
{
private $db;
public function __construct()
{
$this->db = new config();
$this->db = $this->db->dbConnect();
}
public function login($name, $pass)
{
if(!empty($name) && !empty($pass))
{
//parameter query to prevent sql injection
$state = $this->db->prepare("select * from users where name=? and pass=?");
$state->bindParam(1, $name);
$state->bindParam(2, $pass);
$state->execute();
}
if($state->rowCount() == 1)
{
header('location: index?page=basket.php');
echo "you have been loged in as <b>$dbuser</b>";
}else{
echo "incorrect user";
}
}
}
?>
使用
<?php
require_once('../resources/library/login.class.php');
if(isset($_POST['submit']))
{
$name = $_POST['user'];
$pass = $_POST['pass'];
$obj_login = new user();
$obj_login->login($name, $pass);
}
?>
<form method="post" action="index.php?page=login.php">
username: <input type="text" name="user"/>
password: <input type="text" name="pass"/>
<input type="submit" name="submit" value="Login"/>
</form>
有人可以指导我吗?
答案 0 :(得分:1)
如果$name
或$pass
为空,则未定义$state
(由于您的if
- 语句)。稍后您假设存在$state
并尝试访问其方法。
这会导致您的错误。
最简单的解决方法是在if($state->rowCount() == 1)
之后立即移动$state->execute()
及其'true'分支,因此仅检查状态是否已执行。
如果用户已登录,请从该功能返回。因此,当登录失败时,您可以离开echo "incorrect user";
来处理案例。
public function login($name, $pass)
{
if(!empty($name) && !empty($pass))
{
//parameter query to prevent sql injection
$state = $this->db->prepare("select * from users where name=? and pass=?");
$state->bindParam(1, $name);
$state->bindParam(2, $pass);
$state->execute();
if($state->rowCount() == 1)
{
header('location: index?page=basket.php');
// do NOT output content after you set this header!
// echo "you have been loged in as <b>$dbuser</b>";
return true;
}
}
echo "incorrect user";
return false;
}
答案 1 :(得分:0)
当名称或传递为空时,您不定义$state
。
答案 2 :(得分:0)
您必须在登录PHP代码中添加此内容:
require_once('../resources/config.php');
答案 3 :(得分:0)
您的错误是user::login()
仅在$name
和$pass
都不为空的情况下准备语句。但是,如果它们仍然是代码仍然尝试执行该语句。显然,在那个条件下,语句对象从未被实例化,这就是你得到错误的原因。
您可以通过在提交请求时检查用户名和密码是否为空来解决此问题。一个小的建议也是不依赖于一个值来告诉您请求中使用的 HTTP请求方法。我强烈建议你不要依赖这种行为,特别是因为一些浏览器根本不会发送提交输入类型的值。而是使用$_SERVER['REQUEST_METHOD']
来确定请求方法是POST
还是GET
(除非您不关心,但在您的表单中,请求方法设置为post
所以我假设你这样做)。此外,您不需要将$ _POST变量复制到另一个变量中,只是为了将它们传递给对象的方法。那是浪费。您还可以从代码中的任何范围访问超级全局变量,例如$ _POST(就像一个FYI )。
<?php
require_once('../resources/library/login.class.php');
if(isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD']) == 'POST')
{
if (empty($_POST['user']) || empty($_POST['pass']))
{
echo "Please supply a username and password!";
} else {
$obj_login = new user();
$obj_login->login($_POST['user'], $_POST['pass']);
}
}
?>
<form method="post" action="index.php?page=login.php">
username: <input type="text" name="user"/>
password: <input type="text" name="pass"/>
<input type="submit" name="submit" value="Login"/>
</form>