我已经制作了一个php登录脚本,但它不起作用。
我的代码:
<?php
function clean($str) { /* sanatize strings for databases & security */
$str = trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
if (!empty($_POST['login_admin'])) {
$username = clean($_POST['name']);
$password = clean($_POST['password']);
try {
$dbh = new PDO('mysql:host=localhost;dbname=imedia', "imedia", "imedia");
$statement = $dbh->prepare("SELECT * FROM administratori WHERE username =:username AND parola =:password");
$statement->execute(array(":username" => $username, ":password" => md5($password)));
$row = $statement->fetch();
if ($row) {
session_start("imedia_admin");
$_SESSION['imedia_admin']['logname'] = $row['username'];
$_SESSION['imedia_admin']['password'] = $row['password'];
echo json_encode("success");
} else {
echo json_encode("error");
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}
?>
问题出现在clean
函数中,如果不使用它,我的代码有效,任何人都可以解释一下我的错误吗?
答案 0 :(得分:4)
PDO
会处理它(它会自动转义单引号或为您清理它)。不要使用您自己的clean
函数传递变量。
这是发生了什么。
hello world's day
clean
使其成为hello world''s day
PDO
上再次将其转义为hello world''''s day
hello world's day
不等于hello world''s day
答案 1 :(得分:3)
由于您使用的是预先准备好的声明,并因此将价值出价,因此您无需自己“清理”字符串。
这是使用预准备语句和变量绑定的美女之一;它们是开箱即用的。
mysql_real_escape_string
将转义$_POST['name']
($username
)中的特殊字符,这会在您搜索数据库时导致不匹配(因为使用PDO传递的值被视为“是“)。
mysql_real_escape_string
也已弃用,请访问php.net了解替代方法。