围绕PHP和MySQL的条件竞赛

时间:2015-01-08 05:43:08

标签: php mysql

Hello Everyone我想知道以下两个代码之间是否有任何区别,这意味着如果以下代码中的任何一个代码可能导致竞争条件,那么我们如何检查这个......

$data = mysqli_query($con, "select max(id) from sometable");
$row = mysqli_fetch_array($data);
$id="ABCID";
$uid = $row[0]+1;
$id .= $id.$uid;
mysqli_query($con, "insert into sometable values('$id')");
echo "Your Id is ".$id ;

第二个代码如下:

mysqli_query($con, "insert into  sometable values("//user details")");
$data = mysqli_query($con, "select * from sometable where emailid='$_POST['emailid']'");
$row = mysqli_fetch_array($data);
$id="ABCID";
$uid = $row['id'];
$id .= $id.$uid;
echo "Your Id is ".$id ;

以上两个代码工作正常,但我想知道哪种方法最好..

1 个答案:

答案 0 :(得分:1)

第一种方法是对竞争条件问题持开放态度。如果两个脚本并行运行(Web服务器非常常见的情况)并且基本上执行这些操作会怎么样:

a   = SELECT MAX(..)
b   = SELECT MAX(..)
aid = a + 1
bid = b + 1

他们都生产相同的" uid"。

这就是第二种方法更好的原因;你应该总是让数据库在内部生成id,因为它有专门处理并发问题的机制。


话虽如此,两个例子中都有很多SQL注入漏洞;我希望这只是一个说明性的样本,而不是真正的代码。

相关问题