我需要帮助弄清楚为什么这段代码不起作用

时间:2014-12-20 05:25:13

标签: php mysql

我有一个简单的脚本放在一起,应该查看数据库并找到一个名称。如果它找到了名称,它应该输出一条消息,说明有人登录。是的,我确实知道我实际上并没有在代码中记录某人。会话必须被调用和创建等。我还没准备好所有这些。

所以这就是我所拥有的。

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],它将找到我的名字,但否则它不会。

我做错了什么?

非常感谢任何帮助,尤其是深度描述!

2 个答案:

答案 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)

  1. 正如肖恩所指出的,代码中n似乎还有一个额外的usernname
  2. if (!isset($_POST['usernname']))

    1. 请忽略我的无知,但html中的'action'没有任何价值。好吗?