Was:获取最后一个插入的id-mysql:我们应该在哪里调用最后一个插入的id?
问题是,我无法访问将数据插入给定表的代码。但是,我需要将相关的附加数据添加到另一个表中。所以,我在考虑抓取最后一个插入的ID,然后从那里。。。将相关数据插入到另一个表中 因为我没有访问该语句的权限,所以我认为mysql的last insert id函数在这里没有任何用处 我看到的所有PDO::lastInsertId示例都附加到它前面的一些“插入查询”,因此也没有任何用处 如果我们无法访问原始insert语句,如何获取案例中最后插入的ID 数据流: 从这里开始:signup.tpl 我们有:Was:获取最后一个插入的id-mysql:我们应该在哪里调用最后一个插入的id?,mysql,lastinsertid,Mysql,Lastinsertid,问题是,我无法访问将数据插入给定表的代码。但是,我需要将相关的附加数据添加到另一个表中。所以,我在考虑抓取最后一个插入的ID,然后从那里。。。将相关数据插入到另一个表中 因为我没有访问该语句的权限,所以我认为mysql的last insert id函数在这里没有任何用处 我看到的所有PDO::lastInsertId示例都附加到它前面的一些“插入查询”,因此也没有任何用处 如果我们无法访问原始insert语句,如何获取案例中最后插入的ID 数据流: 从这里开始:signup.tpl 我们有: o
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 ?
}
if($a==“validatecheckout”){
$errormessage='';
$productinfo=getProductInfo($pid);
如果($productinfo['type']=='server'){
如果(!$hostname)$errormessage.=“”$\u LANG['ordererrorservernohostname'];
否则{
$result=select_查询(“tblhosting”、“COUNT(*)”、数组(“domain”=>$hostname.”、$domain、“domainstatus”=>array(“sqltype”=>“NEQ”、“value”=>“Cancelled”)、“domainstatus”=>array(“sqltype”=>“NEQ”、“value”=>“Terminated”)、“domainstatus”=>array(“sqltype”=>“NEQ”、“value”=>“fraude”));
$data=mysql\u fetch\u数组($result);
$existingcount=$data[0];
如果($existingcount)$errormessage.=“ ”$\u LANG['ordererrorserverhostnameinuse'];
}
如果(!$ns1prefix)或(!$ns2prefix))$errormessage.=“ ”$\u LANG['ordererrorservernonameservers';
如果(!$rootpw)$errormessage.=“ ”$\u LANG['orderrorservernorootpw'];
}
if(is_数组($configoption)){
foreach($configoption作为$opid=>$opid2){
$result=select_查询(“tblproductconfigoptions”,”,数组(“id”=>$opid));
$data=mysql\u fetch\u数组($result);
$optionname=$data[“optionname”];
$optiontype=$data[“optiontype”];
$qtyminimum=$data[“qtyminimum”];
$qtymaximum=$data[“qtymaximum”];
如果($optiontype==4){
$opid2=(int)$opid2;
如果在insert语句之后($opid2),则可以触发另一个查询:
SELECT LAST_INSERT_ID();
这将返回一行,其中一列包含id
文件:
这对每个连接都有效,因此如果另一个线程写入表中,则不会出现问题。但您的选择需要在运行insert查询后的“/”之后执行,作为下一个查询
编辑
例如:
$dbConnection = MyMagic::getMeTheDatabase("please");
$oSomeFunkyCode->createThatOneRowInTheDatabase($dbConnection);
$result = $dbConnection->query("SELECT LAST_INSERT_ID();");
// ... fetch that one value and you are good to go
如果列是简单的自动递增整数,则可以使用SELECT MAX(MyAutoincrementingColumn)从MyTable
。如果您的用户没有使用事务,您可能会冒险选择另一个用户同时插入的行。如果您没有访问最后一个插入行的权限,您可以进行子查询以查找最后插入的id:
select max(id) from <table>
从中选择最大值(id)
但我没有访问“插入语句后”的权限@MEM但你自己要这么做!你的代码应该如何以及何时被调用?在这个insert语句之后半年还是什么?@Col.Shrapnel:不。在插入之后。但我看不出确切的是什么。这是一个混乱的ajax调用和大量的过程代码,我发现由于我缺乏知识而很难掌握。:s我想我必须先开始d我在哪里可以调用它,然后,按照建议使用LAST_INSERT_ID(),因为MAX不太准确……我看不到INSERT语句,但我可以看到提交表单的js函数……但我看不到处理它的PHP(如果有的话):s@MEM我举了一个例子,只要你能在两者之间找到任何一个地方“插入查询”和“下一个查询”您可以开始了。如果没有,您可能需要在某个地方执行一些功能,返回id或以其他方式传递id,但没有示例,我只是在暗中猜测:)@edorian:非常感谢。请耐心等待。我将尝试了解工作流并相应地编辑我的问题。您叫什么?”表单“”?HTML表单不会向数据库添加任何内容。确切的数据流是什么?您想要的代码在其中的位置是什么?@Col.shrapanel-您是对的。编辑了我的问题。@Col.shrapanel-此系统有一个名为checkout()的js函数,它的作用是:document.orderfrm.submit();但是,我在任何可用的php上都看不到该checkout()的调用。我猜它是在一些加密文件上。你打算用这个id做什么?将它发送回js或用于其他插入操作?我在代码中看到的唯一一件事似乎是它做了某种插入,就是addClient
函数,该函数似乎返回了新创建的id。我们是在谈论用户表吗?什么当两个用户在不同的连接上同时插入一行时会出现这种情况?你可能会得到错误的IDIt。不是我。我还在这里苦苦挣扎,也许MAX是我在这里的唯一选择。顺便说一句…因为我真的无法接近insert,而接近insert可能是,如果我在document.orderfrm.submit()之后再做一次$.post;希望从那里获得最后一个插入id?:/我添加了一个投票,因为在这种情况下,对我来说,这似乎是相关的。
select max(id) from <table>