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

Php 警告:为foreach()提供的参数无效->;MySQL连接,php,mysql,pdo,foreach,Php,Mysql,Pdo,Foreach,我的外汇有问题。。。你能帮我修一下这个问题吗?谢谢你,伙计:) (将进行登录) 警告:第33行为foreach()提供的参数无效 if(isset($_POST["UserName"]) AND isset($_POST["Password"])){ $UserName = $_POST["UserName"]; $Password = $_POST["Password"]; $Password = hash("SHA256", $

我的外汇有问题。。。你能帮我修一下这个问题吗?谢谢你,伙计:)

(将进行登录)

警告:第33行为foreach()提供的参数无效

        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;

    }      
                }   

        }
  }
  }

警告:为foreach()
提供的参数无效,这意味着
query()
失败且未返回数组

如果出现一些错误,请在查询时使用准备好的语句而不是put raw values,文本/字符串类型需要引号,在您的查询中返回密码而不仅仅是用户名,如果不是名为
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) {

1) 您应该查找准备好的语句/参数化查询。2)
$UserName
需要引用,因为它是一个字符串3)看看内置的PHP。@JonStirling这是正确的答案。4)您不需要在SQL中请求
密码,因此该条件永远不会通过。5) 尽量不要将
和&
混搭在一起。6) 整理缩进。SQL查询可能导致错误。可能是因为字符串值周围没有引号。(完全开放SQL注入当然也没有帮助,因为从技术上讲,您可以执行用户提供的任何代码。)永远不要假设SQL查询会成功。继续之前,请始终检查错误。