2013-05-21 100 views
1

我有一个小登录脚本。SQLSTATE [HY000]:PHP和PDO的一般错误

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(); 
} 
} 

EDITS:

的index.php

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

从插入上述改为选择查询。现在,我得到新的错误: SQLSTATE [42S22]:列未发现:在1054未知列'pvtpyro“where子句”

+0

$ data和$ sql的值是多少? – ChristopheBrun

+0

@Herode我将我的代码添加到底部 –

+1

请注意我的答案中的编辑。不要使用您提供的SELECT查询,因为SQL注入不安全。 – stef77

回答

7

:与PDO后,您无法读取结果执行INSERT查询。看到这里:http://www.php.net/manual/en/pdostatement.fetch.php#105682

编辑:我想,因为该函数的称为“登录”,你希望有这样的事情:$ sql:“SELECT password FROM users WHERE username =:username”,然后迭代结果与while循环,然后登录用户,如果密码匹配?

编辑2:根据您的编辑提供SELECT查询:请勿使用此查询。你在做什么不是SQL注入证明。永远不要使用用户输入的变量(即$ _POST,$ _GET等),并将它们过滤为SQL查询。请在SO或Google查看“已准备好的声明”一词。 正如您所看到的,由于您忘记在双引号之前和之后放置单引号(撇号),因此MySQL认为您的输入引用了另一列(“pvtpyro”),而不是将该列中的值与字符串进行比较。总是使用“:用户名”,“:密码”语法(带有冒号的冒号),否则您的查询将对您的应用程序不安全并且非常危险。

+0

我打算使用“select”。奇怪现在我不知道为什么之前工作。谢谢:) –

+0

不客气!我不妨添加一个提示,你应该考虑用单个 - >提取替换while循环,因为多次启动会话并多次发送标头位置是没有意义的。当然,如果用户名在数据库中是唯一的,那么就不会出现问题,但是您应该替换while循环来澄清您的意图(我不想交流“这个日志记录在几个用户中”,我想)。 – stef77

+0

啊我明白了。好的,我现在就开始工作,再次感谢你! –

0

在我看来,你没有连接到您的数据库中正确...我今天早些时候有这个错误,这是因为这个原因。无论是或者你有一个不正确的字符串

1

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

编辑:
你调用session_start()while循环,这可能会导致错误里面。把它从循环中取出。编辑2:
你应该真的调试代码。通过将die放在代码的不同部分,在之前输出一些有用的信息(这是不太可取的方式),或者通过使用xdebug和一个IDE,它允许您逐行运行,并查看每一个的确切状态变量等。

+0

完成。虽然同样的错误。 SQLSTATE [HY000]:一般错误 –

+0

哦,我从来没有听说过xdebug。谢谢:) –

1

如果我正确地取下,$data$STH->execute($data);应该是一个数组,即使值为1。所以,你可能会尝试用$STH->execute(array($data));

编辑替换该查询:

更改您的行这样的:根据您最新的编辑

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


$STH = $DBH->prepare($sql); 
$STH->execute($data); 
+0

该数组通过函数 –

+0

传递我更改了上面的代码以显示正在传递的内容。如果通过这种方式传递数组,我还应该添加数组吗? –

+0

是的,只是为了尝试。 '后面的一般错误'是什么?我们需要查看完整的错误代码 – samayo

相关问题