我是PHP和MySQL的新手,我用这段代码创建了一个注册和登录页面。
数据库是dbusers,带有:
- id(PK,自动增量,Int(10))
- username(唯一,Varchar(16))
- 密码(Varchar(16))
- 电子邮件(Varchar(45))
以下是register.php的代码(使用了一个不相关的表单):
// dbConfig.php is a file that contains your
// database connection information. This
// tutorial assumes a connection is made from
// this existing file.
include ("dbconfig.php");
//Input validation and the dbase code
if ( $_GET["op"] == "reg" )
{
$bInputFlag = false;
foreach ( $_POST as $field )
{
if ($field == "")
{
$bInputFlag = false;
}
else
{
$bInputFlag = true;
}
}
// If we had problems with the input, exit with error
if ($bInputFlag == false)
{
die( "Problem with your registration info. "
."Please go back and try again.");
}
// Fields are clear, add user to database
// Setup query
$q = "INSERT INTO `dbusers` (`username`,`password`,`email`) "
."VALUES ('".$_POST["username"]."', "
."PASSWORD('".$_POST["password"]."'), "
."'".$_POST["email"]."')";
// Run query
$r = mysql_query($q);
// Make sure query inserted user successfully
if ( !mysql_insert_id() )
{
die("Error: User not added to database.");
}
else
{
// Redirect to thank you page.
Header("Location: register.php?op=thanks");
}
} // end if
//The thank you page
elseif ( $_GET["op"] == "thanks" )
{
echo "<h2> Thanks for registering!</h2> ";
}
// EOF
?>
login.php的代码(用于处理表单@另一个不相关的文件):
<body>
<?php
session_start();
// dBase file
include ("dbconfig.php");
if ($_GET["op"] == "login")
{
if (!$_POST["username"] || !$_POST["password"])
{
die("You need to provide a username and password.");
}
// Create query
$q = "SELECT * FROM `dbusers` "
."WHERE `username`='".$_POST["username"]."' "
."AND `password`=PASSWORD('".$_POST["password"]."') "
."LIMIT 1";
// Run query
$r = mysql_query($q);
if ( $obj = @mysql_fetch_object($r) )
{
// Login good, create session variables
$_SESSION["valid_id"] = $obj->id;
$_SESSION["valid_user"] = $_POST["username"];
$_SESSION["valid_time"] = time();
// Redirect to member page
Header("Location: home.php");
}
else
{
// Login not successful
die("Sorry, could not log you in. Wrong login information.");
}
}
?>
</body>
我的第一个页面上的开始代码home.php:
<body>
<?php
session_start();
if (!$_SESSION["valid_user"])
{
// User not logged in, redirect to login page
Header("Location: login.html");
}
// Display Member information
echo "<p>User ID: " . $_SESSION["valid_id"];
echo "<p>Username: " . $_SESSION["valid_user"];
echo "<p>Logged in: " . date("m/d/Y", $_SESSION["valid_time"]);
?>
<div id="MENUBAR">
<ul id="LINKS" class="MenuBarHorizontal">
<li><a class="MenuBarItemSubmenu">Clientes</a>
<ul>
现在的问题是:
1) 和$_SESSION["valid_id"]=$obj->id做什么是"->"符号,为什么它指向id(@login.php)?
if ( $obj = @mysql_fetch_object($r) )
{
// Login good, create session variables
$_SESSION["valid_id"] = $obj->id;
$_SESSION["valid_user"] = $_POST["username"];
$_SESSION["valid_time"] = time();
2) 为什么我得到一个无效的登录?有多个用户在上面提到的数据库上成功创建(和编写),但我仍然得到相同的错误。。。
提前谢谢。
亚历克斯。
语法用于PHP对象。id是$obj的一部分,您可以使用->语法访问它。
至于为什么它不起作用,我看不出任何明显的东西,但你的代码有很多问题。对于初学者来说,你是以明文形式存储密码,而不是清除表单中的输入。这会让你面临SQL注入的巨大问题,这只是对代码最简单、最明显的两种攻击。
实现身份验证很困难,不建议任何单独工作的开发人员使用。没有充分的理由在这里重新发明轮子,有很多好的免费选项可以集成到你的任何项目中。我喜欢symfony框架,但周围还有很多其他框架。
第一个问题已经有答案了。
对于第二个问题,存在sql注入的可能性。可能有人只是选择了带有"或"的用户名或密码。
session_start()
可能有问题(请查看http://php.net/manual/en/function.session-start.php)
要使用基于cookie的会话,在将任何内容输出到浏览器之前,必须调用session_start()。
1)
这些行验证是否可以从前面编写的SQL查询中找到登录名。如果是,则会将一些值添加到当前会话中。->
是一个对象运算符,它使您能够访问对象方法和变量。在这种情况下,您的对象是$obj
,它正在访问该对象中名为id
的变量。
如果你习惯于使用其他OOP语言,它将等效于这样的结构:int MyId = MyObject.id;
2)
原因可能有很多。首先,脚本容易受到SQL注入的攻击。其次,您还没有告诉用户是如何创建的。您的SQL查询告诉我们您的密码应该通过MySQL的password()函数传递-您是否以相同的方式创建用户的密码?
检查SQL查询是否会产生任何结果的一种简单方法是将其回显、复制并粘贴到数据库中(即通过phpMyAdmin)。如果是这样,那么问题就出在您的代码中。
更新
Sergie T.指出session_start()是在输出发送到浏览器之后放置的。由于您还没有收到这方面的警告,您可能还没有启用错误报告。在开发时,应启用此项。
重要的是,session_start()放在任何输出之前(甚至空格)。
一个提示-使用@
运算符停止压制错误;这可能会揭示你在发展过程中的问题。
再次-确保您的脚本不易受到SQL注入的攻击