Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和MySQL中的竞争条件_Php_Mysql - Fatal编程技术网

PHP和MySQL中的竞争条件

PHP和MySQL中的竞争条件,php,mysql,Php,Mysql,大家好,我想知道以下两个代码之间是否有任何区别,这意味着如果以下代码中的任何一个可以导致绕线情况,那么我们如何检查这一点 $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 valu

大家好,我想知道以下两个代码之间是否有任何区别,这意味着如果以下代码中的任何一个可以导致绕线情况,那么我们如何检查这一点

$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 ;

上面的两个代码运行良好,但我想知道哪种方法最好。

第一种方法存在竞争条件问题。如果两个脚本并行运行(对于web服务器来说是非常常见的场景),并且基本上执行以下操作,该怎么办

a   = SELECT MAX(..)
b   = SELECT MAX(..)
aid = a + 1
bid = b + 1
它们都产生相同的“uid”

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



话虽如此,两个示例中都存在大量SQL注入漏洞;我希望这只是一个说明性的示例,而不是真正的代码。

两者都对SQL注入开放;所以,没有区别。嗯,我在寻找其他答案,与安全性无关。首先是选择查询,其次是更新查询,两个代码都不安全。我想知道第一个代码是否会在生成唯一id时产生冲突,或者不好听。顺便说一句,你的问题被否决的主要原因之一是它对未来的访问者没有帮助。想象一下,有人试图为同样的问题找到答案,然后在谷歌上搜索。他们找不到这个问题,因为它的标题和描述都很糟糕。考虑到这种情况,试着提出一个更好的问题;更好地描述您的问题,而不需要任何人详细阅读代码来理解您的问题。