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 ;
以上两个代码工作正常,但我想知道哪种方法最好..
答案 0 :(得分:1)
第一种方法是对竞争条件问题持开放态度。如果两个脚本并行运行(Web服务器非常常见的情况)并且基本上执行这些操作会怎么样:
a = SELECT MAX(..)
b = SELECT MAX(..)
aid = a + 1
bid = b + 1
他们都生产相同的" uid"。
这就是第二种方法更好的原因;你应该总是让数据库在内部生成id,因为它有专门处理并发问题的机制。
话虽如此,两个例子中都有很多SQL注入漏洞;我希望这只是一个说明性的样本,而不是真正的代码。