警告:为foreach()提供的无效参数() - > MySQL连接

问题描述:

我的问题与我的foreach ...你能帮我修复这个问题吗?第33行警告:为foreach()提供的无效参数() - > MySQL连接

 if(isset($_POST["UserName"]) AND isset($_POST["Password"])){ 
     $UserName = $_POST["UserName"]; 
     $Password = $_POST["Password"]; 
     $Password = hash("SHA256", $_POST["Password"]); 


      $sql = "SELECT UserName FROM Login WHERE UserName=$UserName"; 
    foreach($db->query($sql) as $data) { 
       if ($_POST['UserName'] == $data["UserName"] && $_POST['Password'] == $data["Password"]){ 
        header("Location: index.php"); 
     }else{ 
     $cnt = 1; 
     } 
    }  
       if(!empty($cnt)){ 
     echo "Špatné jméno nebo heslo!"; 
     } 


       if(!isset($UserName)){ 
         $_SESSION["Time"] = 36000; 
      $_SESSION["LogedIn"] = 1; 

    }  
       } 

     } 
    } 
    } 
+5

1)你应该看看了准备好的语句/参数化查询。 2)'$ UserName'需要引用,因为它是一个字符串3)看看内置的PHP [密码API](http://php.net/password)。 –

+1

@JonStirling这是正确的答案。 –

+2

4)你不要在你的SQL中请求'Password',这样的条件永远不会通过。 5)尽量不要混合和匹配'&&'和'AND'。 6)整理你的缩进。 –

Warning: Invalid argument supplied for foreach()意味着query()失败,并没有返回数组的foreach为无效的论点提供():感谢家伙:)

(将登陆)

警告。

有一些错误,使用准备好的语句insted放在查询的原始值,文本/字符串类型需要引号,在您的查询返回密码不仅仅是用户名,如果不是一个名为password永远不会定义一个返回的数组。

正确的代码

$sql = "SELECT UserName, Password FROM Login WHERE UserName = ?"; 
$stmt = $db->prepared($sql); 
if(!$stmt->execute(array($UserName)){ 
    print_r($stmt->errorInfo()); 
    exit; 
} 

$items = $stmt->fetchAll(PDO::FETCH_ASSOC); 
foreach($items as $data) {