2012-12-25 43 views
1

由于某些原因,无论参数是什么以及SQL行内部的内容如何,​​以下代码总是返回true。它也引发一个错误“通知:未定义抵消:0在C:\ WAMP \ WWW \线路7社交网络\ INC \ login.inc”,但我看不出有什么不妥:使用fetchAll()从PDO对象中选择

<?php 
function checkAccount($username, $password){ 
    include("INC/dbconnect.inc");/*"INC/dbconnect.inc" is <?php $pdo = new PDO("mysql:host=localhost;dbname=socialnetwork","user","123"); ?>*/ 
    $select = $pdo->prepare("SELECT id,password FROM users WHERE user_username = :username"); 
    $select->execute(array(':username'=>$username)); 
    $q_rows = $select->fetchAll(); 
    if($q_rows[0][0]/*the ID of the user, it should always be greater than 1, if not then the username does not exist*/ > 0 && $q_rows[0][0] != null){ 
     if($q_rows[0][1]/*the password of the user*/ == $password) 
      return true; 
     else 
      return false; 
    } 
    else 
     return false; 
    $pdo=null; 
} ?> 

人请告诉我什么是错的?我在代码里面评论了我遇到的问题,并且我尝试了正常的$select->fetch()而不是$select->fetchAll()无济于事。在发布之前,我已经阅读了PDO(http://php.net/manual/en/pdostatement.fetchall.php)。这里是我的文件http://pastebin.com/YCkrRivs的其余部分,谢谢。

+0

确保你真正了解的回报 “假” 之间'的区别;'和'返回false;'。 – goat

回答

0

如果数据库没有返回任何行,那么将不会有条目$q_rows[0]。因此,当您尝试检索不存在的数组中的行时,未定义的偏移量为0。对于不存在的用户,您的“ID”不是> 0不是正确的摘要。

采样返回看起来是这样的(如果你的print_r()倒是它)

用户存在:

$q_rows = Array (
    [0] => Array ( 
    [id] => 1, 
    [password] => 'dno23n3io3' 
) 
) 

没有用户存在:

$q_rows = Array (
) 

你应该这样做:

if(size($q_rows) > 0) { 
    //Handle user present 
} else { 
    //Handle no user present 
} 
+0

我已经尝试了这一点,并尝试了print_r()来找出什么是错误的,但由于某种原因print_r()不会写任何东西到页面,现在所有的函数都会返回false(修复“true”和“false”返回... derp!) – Spectrewiz

+0

我做了一些调试,发现问题。我认为sha512始终保持32位数字,但事实并非如此。因此,我表中的所有数字都不匹配密码输入中较长的加密。修复哈希后,这工作谢谢:) – Spectrewiz

0

你不需要t Ø使用fetchAll,只需使用fetch

$q_row = $select->fetch(); 

if ($q_row) { 
    // do your logic ... 
} 

你正在返回字符串"true"/"false",而不是布尔值,你应该使用true/false代替。

更简单,你可以只是做象下面这样:

$q_row = $select->fetch(); 
return $q_row && $q_row[0] > 0 && $q_row[1] === $password; 
+0

也是一个很好的答案,因为你不应该有多个用户使用相同的用户名,所以'fetchAll'没有价值。我不确定崩溃的回报是否特别透明,但它是整洁的.. –

+0

这是一个很好的答案,但不幸的是,即使添加count($ q_row)> 0'并取出$ q_row [ 0]> 0'作为[Philip Whitehouse](http://stackoverflow.com/users/1052931/philip-whitehouse)在他之前的回答中说。现在所有的函数都返回false(在修复“true”和“false”返回... derp!之后) – Spectrewiz

+0

@Spectrewiz代码中可能存在一些其他问题,请执行一些调试工作。 – xdazz