PHP MySQLI(OOP?)-代码不';我根本不工作
我对OOP(如果这是OOP,我不知道)语言有点陌生,我正在尝试用MySQLi做一个简单的登录过程。问题是,代码不起作用。我无法登录(并且没有显示任何错误),也无法注册新帐户(同样的问题)-这就像代码已经失效或是其他什么 我不确定我是否做对了,但到目前为止,这是我最好的一次因为我是新来的OOP(?) Index.php:PHP MySQLI(OOP?)-代码不';我根本不工作,php,oop,mysqli,Php,Oop,Mysqli,我对OOP(如果这是OOP,我不知道)语言有点陌生,我正在尝试用MySQLi做一个简单的登录过程。问题是,代码不起作用。我无法登录(并且没有显示任何错误),也无法注册新帐户(同样的问题)-这就像代码已经失效或是其他什么 我不确定我是否做对了,但到目前为止,这是我最好的一次因为我是新来的OOP(?) Index.php: <?php if(isset($_POST['submit'])) { $username = my
<?php
if(isset($_POST['submit'])) {
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string(md5($_POST['password']));
$userControl = "SELECT * FROM users WHERE username='".$username."' AND password='".$password."'";
$userControlResult = $mysqli->query($userControl);
if($mysqli->num_rows($userControlResult) > 1) {
$userRow = $mysqli->fetch_assoc($userControlResult);
$dbid = $userRow['id'];
$dbuser = $userRow['username'];
$_SESSION['id'] = $dbid;
$_SESSION['username'] = $dbuser;
header("location: me.php");
die();
} else {
echo "<div class='errorField'>Användarnamnet eller lösenordet är fel!</div>";
}
}
?>
确保您的php设置为在php.ini文件中显示错误。您需要自己对此进行一些研究,但这相当容易。这样,您就可以看到错误并从那里开始。在脚本顶部(在
这将显示脚本中的任何错误,而无需更新php.ini(在许多情况下)。如果您尝试此操作,并且需要更多帮助,请在此处发布错误消息,我将能够提供更多帮助
此外,如果您使用的是$\u会话
,您应该
session_start();
在脚本顶部的下,我建议您更改代码:
ini_set('display_errors', 1);
- 如果您正在使用mysqli,请不要使用
mysql\u real\u escape\u string()
。您不能混合使用这些API
- 无需转义由
md5()
返回的字符串,因为它保证只包含十六进制数字
- 无论如何,不要使用
mysqli\u real\u escape\u string()
,而是使用参数
- 始终检查
prepare()
或execute()
是否返回false;如果返回,则报告错误并退出
- 您可以使用
mysqli\u stmt\u store\u result()
从准备好的语句中获取mysqli结果
- 如果不需要所有列,请不要
选择*
。在这种情况下,您已经拥有$username
,因此真正需要获取的只是id
列
- 无需检查返回的行数,只需启动一个获取行的循环(如果有)。由于您在循环内退出,因此只有当循环获取零行时,才会输出“else”错误子句
- 考虑使用比MD5更强大的密码散列函数。此外,在散列之前在密码中添加一个salt。请阅读
例如:
<?php
if(isset($_POST['submit'])) {
$username = $_POST['username'];
$password = md5($_POST['password']);
$userControl = "SELECT id FROM users WHERE username=? AND password=?";
if (($userControlStmt = $mysqli->prepare($userControl)) === false) {
trigger_error($mysqli->error, E_USER_ERROR);
die();
}
$userControlStmt->bind_param("ss", $username, $password);
if ($userControlStmt->execute() === false) {
trigger_error($userControlStmt->error, E_USER_ERROR);
die();
}
$userControlResult = $userControlStmt->store_result();
while($userRow = $userControlResult->fetch_assoc()) {
$_SESSION['userid'] = $userRow["id"];
$_SESSION['username'] = $username;
header("location: me.php");
die();
}
// this line will be reached only if the while loops over zero rows
echo "<div class='errorField'>Användarnamnet eller lösenordet är fel!</div>";
}
?>
您的if语句正在检查您是否有超过1行—我认为应该是=1
。此外,您也应该在SELECT上使用一个准备好的语句和绑定变量—您使用的是mysqli,因此您可以使用其内置功能使您的代码更安全。若要随身携带,请确保session\u start()
正在某个地方被调用。如果没有,您就无法访问$\u SESSION
变量。为什么要同时使用mysql\u real\u escape\u string()
和mysqli()
呢?您的代码前面有类似的内容吗:$mysqli=new mysqli(“example.com”、“user”、“password”、“database”)
?除了前面提到的所有内容之外,请确保您在数据库中输入的密码已使用MD5进行哈希运算。否则,它将永远找不到您的用户。此外,我建议使用比MD5更强大的工具,例如SHA256。PHP支持这一开箱即用的工具。请检查:这不是真正的答案,更多的是建议赌注适合评论部分。