警告:为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;
}
}
}
}
}
答
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) {
1)你应该看看了准备好的语句/参数化查询。 2)'$ UserName'需要引用,因为它是一个字符串3)看看内置的PHP [密码API](http://php.net/password)。 –
@JonStirling这是正确的答案。 –
4)你不要在你的SQL中请求'Password',这样的条件永远不会通过。 5)尽量不要混合和匹配'&&'和'AND'。 6)整理你的缩进。 –