2015-07-13 37 views
0

我正在构建一个简单的登录系统。我遇到的麻烦是从数据库中获取密码哈希。无法从PDO中获取MySQL表的结果

这是我有:

$statement = 'SELECT Pass FROM Emails WHERE Email = "?"'; 
$question = array($email); 
    try { 
     $DB->beginTransaction(); 
     $preparedStatement = $DB->prepare($statement); 
     $preparedStatement->execute($question); 
     $resultArr = $preparedStatement->fetchAll(); 
     print_r($resultArr); 
     $DB->commit(); 
    } catch(\PDOException $ex) { 
     echo "Seriously bad error. "; 
     echo $ex->getMessage(); 
     return false; 
    } 

我的问题是$resultArr总是不包含任何元素。

我知道SQL查询本身起作用,因为我直接在MySQL中测试它。

我相信我必须使用预先准备好的语句,因为我向MySQL发送用户输入信息,并且必须抵御简单的SQL注入攻击。我使用fetchAll()为了确保给定的电子邮件只有一个结果。否则,将会有一个巨大的问题。

这里我的错误是什么?

+1

为什么'$问题=阵列($电子邮件)使用唯一索引邮件;'?为什么不只是'$ question = $ email;'? –

+0

[使用PDO从MySQL获取结果]的可能重复(http://stackoverflow.com/questions/13962789/get-results-from-from-mysql-using-pdo) –

+1

删除双引号? – Hytool

回答

-1

只是为了清洗这个极其多余的代码

$stmt = $DB->prepare('SELECT Pass FROM Emails WHERE Email = ?'); 
$stmt->execute(array($email)); 
$pass = $stmt->fetchColumn(); 

这3条线的缘故是所有你需要运行一个查询并得到结果。

是的,问题只是引号?标记。

为了确保没有其他的你应该在MySQL

-1
$query = 'SELECT Pass FROM Emails WHERE Email = :email'; 
    try { 
     $DB->beginTransaction(); 
     $preparedStatement = $DB->prepare($query); 
     $preparedStatement->bindParam("email", $email, PDO::PARAM_STR); 
     $preparedStatement->execute(); 
     $resultArr = $preparedStatement->fetchAll(); 
     print_r($resultArr); 
     $DB->commit(); 
    } catch(\PDOException $ex) { 
     echo "Seriously bad error. "; 
     echo $ex->getMessage(); 
     return false; 
    }