Was:获取最后一个插入的id-mysql:我们应该在哪里调用最后一个插入的id?

Was:获取最后一个插入的id-mysql:我们应该在哪里调用最后一个插入的id?,mysql,lastinsertid,Mysql,Lastinsertid,问题是,我无法访问将数据插入给定表的代码。但是,我需要将相关的附加数据添加到另一个表中。所以,我在考虑抓取最后一个插入的ID,然后从那里。。。将相关数据插入到另一个表中 因为我没有访问该语句的权限,所以我认为mysql的last insert id函数在这里没有任何用处 我看到的所有PDO::lastInsertId示例都附加到它前面的一些“插入查询”,因此也没有任何用处 如果我们无法访问原始insert语句,如何获取案例中最后插入的ID 数据流: 从这里开始:signup.tpl 我们有: o

问题是,我无法访问将数据插入给定表的代码。但是,我需要将相关的附加数据添加到另一个表中。所以,我在考虑抓取最后一个插入的ID,然后从那里。。。将相关数据插入到另一个表中

因为我没有访问该语句的权限,所以我认为mysql的last insert id函数在这里没有任何用处

我看到的所有PDO::lastInsertId示例都附加到它前面的一些“插入查询”,因此也没有任何用处

如果我们无法访问原始insert语句,如何获取案例中最后插入的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 ?
        }
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>