我是PHP的新手,我正在尝试为用户进行登录/会话。我一直在收到错误。任何帮助将不胜感激。
<?php session_start();
include('./config.php');
$email=$_POST['email'];
$email=htmlspecialchars($email);
$Password=$_POST['password'];
$Password=htmlspecialchars($Password);
$ip=$_SERVER['REMOTE_ADDR'];
$result = mysql_query("SELECT * FROM member WHERE email='$email' AND password='$Password'") or trigger_error(mysql_error());
$count = mysql_num_rows($result);
while($row = mysql_fetch_array($result)){
$logfirstname=$row['firstname'];
$loglastname=$row['lastname'];
$logid=$row['id'];
$logemail=$row['email'];
$logphone=$row['phone'];
$logbiz=$row['biz_id'];
$logdate=$row['date_joined'];
$logaddress=$row['address'];
$logsponsored=$row['sponsored'];
}
if ($count>0){
$_SESSION['auth']=1;
$_SESSION['id']=$logid;
$_SESSION['biz']=$logbiz;
$_SESSION['name']=$logfirstname." ".$loglastname;
$sess=$logfirstname." ".$loglastname;
if ($logsponsored === "1") { $_SESSION['sponsored']=1;}
mysql_query($result);
mysql_close();
session_regenerate_id();
$sid=session_id();
include('./config.php');
$loginr=mysql_query("INSERT INTO login (sessionid, memberid, username, IPAddr, LogInTime, Status, name)
VALUES ('$sid', '$logid', '$email', '$ip', NOW(), 'On', '$sess')");
mysql_query($loginr);
mysql_close();
header("Location: controlpanel.php");
exit();
}else{
header('Location: login.php?fail=1');
exit();
}
?>`
答案 0 :(得分:4)
1 - $email=htmlspecialchars($email);
这不是您如何清理SQL查询的文本。这在一定程度上可以防止XSS攻击,但对于SQL注入却没有任何作用。请改用mysql_real_escape_string()
。
2 - while($row = mysql_fetch_array($result)){
可能只会返回一行,所以在循环中执行此操作毫无意义。只需在没有while循环的情况下获取单行。
3 - if ($count>0){
4 - mysql_query($result);
在执行此操作时,$ result是boolean FALSE(原始查询调用失败),mysql查询结果语句句柄。它不是查询字符串,因此您的查询调用将失败
5 - mysql_query($loginr);
请参阅#4 - $ loginr是“false”或语句句柄。为什么查询两次?
答案 1 :(得分:1)
正如你所指导的那样,你是一个新手,我强烈建议你不要在PHP中编写自己的登录/身份验证系统,因为太多事情可能会出错(安全漏洞)。我建议你使用lightopenid,这很容易使用。