【问题标题】:The sqlsrv_query does not return any result after the checking data function is perform执行检查数据功能后 sqlsrv_query 不返回任何结果
【发布时间】:2021-07-09 03:41:48
【问题描述】:

我正在从事与防止重复输入用户注册数据相关的公司项目任务。我希望防止它们重复的数据是电子邮件(用户无法使用相同的电子邮件注册应用程序)。检查过程中涉及两个页面(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>';}
?>

在头部部分,我还包含下面的 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>

在我输入相同的电子邮件地址进行注册后,它会将我带到注册页面的第二页,这是不允许的。如果在第一页使用重复的电子邮件并将它们阻止到注册页面的第二页,它预计会在第一页显示一条 toastr 消息。

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

【问题讨论】:

    标签: php sql-server sqlsrv toastr


    【解决方案1】:

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

    • 您需要了解sqlsrv_query() 究竟返回了什么。如documentation 中所述,结果是语句资源,或者如果无法创建和/或执行语句,则返回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));
    }
    ...
    ?>
    

    【讨论】:

      【解决方案2】:

      请记住

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

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

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

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

      获取记录看看found的值

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-12
        • 1970-01-01
        • 2021-02-03
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        相关资源
        最近更新 更多