php - 我需要帮助找出为什么这段代码不起作用

标签 php mysql

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

这就是我所拥有的。

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

我做错了什么?

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

最佳答案

尝试使用 prepare->fetch->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 子句,而不是创建一个巨大的数组来 checkin 。需要考虑一下!

编辑:上面的场景看起来像:

$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;

关于php - 我需要帮助找出为什么这段代码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27577252/

相关文章:

php - 在我的 query_posts 语句中使用 GET 是否不好? (WP)

php - 数据库问题,如何存储变化的数据结构

php - 根据 ID 对 Foreach 循环进行排序

Mysql 与 NoSql 快速搜索

javascript - 为什么SQL返回的字符串长度和其他语言返回的字符串长度不一样?

mysql - CROSS JOIN + LEFT JOIN 子查询的替代策略?

php - 包含地点,父地点,纬度,经度等的免费数据库

PHP feof() 在文件结束前返回 true

php - PHP 中的计数排序

java - MacOS 系统上的 MySQL Docker 容器 INFILE/INTO OUTFILE 语句