[英]Can't get the login for my site to work
这次我更新了代码并使用了mysqli,但没有再出现任何错误,但是现在我无法登录。
<?php
$host = 'my host';
$user = 'me';
$PW = 'my password';
$dB = 'login';
$table = 'members';
$field = 'username';
/* Create a new mysqli object with database connection parameters */
$mysqli = new mysqli($host, $user, $PW, $dB);
if(mysqli_connect_errno()) {
echo "Connection Failed: " . mysqli_connect_errno();
exit();
}
//Grab User submitted information
$name = $_POST['username']; //login name
$pass = $_POST['password']; //login password
/* Create a prepared statement */
if($stmt = $mysqli -> prepare("SELECT f_name FROM $table WHERE $field=?
AND password=?")) {
/* Bind parameters
s - string, b - blob, i - int, etc */
$stmt -> bind_param("ss", $name, $pass);
/* Execute it */
$stmt -> execute();
/* Bind results */
$stmt -> bind_result($result);
/* Fetch the value */
$stmt -> fetch();
if ($result == NULL) {
echo "That combo of username and password is wrong!";
}
else{
echo "Hello " . $result;
}
/* Close statement */
$stmt -> close();
}
/* Close connection */
$mysqli -> close();
?>
我认为它现在可以使用,但是即使我输入了正确的ID和密码,它也没有显示。 我不知道为什么会这么做。
您的SQL查询无效:
"SELECT * FROM members WHERE username = $name"
// will result in
"SELECT * FROM members WHERE username = "
// if name is empty or
"SELECT * FROM members WHERE username = SOMEVALUE"
// if name is "SOMEVALUE".
无论哪种方式,它都是无效的查询字符串,因为SOMEVALUE不会解释为字符串。 您可以尝试以下方法:
$result = mysql_query('SELECT * FROM members WHERE username = "'.mysql_real_escape_string($name).'"');
mysql_real_escape_string()用于转义可能导致问题/不良行为的字符。 查询中的字符串应用引号引起来。
我建议您研究PDO( http://php.net/manual/en/book.pdo.php )并阅读有关mysql注入的信息。
你的问题是
$_POST["usersname"]
没有定义。
当您在查询中使用$name
,请使用此mysql_real_escape_string($name)
。
如果这是您的代码,它将对sql注入造成灾难。 您应该更改为mysqli或PDO
首先,您确实应该使用mysqli。 由于非常可靠的原因,现在不推荐使用标准的mysql_
函数。 如果您的代码是使用mysqli重写的,则它看起来像这样:
<?php
//Connect to database
$con = new mysqli('host', 'user', 'PW', 'dB');
if( $con->connect_errno > 0 ) {
die( 'Unable to connect to dB!' );
}
//Grab User submitted information
$name = $_POST['username']; //login name
$pass = $_POST['password']; //login password
// Make sure you do some validation of the $_POST data here
//Fetch user record from members table where username = inputed name
$statement = $con->prepare("SELECT password FROM members WHERE username = ?");
// Binds $name as a string ('s') parameter to the first ? found in the statement
$statement->bind_param('s', $name);
$statement->execute();
//check to see if that username exists in DB & if not; stop, inform user & ask if he wants to register
if ( $statement->num_rows === 0 ) {
die('User does not exist. <a href="register.php">Click Here to Register</a>');
}
// Bind variables to the result; you need a variable for every column that is selected
$statement->bindResult($dbPassword);
$statement->fetch();
//check password, if pw entered != pw from pulled record then stop & inform user
if ($pass != $dbPassword) {
die('Incorrect password, please try again.');
}
$statement->close();
$con->close();
如果您毕竟不使用mysqli,请知道您编写的代码由于两个问题而无法正常工作:
$name = $_POST["usersname"];
作为usersname
而不是username
$result = mysql_query("SELECT * FROM members WHERE username = $name");
您需要像这样对字符串进行转义: username = " . mysql_real_escape_string( $name ) . "
否则,将不会添加引号,并且字符串将被误解为令牌(此外,还存在SQL注入问题) 除了这些要点,将密码正确存储在数据库中也很重要。 您不能以纯文本形式存储密码,因为这会带来巨大的安全风险。 您需要将密码存储为哈希,哈希是一种单向函数,使得无法(或至少更难)获得密码。 我建议您研究PHP中的Crypt函数 。 与Blowfish算法和合适的盐配合使用,它可以提供出色的安全性,但是有关此问题的更多详细信息不在本文讨论范围之内。 您可以在该页面的评论中找到更多信息。
编辑:更新代码以不使用get_result()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.