繁体   English   中英

sqlsrv_query 执行检查数据功能后没有返回任何结果

[英]The sqlsrv_query does not return any result after the checking data function is perform

我正在担任与防止重复输入用户注册数据相关的公司项目任务。 我希望防止它们重复的数据是电子邮件(用户不能使用相同的电子邮件注册应用程序)。 检查过程中涉及两个页面(signup.php 和insert.php)。 Signup.php 是用户在所有 6 个页面上输入信息以注册为公司用户的地方。 Insert.php 是将数据插入 sql server 的地方,我已经实现了在将数据插入 sql server 之前进行检查的代码。

    //email validation
    $emailvalid="SELECT Email FROM EcomLogin WHERE Email  = '$_POST[email]'";
    $stmt3=sqlsrv_query($conn,$emailvalid);
    if($stmt3){
        header("location:signup.php?status=error&message=Error when register with email!");
 exit();
        die(print_r(sqlsrv_errors(), true));
    }

同时在signup.php(注册表单)中。 在表单顶部,我包含一个 php 代码,如果第一页信息与数据库记录重复,则该代码会阻止网站将用户引导至第二个注册页面,在这种情况下是电子邮件。

<?php 
if(isset($_GET['status']) && $_GET['status'] == 'error'){
echo '<script>toastr.error("Email has already been registered!");history.replaceState(null, "", location.href.split("&")[0]);</script>';}
?>

在 head 部分,我还包含了下面用于 toast 功能的脚本

 <script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js" integrity="sha512-VEd+nq25CkR676O+pLBnDW09R7VQX9Mdiij052gVCp5yVH3jGtH70Ho/UUv4mJDsEdTvqRCFZg0NKGiojGnUCw==" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.css" integrity="sha512-3pIirOrwegjM6erE5gPSwkUzO+3cTjpnV9lexlNZqvupR64iZBnOOTiiLPb9M36zpMScbmUNIcHUqKD47M719g==" crossorigin="anonymous" />
    <script src="https://cdn.jsdelivr.net/npm/underscore@1.13.1/underscore-umd-min.js"></script>

注册第一页

在 sql server 数据库表中使用重复的电子邮件

在我输入相同的电子邮件地址进行注册后,它会将我带到不允许这样做的注册页面的第二页。 如果在第一页上使用重复的电子邮件并将其阻止到注册页面的第二页,则它希望在第一页上出现一条 toastr 消息。

signup.php 的第二页,在第一页使用相同的电子邮件地址之后

我的编码的任何部分是错误的还是我缺少任何类型的编码来执行 php 文件中的阻止功能? 如果编码正确,我是否需要创建另一个功能来防止网站将用户直接转到第二页? signup.php 将查看另一个 js 文件,该文件首先验证输入字段,然后仅执行 insert.php。

您的代码至少存在以下两个问题:

  • 您需要了解sqlsrv_query()究竟返回什么。 正如文档中所解释的,结果是一个语句资源,或者如果无法创建和/或执行该语句,则返回false 因此,检查if($stmt3) {...}意味着该语句被正确执行,而不是有指定电子邮件的行。
  • 始终使用参数化语句来防止可能的 SQL 注入问题。

如果我正确理解您的问题并且您想检查电子邮件是否已经存在,以下方法是可能的解决方案:

  • 使用您当前的语句并使用sqlsrv_has_rows()检查结果集是否有一行或多行。
  • 更改语句以获取指定电子邮件的行数。

PHP:

<?
...
$sql    = "SELECT Email FROM EcomLogin WHERE Email = ?";
$params = array($_POST[email]);
$stmt   = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
    header("location:signup.php?status=error&message=Error when register with email!");
    die(print_r(sqlsrv_errors(), true));
}   
if (sqlsrv_has_rows($stmt)) {
    header("location:signup.php?status=error&message=Error when register with email!");
    die(print_r(sqlsrv_errors(), true));
}
...

...
$sql    = "SELECT COUNT(*) AS EmailCount FROM EcomLogin WHERE Email = ?";
$params = array($_POST[email]);
$stmt   = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
    header("location:signup.php?status=error&message=Error when register with email!");
    die(print_r(sqlsrv_errors(), true));
}   
$count = 0;
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){
    $count = $row["EmailCount"];
}
if ($count >= 1) {
    header("location:signup.php?status=error&message=Error when register with email!");
    die(print_r(sqlsrv_errors(), true));
}
...
?>

请记住

 $stmt3=sqlsrv_query($conn,$emailvalid);
    if($stmt3){

即使没有这样的电子邮件,也可能返回 TRUE,因为 sql 查询是合法的但不会产生结果也不会产生错误。

您可以在这里计算电子邮件:

$emailvalid="SELECT count(Email) as found FROM EcomLogin WHERE Email  = '$_POST[email]'";

获取记录看看found的值

作为防止重复电子邮件的最后一道防线,您可以在电子邮件上方创建一个唯一索引 有了这个数据库本身拒绝重复

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM