2016-08-27 108 views
1

我有一個PHP腳本,它將一個唯一的電子郵件添加到mysql數據庫。 PHP腳本是:數據庫中的多個條目

<?php 
    try { 
      $pdo = new PDO('mysql:host=localhost;dbname=ourdatabase', 'shyam', 'mypassword'); 
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $pdo->exec('SET NAMES "utf8"'); 
    } 
    catch (PDOException $e) { 
     exit(); 
    } 

    try { 
      $email=$_POST['email']; 
      $sql = "SELECT username FROM users WHERE email LIKE '$email'"; 
      $result = $pdo->query($sql); 
    } catch (PDOException $e) { 
      exit(); 
    } 

    if ($row = $result->fetch()) { 
     $resturant[] = array('status' => "userexists"); 
     echo json_encode($resturant); 
     exit(); 
    } else { 
     try { 
      $sql = 'INSERT INTO users SET 
       email = :mailaddress, 
       password = :password, 
       tagline = :tagline'; 

      $s = $pdo->prepare($sql); 
      $s->bindValue(':mailaddress', $_POST['email']); 
      $s->bindValue(':password', $_POST['password']); 
      $s->bindValue(':tagline', $_POST['tagline']); 
      $s->execute(); 
      exit(); 
     } catch (PDOException $e) { 
      exit(); 
     } 
    } 
    ?> 

我從一個快捷文件訪問這個腳本:

@IBAction func registerClick(sender: AnyObject) { 

    let url:NSURL = NSURL(string: url_to_request)! 
    let session = NSURLSession.sharedSession() 

    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

    let paramString = "email=\(email.text!) & password=\(password.text!) & tagline=\(tagline.text!)" 
    request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding) 
    for index in 1...10{ 
    let task = session.dataTaskWithRequest (request, completionHandler: {data, response, error -> Void in }) 

    task.resume() 
    } 

    } 

但多個條目添加到數據庫中:

DATABSE屏幕截圖

enter image description here

我跑了循環來檢查是否有許多用戶試圖註冊同一時間用同一封電子郵件發送。 如何運行此PHP腳本的一個實例並讓其他人排隊。當我被困在這裏時請幫助。

+1

您是否曾嘗試先運行'COUNT()'語句?你也正在使用PDO,你沒有使用綁定到安全防範注入''SELECT用戶名FROM用戶WHERE電子郵件LIKE'$ email'「;' – Rasclatt

+0

感謝指出......將它包含在php文件中 –

+0

我該如何合併count()here –

回答

2

我會建議簡單地添加獨特的電子郵件:

alter table users add unique (email) 

這將幫助你避免競爭條件。 你也沒有處理混合的情況下,而不是修剪電子郵件,你應該這樣做。

+0

我已經添加了上面的內容,但在添加同一電子郵件時行被跳過 –

+0

這是因爲您的插入現在會引發異常,並且您正在悄悄地捕獲它。檢查正確代碼的異常(893是否違反唯一性約束),然後返回正確的HTTP響應(例如409衝突)。 –