【问题标题】:Warning: Invalid argument supplied for foreach() -> MySQL Connecting [duplicate]警告:为 foreach() -> MySQL 连接提供的参数无效 [重复]
【发布时间】:2015-12-25 18:51:36
【问题描述】:

我的 foreach 有问题...你能帮我解决这个问题吗?谢谢大佬:)

(将是登录)

警告:在第 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;

    }      
                }   

        }
  }
  }

【问题讨论】:

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

标签: php mysql pdo foreach


【解决方案1】:

Warning: Invalid argument supplied for foreach() 表示 query() 失败并且没有返回数组。

有一些错误,在查询中使用准备好的语句插入原始值,文本/字符串类型需要引号,在您的查询中返回密码不仅是用户名,如果不是名为 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) {

【讨论】:

    猜你喜欢
    • 2014-01-30
    • 2012-11-13
    • 2017-06-01
    • 1970-01-01
    • 2019-09-15
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多