簡體   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