我正在创建一个注册页面,在将数据插入我的数据库之前,我需要检查它是否已经存在,但我生成的SQL请求缺少一个'最后。
SELECT * from users where firstname = 'Bob' and lastname = 'Smith' and
username = 'bobsmith' and email = 'bob@test.co.uk' and password = 'testing1
没有'显示密码后。
这是我的PHP代码:
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$query1 = "SELECT * from users where firstname = '" .
$firstname .
"' and lastname = '" .
$lastname .
"' and username = '" .
$username .
"' and email = '" .
$email .
"' and password = '" . $password;
echo "<BR>Running query ... <BR>" . $query1;
$result1 = mysqli_query($cxn,$query1);
$numrows1 = mysqli_affected_rows($cxn);
我已尝试在密码末尾添加引号,例如. $password . '";
,但这会使下面的其余代码变得灰暗,因此无法正常工作。我该如何解决这个问题?
更新:我知道这不是最安全的方式,但这是一个单一的任务,这就是我们打算这样做的方式。
答案 0 :(得分:1)
以下是使用MySQLi预处理语句执行查询的一种方法:
$username = $_POST['username'];
$password = $_POST['password'];
$cxn= mysqli_connect($host, $user, $password, $database);
/* check connection */
if (!$cxn) {
echo mysqli_connect_error();
exit();
}
/* prepare the query */
$stmt = mysqli_prepare($cxn, "SELECT * FROM users WHERE username = ?"); // assuming username is unique
$stmt->bind_param('s', $username);
/* execute prepared statement */
$result = $stmt->execute();
$stmt->store_result();
/* get the user info */
$user = $result->fetch_assoc();
如果您使用 PHP的built-in functions 来处理密码安全性,则可以使用{{{} $password
将存储的密码与password_verify($password, $user['stored_hash'])
进行比较1}}。 确保为散列密码正确设置数据库。
如果您使用的PHP版本低于5.5,则可以使用password_hash()
compatibility pack。
没有必要escape passwords 或在散列之前对它们使用任何其他清理机制。这样做更改密码并导致不必要的额外编码。