我有一个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();
}
}
?>
我从swift文件中访问此脚本:
@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()
}
}
但是在数据库中添加了多个条目:
数据库屏幕截图
我运行循环以检查是否有许多用户尝试同时注册同一封电子邮件。 如何只运行此PHP脚本的一个实例并让其他人进入队列。请帮忙,因为我被困在这里。
答案 0 :(得分:2)
我建议只在电子邮件中添加UNIQUE:
alter table users add unique (email)
这将有助于您避免竞争条件。 你也没有处理混合案例场景,也没有修剪你应该做的电子邮件。