我有一个简单的脚本放在一起,应该查看数据库并找到一个名称。如果它找到了名称,它应该输出一条消息,说明有人登录。是的,我确实知道我实际上并没有在代码中记录某人。会话必须被调用和创建等。我还没准备好所有这些。
所以这就是我所拥有的。
php:
<?php
try{
$pdo = new PDO('mysql:host=localhost;dbname=interactive', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('SET NAMEs "utf8"');
} catch (Exception $ex) {
$error = 'Failed to connect to the database <p>' . $ex->getMessage() . '</p>';
include '/includes/error.html.php';
exit();
}
$sql = 'SELECT name FROM members';
$result = $pdo->query($sql);
foreach($result as $row)
{
$user[] = array(
'user' => $row['name']
);
}
if (!isset($_POST['username']))
{
$true = TRUE;
}
if (isset($_POST['username']))
{
$username = $_POST['username'];
}
if (in_array($username, $user)){
$username .= ' You are logged in!!';
}
include 'form.php';
。 。 。 这是html: 。 。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf8">
<title>InteractiveForm</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="username">
<input type="submit" value="Login">
</form>
<?php if (isset($_POST['username'])): ?>
<?php echo $username; ?>
<?php endif; ?>
</body>
</html>
我试过在$ user上做一个print _r,它将数据库中的所有名称都显示为关联数组,所以我觉得这很好,但当我查看是否有我的名字时输入输入存在,由于某种原因,in_array找不到它。如果我具体,并输入$ user [0],它将找到我的名字,但否则它不会。
我做错了什么?
非常感谢任何帮助,尤其是深度描述!
答案 0 :(得分:1)
尝试使用prepare
- &gt; fetch
- &gt; execute
并结合下面注明的其他事项:
$sql = 'SELECT name FROM members';
// Try prepare
$result = $pdo->prepare($sql);
// Try execute
$result->execute();
// Loop with while and fetch
while($row = $result->fetch(PDO::FETCH_ASSOC)) {
// no key, just values
$user[] = $row['name'];
}
if(isset($_POST['username'])) {
$username = $_POST['username'];
// Put this inside or else you will throw error on $username
// if $_POST['username'] is not set
if (in_array($username, $user)){
echo strip_tags($username).' You are logged in!!';
}
}
else
// Don't need to do another if, just use else here
$true = true;
另外,正如 Joe Love 所述,你应该在你的sql中使用WHERE
子句而不是创建一个巨大的数组来检查。需要考虑的事情!
编辑:上述情况类似于:
$sql = "SELECT name FROM members where name = :username";
// Try prepare
$result = $pdo->prepare($sql);
// Try execute with a bound parameter to guard against
// SQL injection
$result->execute(array(":username"=>$_POST['username']));
// Presumably, you should only get one hit, so you shouldn't need loop
$row = $result->fetch(PDO::FETCH_ASSOC);
if(isset($row['name'])) {
echo strip_tags($row['name']).' You are logged in!!';
}
else
// Don't need to do another if, just use else here
$true = true;
答案 1 :(得分:0)
n
似乎还有一个额外的usernname
: if (!isset($_POST['usernname']))