0

我有一个小登录脚本。

function login($sql) {
try {                   
    $fbhost = "localhost";
    $fbname = "foodbank";
    $fbusername = "root";
    $fbpassword = "";
    $DBH = new PDO("mysql:host=$fbhost;dbname=$fbname",$fbusername,$fbpassword);
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $STH = $DBH->query($sql);       
    $STH->setFetchMode(PDO::FETCH_ASSOC);

    session_start();        
    if ($row = $STH->fetch()) {
        $_SESSION['username'] = "$row[username]";
        header("Location:index.php");   
    }
} catch(PDOException $e) {
    echo $e->getMessage();
}
}

编辑:

索引.php

$sql = "SELECT username from users where username = ". $_POST['username'] ." AND password = ". $_POST['password'] ."";
login($sql);

上面从插入更改为选择查询。现在我收到新错误: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'pvtpyro' in 'where 子句'

4

4 回答 4

8

根据您的最新编辑:执行 INSERT 查询后,您无法使用 PDO 获取结果。见这里:http ://www.php.net/manual/en/pdostatement.fetch.php#105682

编辑:我想,由于该函数称为“登录”,因此您希望有类似 $sql 的内容:“SELECT password FROM users WHERE username = :username”,然后使用 while 循环遍历结果,然后登录如果密码匹配,在用户中?

Edit2:根据您的编辑提供 SELECT 查询:请勿使用此查询。您正在做的不是 SQL 注入证明。永远不要使用来自用户输入的变量(即 $_POST、$_GET 等)并将它们未经过滤地放入 SQL 查询中。请在 SO 或 Google 上查找术语“准备好的陈述”。如您所见,由于您忘记在双引号之前和之后放置单引号(撇号),MySQL 认为您的输入是指另一列(“pvtpyro”),而不是将该列中的值与字符串进行比较。始终使用 ":username"、":password" 语法(带有前置冒号的语法),否则您的查询将不安全并且对您的应用程序非常危险。

于 2013-05-21T16:54:44.263 回答
1

如果我理解正确,$data $STH->execute($data);应该是一个数组,即使值是一个。因此,您可以尝试将该查询替换为$STH->execute(array($data));

编辑:

将您的行更改为:

$data = array($_POST["username"], $_POST["password"]);
$sql = "INSERT INTO users (username, password) value (?, ?)";


$STH = $DBH->prepare($sql);
$STH->execute($data);
于 2013-05-21T16:35:20.683 回答
1

PDO 的构造函数使用您提供的代码中未定义的 2 个变量 - $fbhost 和 $fbname。

编辑:
您在循环session_start()内调用,这可能会导致错误。while把它从循环中取出。

编辑 2:
您应该真正调试代码。要么通过放入die代码的不同部分,在之前输出一些有用的信息(这是不太受欢迎的方式),要么通过使用 xdebug 和 IDE,这将允许您逐行运行,并查看每个变量的确切状态等等。

于 2013-05-21T16:23:47.370 回答
0

在我看来,您没有正确连接到数据库......我今天早些时候遇到了这个错误,就是因为这个原因。要么你有一个不正确的字符串

于 2013-05-21T16:20:50.610 回答