2016-08-27 2 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

Я запустил цикл, чтобы проверить, пытаются ли многие пользователи зарегистрироваться ister с тем же адресом электронной почты в одно и то же время. Как я могу запустить только один экземпляр этого скрипта PHP и позволить другим быть в очереди. Помогите, если я застрял здесь.

+1

Вы пытались запустить инструкцию 'COUNT()'? Также вы используете PDO, и вы не используете привязку для защиты от инъекций '' SELECT username FROM users WHERE email LIKE '$ email' ";' – Rasclatt

+0

Спасибо, отметил ... будет включать его в php-файл –

+0

, как я могу включить count() здесь –

ответ

2

Я хотел бы предложить, чтобы просто добавить UNIQUE по электронной почте:

alter table users add unique (email) 

Это поможет вам избежать условий гонки. Вы также не обрабатываете сценарии смешанного случая, а не обрезаете электронные письма, которые вы должны делать.

+0

Я добавил выше, но строки пропущены при добавлении одного и того же адреса электронной почты. –

+0

Это потому, что ваша вставка теперь выбрасывает исключение, и вы молча их поймаете. Проверьте исключение для правильного кода (893 для нарушения уникального ограничения), затем верните правильный ответ HTTP (например, 409 Conflict). –

Смежные вопросы