我的登录脚本有几个问题。它只是指向一个没有错误的空白页面。
mysqli
,我是否需要使用?
或$username
和$password
我的疑问?$stmt -> fetch()
发生的任何事情;我用它了吗?$result=mysqli_query($stmt);
:这个$result
变量是否包含用户名和密码?mysqli_num_rows($result)
如何运作? <?php
function clean($str)
{
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
//Sanitize the POST values
$username = clean($_POST['username']);
$password = clean($_POST['password']);
/* Create a new mysqli object with database connection parameters */
$mysqli = mysqli_connect('localhost', 'root', '', 'draftdb');
if(mysqli_connect_errno())
{
echo "Connection Failed: " . mysqli_connect_errno();
exit();
}
/* Create a prepared statement */
if($stmt = $mysqli -> prepare("SELECT Login_ID, Login_PW,
FROM login
WHERE Login_ID='$username' AND Login_PW ='".md5($_POST['password'])."'"))
{
/* Bind parameters
s - string, b - boolean, i - int, etc */
$stmt -> bind_param("ss", $username, $password);
/* Execute it */
$stmt -> execute();
/* Bind results */
$stmt -> bind_result($username, $password);
/* Fetch the value */
while ($stmt->fetch())
{
$result=mysqli_query($stmt);
//Check whether the query was successful or not
if($result)
{//main if
if(mysqli_num_rows($result) == 1)
{
//Login Successful
session_regenerate_id();
$login = mysqli_fetch_assoc($result);
$_SESSION['SESS_MEMBER_ID'] = $login['Login_ID'];
//$_SESSION['SESS_FIRST_NAME'] = $login['firstname'];
//$_SESSION['SESS_LAST_NAME'] = $login['lastname'];
session_write_close();
header("location: member-index.php");
exit();
}
else {
//Login failed
header("location: login-failed.php");
exit();
}
}
else
{
die("Query failed");
}
}//main if close
/* Close statement */
$stmt -> close();
}
/* Close connection */
$mysqli -> close();
?>
答案 0 :(得分:1)
当您使用预准备语句时,通常不应将变量替换为语句。你把 ?占位符,然后使用$stmt->bind_param()
将这些占位符与变量相关联。
使用$stmt->fetch()
后,您可以引用与$stmt->bind_result
绑定的变量来访问SELECT的结果。
如果您使用的是准备好的声明,则根本不应该使用mysqli_query
。要回答有关其工作原理的问题,$result
不包含实际数据。您可以调用$row = mysqli_fetch_assoc($result)
之类的内容将用户名和密码输入$ row。
您应该使用$stmt->num_rows()
答案 1 :(得分:1)
我试图解决你的每一个问题,但是他们混在一起,我不能只给你一个答案。所以我冒昧地修改你发布的脚本,我相信它会使它工作。也许还需要一些额外的调整。请查看我在线添加的评论。另外,请查看以下php文档页面,了解有关以面向对象形式使用mysqli函数的更多信息:
http://www.php.net/manual/en/mysqli-stmt.num-rows.php
http://www.php.net/manual/en/mysqli-stmt.execute.php
http://www.php.net/manual/en/mysqli-stmt.bind-result.php
http://www.php.net/manual/en/mysqli-stmt.bind-param.php
我没有测试它,我可能有一两个错字,但这是我尝试改进你的脚本。让我知道你的想法:
<?php
function clean($str)
{
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
//Sanitize the POST values
$username = clean($_POST['username']);
$password = clean($_POST['password']);
/* Create a new mysqli object with database connection parameters */
$mysqli = mysqli_connect('localhost', 'root', '', 'draftdb');
if(mysqli_connect_errno())
{
echo "Connection Failed: " . mysqli_connect_errno();
exit();
}
/* Is your username the same as the login_id? If not you need to change this query's where to use the username column not the login_id. */
/* Create a prepared statement */
if($stmt = $mysqli -> prepare("
SELECT Login_ID, firstname, lastname
FROM login
WHERE Login_ID=? AND Login_PW=?
"))
{
/* Bind parameters
s - string, b - boolean, i - int, etc */
$stmt -> bind_param("ss", $username, md5($password));
/* Execute it */
$result = $stmt -> execute();
//Check whether the query was successful or not
if ($result === false) {
die("Query failed");
}
/* Bind results to variables that will be used within the fetch() loop. */
$stmt -> bind_result($login_id, $firstname, $lastname);
/* Check the number of rows returned. */
if ($stmt->num_rows !== 1) {
//Login failed
header("location: login-failed.php");
exit();
}
/* Iterate over the results of the query. */
while ($stmt->fetch())
{
//Login Successful
session_regenerate_id();
/* We can use $login_id, $firstname and $lastname cause we binded the result to those variables above. */
$_SESSION['SESS_MEMBER_ID'] = $login_id;
//$_SESSION['SESS_FIRST_NAME'] = $firstname;
//$_SESSION['SESS_LAST_NAME'] = $lastname;
session_write_close();
header("location: member-index.php");
exit();
}//main if close
/* Close statement */
$stmt -> close();
}
/* Close connection */
$mysqli -> close();
?>
答案 2 :(得分:0)
我认为,问题在于你的代码的这部分
while ($stmt->fetch())
{
$result=mysqli_query($stmt);
你已经执行了该声明,并将其取出;您无需再次查询。 。 。 。我不熟悉mysqli,因为我使用PDO,但我认为既然您将结果绑定到$ username,$ password,您可以使用这些绑定变量访问返回的值。
while ($result = $stmt->fetch())
{
if($result->num_rows == 1)
{
$_SESSION['SESS_MEMBER_ID'] = $result['LOGIN_ID']
//////or $_SESSION['SESS_MEMBER_ID'] = $username
我想你可以这样继续下去。 。
答案 3 :(得分:0)
对不起朋友我对mysqli了解不多。 但如果你愿意的话,可以用mysql轻松完成。
顺便说一句,对于你的第3个问题,
如果您的搜索条件存在任何匹配记录,则$result=mysqli_query($stmt);
仅返回资源ID。并且mysqli_num_rows($result);
将返回有多少资源ID可用于该条件。用户名和密码将仅在mysqli_fetch_array($result);
之后返回,这将使数据库将记录作为这些资源ID的数组获取。
希望你理解...... :))