我对新的PHP 5.5感到困惑,对于给您带来的任何不便,我深表歉意。
我正在尝试从任何登录信息中获取信息,例如,如果我使用电子邮件登录,我希望该网站获取我的名字并执行“欢迎,真嗣!”。
$conn = mysqli_connect('localhost','root','');
$db = mysqli_select_db($conn , 'session_start');
$user = $_POST['user'];
$pass = $_POST['pass'];
$query = mysqli_query($conn , "SELECT * FROM `info_table` WHERE '$user' = `user` AND '$pass'=`password`") or die(mysqli_error($conn));
$rows = mysqli_num_rows($query);
if($rows == 1){
#$query2 = mysqli_query($conn , "INSERT INTO `who_logged` (`name`) VALUES ('$user')") or die(mysqli_error($conn));
#$rows = mysqli_num_rows($query);
session_start();
$_SESSION['username'] = $_POST['user']; // store username
$_SESSION['password'] = $_POST['pass']; // store password
$query2 = mysqli_query($conn ,"SELECT `name` FROM `info_table` WHERE '$user' = `user`") or die(mysqli_error($conn));
$result = mysqli_num_rows($query2);
while ($row = mysql_fetch_assoc($result)) {
$_SESSION['name'] = $row['name'];//I thought to try setting the name to the Session variable, but does not work
}
header('Location: next_page.php');
exit();
}else{
echo "Wrong username or password.";
}
我尝试将名称设置为会话变量,但如果有更有效的方法请说出来! (此当前代码有效,但会话名称设置除外。
答案 0 :(得分:4)
您的列和值按顺序混合。
首先是列,然后是值,而不是相反。
更改两者:
WHERE '$user' = `user` AND '$pass'=`password`
为:
WHERE `user` = '$user' AND `password`='$pass'
另外,你正在混合使用MySQL API。那些不同的API不会相互混合。
将mysql_fetch_assoc
更改为mysqli_fetch_assoc
我注意到你正在使用会话;确保session_start();
确实已加载。
将错误报告添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告应仅在暂存时完成,而不是生产。
另外,将or die(mysqli_error($conn))
添加到mysqli_query()
您现有的代码向SQL injection开放 使用prepared statements或PDO with prepared statements,它们更安全。
修改强>
请尝试以下方法,它将帮助您入门。请阅读关于纯文本密码的使用/存储的脚注。
旁注:我删除了$_SESSION['password'] = $pass; // store password
不要这样做,这是不安全的。
另外,请不要在下面的PHP上面放置任何内容,例如HTML等,否则,您将收到有关已发送标头的警告。
<?php
$conn = mysqli_connect('localhost','root','');
$db = mysqli_select_db($conn, 'session_start');
$user = stripslashes($_POST['user']);
$user = mysqli_real_escape_string($conn,$_POST['user']);
$pass = stripslashes($_POST['pass']);
$pass = mysqli_real_escape_string($conn,$_POST['pass']);
$query = mysqli_query($conn , "SELECT * FROM `info_table`
WHERE `user` = '$user' AND `password`='$pass'")
or die(mysqli_error($conn));
$num_rows = mysqli_num_rows($query);
if($num_rows > 0){
session_start();
// it's not really needed
// we are pulling it from $row['user'] in the while loop
// and setting it to $_SESSION['username']
// $_SESSION['username'] = $user; // store username
while ($row = mysqli_fetch_assoc($result)) {
$_SESSION['username'] = $row['user'];
}
// for testing only. Do not use with header
// echo $_SESSION['username'];
header('Location: next_page.php');
exit();
}
// do not place any echos here, only the else statement
else{
echo "Wrong username or password.";
}
<强> next_page.php 强>
<?php
session_start();
if(isset($_SESSION['username'])){
echo $_SESSION['username'];
}
else{
echo "Not logged in.";
}
<强>脚注强>
强烈建议您不要以纯文本格式存储密码。
访问以下网站:
它包含完整的注册/登录/验证系统,以及使用PDO with prepared statements和PHP password_hash()
功能,强烈建议使用。