我正在做一个由PHP和MySQL创建的调查。所以问题是,我试图创建一个ResponseID,这是每个提交调查的人的特定ID。因此,创建代码是为了在ResponseID列的现有最大值上添加1。下面是代码:
//Response ID creation
$query = "SELECT max(ResponseID) FROM survey";
$res = mysql_query($query);
$RID = $res+1;
我知道我可以精简它,但这里有一个问题:我已经在表中输入了一个ResponseID为1的项。当我用不同的答案测试调查时,下一个ResponseID是5。它应该是2。所以我再次测试,看下次是否会产生6。
不幸的是,它又产生了5。我让我的PHP专家检查了一下,他说代码是正确的,应该是数据库中的东西。我没有在ResponseID中设置任何东西,除了它是一个int。为什么会产生5?如果有人能告诉我如何去修理它,那就太好了。
我对PHP有点陌生。
$res将是mysql语句句柄,而不是查询结果。您仍然需要从这个$res结果中实际获取一行来访问查询中max()函数的值。
这个句柄可能在内部有标识符#5,这就是为什么你得到"奇怪"的结果。
代码应该是:
$sql = "SELECT MAX(responseID) AS max ...";
$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_assoc($result);
$RID = $row['max'] + 1;
$res是资源,不是查询的值,请阅读使用手册:http://nz.php.net/manual/en/function.mysql-query.php
为什么不使用AUTO_INCREMENT
列而使用mysql_insert_id
检索新值呢?
您需要使用AUTO_INCREMENT
列。问题是,如果PHP脚本的两个实例同时运行(极有可能假设您使用的是像Apache这样的多线程服务器),那么您可能会遇到这样的情况:
|PHP #1 | PHP #2 |
=================================
|Accept client |(waiting) |
|SELECT MAX... |(waiting) |
|Send to MySQL | Accept client |
|(waiting) | SELECT MAX... |
|(waiting) | Send to MySQL |
|Get response 4 |Get response 4 | //Nothing inserted yet, max is still 4
|Try to insert 5| (waiting) |
|Succeeded | (waiting) |
|(waiting) |Try to insert 5|
| ... | Failed! |
使用$row = mysql_fetch_assoc($res)
从查询中获得结果行。
看到作用是()。
你没有得到正确值的原因是因为mysql_query没有返回值,它返回一个资源。
试试这个:
//Response ID creation
$query = "SELECT max(ResponseID) FROM survey";
$res = mysql_query($query);
if($res !== FALSE) $res = mysql_fetch_array($res); // If $res === FALSE, something went wrong
$RID = $res[0] + 1;
我还建议您在ResponseID字段上使用AUTO_INCREMENT,这使您的生活更容易:)
我不确定我是否理解你的问题,但如果你想生成一个特定于每个用户或每个调查发布的响应ID,那么你可以做的就是使用auto_increment的响应ID。每次发布新的调查问卷时,回复id都会增加。还可以使用mysql_insert_id获取最后发布的id。
所以你可以使用
得到最后一个id$last_id = mysql_insert_id ();
你需要把语句放在你的查询后面。这样你就可以得到最后一个id。