PHP中未定义的变量错误
当我使用这段代码在数据库中检查我的用户名和密码时,会出现上述错误PHP中未定义的变量错误,php,mysql,Php,Mysql,当我使用这段代码在数据库中检查我的用户名和密码时,会出现上述错误 Notice: Undefined variable: username in C:\xampp\htdocs\test_class.php on line 20 Notice: Undefined variable: password in C:\xampp\htdocs\test_class.php on line 20 这只是一个通知,变量在查询中被引用,而不在范围内 在doLogin顶部定
Notice: Undefined variable: username in C:\xampp\htdocs\test_class.php
on line 20
Notice: Undefined variable: password in C:\xampp\htdocs\test_class.php
on line 20
这只是一个通知,变量在查询中被引用,而不在范围内
在doLogin顶部定义$username和$password,并将它们初始化为Null或类似值。然后稍后再检查它们
无论设置了$username和$password,您似乎都在执行查询。你应该做一些更像:
<?php
class test_class {
public function __construct() {
}
public function doLogin() {
include("connection.php");
if (isset($_POST['username']))
{
$username= $_POST['username'];
}
if (isset($_POST['password']))
{
$password= $_POST['password'];
}
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_fetch_array(mysql_query($query));
if(!$result)
{
return 'assa';
}else{
return 'assa112121212';
}
}
}
?>
这两个错误都发生在第20行,我假设这是查询字符串插值。这里的问题是:
范围/引用不一致,这在PHP中很糟糕
你的国际单项体育联合会需要更有序一点。这个错误很小,但如果您处理如下变量,更糟糕的错误会在以后对您造成伤害:
另外:在将变量像热煤一样倾倒到SQL中之前,请先对其进行转义
请参阅我将选择的PDO或mysql\u escape\u字符串
祝你好运 您将要使用错误报告全部^E\u通知;从Sam链接到的页面。通知实际上是不必要的,就像在gcc中使用WALL和WERROR标志一样。这意味着,很可能您的表单尚未提交。您应该确保只使用存在的变量。此外,您应该使用来自用户的输入而不进行验证。例如,请尝试以下操作:
if( isset($_POST['username']) && isset($_POST['password'])){
//create vars, do query
}else{
// Nothing to process
}
此外,您还应该使用$username和$password来避免攻击。您还需要检查数据库是否提供了用户名和密码 也许是这样的
<?php
class test_class {
public function doLogin() {
include("connection.php");
if (isset($_POST['username']) && isset($_POST['password']) {
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * ".
"FROM users " .
"WHERE username = '$username' ".
" AND password = '$password'";
$result = mysql_fetch_array(mysql_query($query));
if(!$result) {
return 'assa';
} else {
return 'assa112121212';
}
} else {
echo "Missing parameter 'username' and/or 'password'";
}
}
}
在将输入放在数据库附近之前,还应先转义输入,方法是使用或再使用一个快乐类和无bug:
public function doLogin() {
include("connection.php");
$username = (isset($_POST['username'])) ? $_POST['username'] : NULL ;
$password = (isset($_POST['password'])) ? $_POST['password'] : NULL ;
if ( $username !== NULL && $password !== NULL ) {
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_fetch_array(mysql_query($query));
/* auth code here */
} else {
return false; // no u/p provided
}
}
我们叫他小鲍比;我认为这些返回值太棒了!永远不要从用户名=“$username”和密码=“$password”的用户中选择*这样的操作!Macbirdie指出,这段代码受到SQL注入攻击。一旦数据库中有用户/密码,请尝试使用用户名“或1=1”登录-通过在sql查询中使用绑定参数而不是附加strings.wrt sql injection来修复此问题。此脚本可能会有所帮助:他修复了此问题,并注意到了一些额外的安全问题。暗杀这篇文章的人应该被禁止,因为他对这篇文章有如此愚蠢的看法。@Mike:在对密码进行哈希运算时使用了salt,这在问题中没有提到。不过答案不错+1@Sam152,谢谢:另外,我现在有1234分,这很酷。-墙上和E_通知是非常必要的。当你是一个白痴时,他们会警告你,这可能会导致一个小时的热调试:对于我来说,为了一点额外的输出,这是值得的。但在这种情况下,E_NOTICE完全停止了一些本来不应该工作的东西。至少有一个程序有墙抱怨。
public function doLogin() {
include("connection.php");
$username = (isset($_POST['username'])) ? $_POST['username'] : NULL ;
$password = (isset($_POST['password'])) ? $_POST['password'] : NULL ;
if ( $username !== NULL && $password !== NULL ) {
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_fetch_array(mysql_query($query));
/* auth code here */
} else {
return false; // no u/p provided
}
}
<?php
class test_class
{
private $post = array();
public function __construct ()
{
}
public function doLogin ()
{
$this->post = $_POST;
include ("connection.php");
if ($this->post['username'] && $this->post['password']) {
$username = $this->post['username'];
$password = $this->post['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_fetch_array(mysql_query($query));
if (! $result) {
return 'assa';
} else {
return 'assa112121212';
}
}
}
}
?>