我是php新手并尝试编写登录功能。有点卡住并得到错误。 在这里我的功能:
<?php
if(!defined('_VALID_ACCESS')) die('direct access is not allowed.');
include('includes/connect.php');
function login($username, $password)
{
$username = trim($username);
$password = trim($password);
echo $username;
echo $password;
$login_sql = "SELECT * FROM user WHERE user = '".($username)."'
AND pass = '".(md5($password))."'";
$login_result = $mysqli->query($login_sql) or die(mysqli_error());
$row=$login_result->fetch_row();
if($row[0] == 1)
{
return true;
}
else
{
return false;
}
}
?>
connect.php
<?php
$db_name = "coolmates";
$db_server = "localhost";
$db_user = "justron";
$db_pass = "Justron9004";
$mysqli = new MySQLi($db_server, $db_user, $db_pass, $db_name) or die(mysqli_error());
?>
注意:未定义的变量:第14行的.. \ login.php中的mysqli
致命错误:在第14行的.. \ login.php中的非对象上调用成员函数query()
帮帮我。
答案 0 :(得分:4)
您缺少全局标识符。即:
function login($username, $password)
{
global $mysqli;
$username = trim($username);
$password = trim($password);
echo $username;
echo $password;
$login_sql = "SELECT * FROM user WHERE user = '".($username)."'
AND pass = '".(md5($password))."'";
$login_result = $mysqli->query($login_sql) or die(mysqli_error());
$row=$login_result->fetch_row();
if($row[0] == 1)
{
return true;
}
else
{
return false;
}
}
我想补充一点:不要像那样构造SQL,特别是在使用mysqli时。使用绑定参数。这样做:
$login_result = $mysqli->query("SELECT COUNT(1) result FROM user WHERE user = ? AND pass = ?");
$login_result->bind_param("ss", $username, md5($password));
$login_result->execute();
$login_result->bind_result($count);
$login_result->fetch();
if ($count == 1) {
// success
} else {
// failure
}
答案 1 :(得分:4)
问题是“包括”默默地死了。这是PHP的一个很好的功能,包括不会告诉你什么时候不成功。
将“include”替换为“require”,以便在找不到文件时致命地死亡。
另外,请阅读SQL注入和XSS安全 NOW 。您的SQL非常不安全,尝试使用用户名设置登录(字面意思,包括引号)
' or true or '' = '
将立即让潜在的攻击者生活变得更轻松。
select 'hello' = '' or true or '' = '' and 'world' = '1';
你知道返回“true”。