我最近开始使用php进行编程并取得了一些不错的进展(如果我自己说的话)。现在我偶然发现了一些问题。
我所拥有的是if
个mysql
语句,其中包含query
if(empty($_POST['Email'])){
$error_Email = "No email";
$errors++;
}elseif(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $_POST['Email'])){
$error_Email = "Invalid email";
$errors++;
}elseif ($mysqli->query("SELECT * FROM Members WHERE Email LIKE '".$_POST['Email']."'")->num_rows == 0){
$error_Email = "[TEST] NOT IN DB";
}else{
$error_Email = "[TEST] IN DB";
}
。
me@this.com
所以我的代码有几个问题。可以说[TEST] IN DB
在数据库中。我只想在我完全键入me@this.com
时看到me@
,而不是this.com
,而不是me@this.com
,...仅当我输入{{1}}时。
我的第二个问题是这段代码可以被操作,因为我直接在查询中放置了搜索条件。
所以有一种更安全的方法可以实现我想要的内容,只有在匹配完全匹配的情况下才返回一行。
答案 0 :(得分:1)
我认为你可以用这样的东西让它看起来更干净
$email = $_POST['Email'];
$email_status = validateEmail($email);
function validateEmail($email){
if(empty($email)){
return array("status" => 0, "error" => "Empty email");
}
if(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email){
return array("status" => 0, "error" => "Invalid email");
}else{
$stmt = $mysqli->prepare('SELECT * FROM Members WHERE Email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result();
if(result->num_rows == 0){
return array("status" => 0, "error" => "valid email, but no matches!");
}else{
return array("status" => 1, "error" => "");
}
}
}
稍后在视图中使用
<input type="text" name="email"/>
<?php if($email_status["status"] === 0){
echo $email_status["error"];
} ?>
答案 1 :(得分:1)
我自己想出了一个解决方案。我过早地问过这个问题,但是为了帮助其他可能找到这个问题的人,我不想删除它。
在下面的代码中,我只检查数据库中的电子邮件是否为空并且是否有效以减少请求。我认为这是我的问题的一个很好的解决方案。建议当然仍然受欢迎。
if(empty($_POST['Email'])){
$error_Email = "No email";
$errors++;
}elseif(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $_POST['Email'])){
$error_Email = "Invalid email";
$errors++;
}else{
$stmt = $mysqli->prepare('SELECT * FROM Members WHERE Email = ?');
$stmt->bind_param('s', $_POST['Email']);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows == 0){
$error_Email = "NOT IN DB";
}else{
$error_Email = "IN DB";
}
}