之前:获取最后插入的 id - mysql 现在:我们应该在哪里调用最后插入的 id?
Posted
技术标签:
【中文标题】之前:获取最后插入的 id - mysql 现在:我们应该在哪里调用最后插入的 id?【英文标题】:Was: Grab the last inserted id - mysql Now: Where should we call the last insert id? 【发布时间】:2010-09-27 10:22:58 【问题描述】:事情是这样的,我无权访问将数据插入给定表的代码。但是,我需要将相关的附加数据添加到另一个表中。所以,我正在考虑获取最后插入的 ID,然后从那里......将相关数据插入到另一个表中。
由于我无权访问该语句,我相信mysql last insert id 功能在这里没有用处。
我看到的所有 PDO::lastInsertId 示例也都附加到它之前的一些“插入查询”,所以也没有用。
如果我们无法访问原始插入语句,我如何获取最后插入的 ID?
数据流: 从这里开始:signup.tpl 我们在哪里:
onclick="checkoutvalidate();return false"
在 js 上我们有:
function checkoutvalidate()
$.post("order/index.php", 'a=validatecheckout&'+$("#orderfrm").serialize(),
function(data)
if (data)
...
else
document.orderfrm.submit();
);
所以,现在,让我们在 index.php 中查找“validatecheckout” 我们找到了它:
我们无法阅读有关插入的任何内容。紧随其后的是,条件语句之后 - 对吧?
if ($a=="validatecheckout")
$errormessage = '';
$productinfo = getProductInfo($pid);
if ($productinfo['type']=='server')
if (!$hostname) $errormessage .= "<li>".$_LANG['ordererrorservernohostname'];
else
$result = select_query("tblhosting","COUNT(*)",array("domain"=>$hostname.'.'.$domain,"domainstatus"=>array("sqltype"=>"NEQ","value"=>"Cancelled"),"domainstatus"=>array("sqltype"=>"NEQ","value"=>"Terminated"),"domainstatus"=>array("sqltype"=>"NEQ","value"=>"Fraud")));
$data = mysql_fetch_array($result);
$existingcount = $data[0];
if ($existingcount) $errormessage .= "<li>".$_LANG['ordererrorserverhostnameinuse'];
if ((!$ns1prefix)OR(!$ns2prefix)) $errormessage .= "<li>".$_LANG['ordererrorservernonameservers'];
if (!$rootpw) $errormessage .= "<li>".$_LANG['ordererrorservernorootpw'];
if (is_array($configoption))
foreach ($configoption AS $opid=>$opid2)
$result = select_query("tblproductconfigoptions","",array("id"=>$opid));
$data = mysql_fetch_array($result);
$optionname = $data["optionname"];
$optiontype = $data["optiontype"];
$qtyminimum = $data["qtyminimum"];
$qtymaximum = $data["qtymaximum"];
if ($optiontype==4)
$opid2 = (int)$opid2;
if ($opid2<0) $opid2=0;
if ((($qtyminimum)OR($qtymaximum))AND(($opid2<$qtyminimum)OR($opid2>$qtymaximum)))
$errormessage .= "<li>".sprintf($_LANG['configoptionqtyminmax'],$optionname,$qtyminimum,$qtymaximum);
$opid2=0;
$errormessage .= checkCustomFields($customfield);
if (!$_SESSION['uid'])
if ($_REQUEST['signuptype']=="new")
$firstname = $_REQUEST['firstname'];
$lastname = $_REQUEST['lastname'];
$companyname = $_REQUEST['companyname'];
$email = $_REQUEST['email'];
$address1 = $_REQUEST['address1'];
$address2 = $_REQUEST['address2'];
$city = $_REQUEST['city'];
$state = $_REQUEST['state'];
$postcode = $_REQUEST['postcode'];
$country = $_REQUEST['country'];
$phonenumber = $_REQUEST['phonenumber'];
$password1 = $_REQUEST['password1'];
$password2 = $_REQUEST['password2'];
$temperrormsg = $errormessage;
$errormessage = $temperrormsg.checkDetailsareValid($firstname,$lastname,$email,$address1,$city,$state,$postcode,$phonenumber,$password1,$password2);
$errormessage .= checkPasswordStrength($password1);
else
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
if (!validateClientLogin($username,$password)) $errormessage .= "<li>".$_LANG['loginincorrect'];
if (($CONFIG['EnableTOSAccept'])AND(!$_REQUEST['accepttos'])) $errormessage .= "<li>".$_LANG['ordererrortermsofservice'];
$_SESSION['cart']['paymentmethod'] = $_REQUEST['paymentmethod'];
if ($errormessage) echo $_LANG['ordererrorsoccurred']."<br /><ul>".$errormessage."</ul>";
else
if ($_REQUEST['signuptype']=="new")
$userid = addClient($firstname,$lastname,$companyname,$email,$address1,$address2,$city,$state,$postcode,$country,$phonenumber,$password1);
//DO THE DO INSERT_LAST_ID() here ?
提前致谢, 内存
【问题讨论】:
什么叫“表格”? html 表单不会向数据库添加任何内容。什么是确切的数据流,你想要的代码在其中的位置是什么? @Col。弹片 - 你是对的。编辑了我的问题。 @Col。弹片 - 这个系统有一个名为 checkout() 的 js 函数,它执行:document.orderfrm.submit();但是,我没有看到任何可用的 php,即 checkout() 的调用。我想它在一些加密文件上。 你打算用这个 id 做什么?将其发送回 js 或用于其他一些插入操作? 我在该代码中看到的唯一看起来像是进行某种插入的是addClient
函数,并且该函数似乎返回了新创建的ID。我们在谈论用户表吗?
【参考方案1】:
在插入语句之后,您可以触发另一个查询:
SELECT LAST_INSERT_ID();
这将返回一行,其中一列包含 id。
文档:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
mysql> SELECT LAST_INSERT_ID();
-> 195
这适用于每个连接,因此如果另一个线程写入表中没有问题。但是您的 SELECT 需要在插入查询运行后执行 'RIGHT AFTER'/'As the next query'
编辑
一个例子:
$dbConnection = MyMagic::getMeTheDatabase("please");
$oSomeFunkyCode->createThatOneRowInTheDatabase($dbConnection);
$result = $dbConnection->query("SELECT LAST_INSERT_ID();");
// ... fetch that one value and you are good to go
【讨论】:
但我无法访问“插入语句后动量”。 @MEM 但是让自己拥有这样的访问权限!应该如何以及何时调用您的代码?在这个插入语句之后的半年还是什么? @Col。弹片:不。插入后。但我看不出具体是什么。由于缺乏知识,我发现很难掌握 ajax 调用和大量程序代码。 :s 我想我必须首先找出我可以在哪里调用它,然后按照 MAX 的建议使用 LAST_INSERT_ID() 作为不准确的不便......我看不到插入语句,但我可以看到js 提交表单的函数......但我看不到处理它的 PHP,如果有的话。 :s @MEM 我提供了一个示例,只要您可以在“插入查询”和“下一个查询”之间找到任何位置,您就可以开始了。如果不是,您可能必须在某处创建一些函数返回 id 或以另一种方式传递它,但没有示例,我只是在黑暗中猜测 :) @edorian:非常感谢。请耐心等待。我将尝试了解工作流程并相应地编辑我的问题。【参考方案2】:如果该列是一个简单的 auto_incrementing 整数,您可以使用SELECT MAX(MyAutoincrementingColumn) FROM MyTable
。如果您的用户不使用事务,您可能会冒着选择其他用户同时插入的行的风险。
【讨论】:
不是我。我仍然在这里苦苦挣扎,也许,MAX 是我在这里唯一的选择......因为我真的无法接近插入,如果我在 document.orderfrm 之后再做一个 $.post 的话,我可能会接近它。提交();跳到我可以从那里获得最后一个插入ID? :// 我加了一个赞成票,因为在这种情况下,对我来说,这似乎是相关的。【参考方案3】:如果你无权访问最后的INSERT行,你可以做一个子查询来找到最后插入的id:
select max(id) from <table>
【讨论】:
当 2 个用户在不同的连接上同时插入一行时会发生什么?您最终可能会得到错误的 ID以上是关于之前:获取最后插入的 id - mysql 现在:我们应该在哪里调用最后插入的 id?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL:在没有 auto_increment 的情况下获取最后插入的主键
在codeigniter中多次进入mysql时获取最后插入的'Id'