我是PHP和MySQL的新手,我使用此代码创建了注册和登录页面。
数据库 dbusers :
以下是 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-&gt; id做什么是“ - &gt;”符号,为什么它指向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)为什么我一直无法登录?在上述数据库中成功创建(和写入)了多个用户,但我仍然得到相同的错误......
提前致谢。
亚历。
答案 0 :(得分:0)
1)
这些行验证是否可以从之前编写的SQL查询中找到登录名。如果是这样,则会将一些值添加到当前会话中。
->
是一个对象操作符 - 它使您可以访问对象方法和变量。在这种情况下,您的对象是$obj
,并且它正在访问该对象中名为id
的变量。
如果您习惯使用其他OOP语言,那么它将等同于这样的结构:
int MyId = MyObject.id;
2)
可能有很多原因。首先,脚本易受SQL注入攻击。其次,您还没有告诉用户是如何创建的。您的SQL查询告诉我们您的密码应该通过MySQL的密码()函数传递 - 您是否以相同的方式创建了用户的密码?
检查SQL查询是否会产生任何结果的一种简单方法是将其回显,复制并粘贴到数据库中(即通过phpMyAdmin)。如果是这样,问题出在您的代码中。
<强>更新强>
Sergiy T.指出在输出发送到浏览器之后已经放置了session_start()。由于您尚未收到有关此事件的警告,因此您可能未启用错误报告。在开发过程中,这应该是开启的
重要的是,session_start()放在任何输出之前(甚至是空格)。
一路上的提示 - 停止使用@
运营商的错误;这可能会在开发过程中揭示您的问题。
再次 - 确保您的脚本不易受SQL注入攻击!
答案 1 :(得分:0)
- &gt;语法用于PHP对象。 id是$ obj的一部分,您可以使用 - &gt;访问它语法。
至于它为什么不起作用,我没有看到任何明显的东西,但是你的代码存在很多问题。对于初学者,您以明文形式存储密码,而您没有清理表单中的输入。这使您对SQL注入存在巨大问题,并且只是对您的代码的两个最简单和最明显的攻击。</ p>
实施身份验证很难,不建议任何单独工作的开发人员使用。没有充分的理由在这里重新发明轮子,有很多好的免费选项可以集成到你拥有的任何项目中。我喜欢symfony框架,但周围还有很多其他框架。
答案 2 :(得分:0)
第一个问题已有答案。
对于第二个问题 - 有可能进行sql注入。可能有人只是选择了带有“或”的用户名或密码。
session_start()
可能出现问题(请查看http://php.net/manual/en/function.session-start.php)
要使用基于cookie的会话,必须在向浏览器输出任何内容之前调用session_start()。