Было: Захватить последний вставленный идентификатор - mysql Теперь: где мы должны вызвать последний идентификатор вставки?

0

В этом случае у меня нет доступа к коду, который вставляет данные в данную таблицу. Однако мне нужно добавить связанные дополнительные данные в другую таблицу. Итак, я думал о захвате последнего вставленного ID и оттуда... вставьте связанные данные в эту другую таблицу.

Так как у меня нет доступа к инструкции, я считаю, что mysql last insert id-функция бесполезна.

Все примеры PDO:: lastInsertId, которые я вижу, также привязаны к некоторому "вставленному запросу" перед этим, поэтому не используют также.

Как я могу взять последний вставленный идентификатор в случаях, если бы у нас не было доступа к исходной инструкции insert?

Поток данных: Он начинается здесь: 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();
        }
    });

Итак, теперь найдите "validatecheckout" в index.php И мы нашли это:

Мы не можем читать в этом направлении, что-либо касающееся вставки. Сразу после этого я могу получить, после условного утверждения - правильно?

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 ?
        }

Спасибо заранее, MEM

  • 0
    что вы называете "формой"? HTML-формы ничего не добавляют в базы данных. Каков точный поток данных и каков в нем код вашего подражателя?
  • 0
    @Col. Шрапнель - Ты был прав. Отредактировал мой вопрос.
Показать ещё 6 комментариев
Теги:

3 ответа

3
Лучший ответ

После инструкции insert вы можете запустить другой запрос:

SELECT LAST_INSERT_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" / "В качестве следующего запроса" после выполнения запроса на вставку

Изменить

Пример:

$dbConnection = MyMagic::getMeTheDatabase("please");

$oSomeFunkyCode->createThatOneRowInTheDatabase($dbConnection);

$result = $dbConnection->query("SELECT LAST_INSERT_ID();");
// ... fetch that one value and you are good to go
  • 0
    Но у меня нет доступа к «импульсу после вставки».
  • 0
    @MEM, но сделай себе такой доступ! Как и когда должен вызываться ваш код? через полгода после этой вставки заявление или как?
Показать ещё 4 комментария
0

Если столбец является простым значением auto_incrementing integer, вы можете использовать SELECT MAX(MyAutoincrementingColumn) FROM MyTable. Вы можете рискнуть выбрать строку, которая была вставлена ​​другим пользователем, тем временем, если ваши пользователи не используют транзакции.

  • 0
    Пожалуйста, объясните -1.
  • 0
    Это был не я. Я до сих пор борюсь здесь, и, возможно, MAX - мой единственный вариант здесь, кстати ... потому что я действительно не могу приблизиться к insert, и почти я могу получить его, возможно, если я сделаю еще $ .post ПОСЛЕ document.orderfrm .представить(); Прыгаешь, что я могу получить последний идентификатор вставки оттуда? : /
Показать ещё 2 комментария
-1

Если у вас нет доступа к последней строке INSERT, вы можете сделать подзапрос, чтобы найти последний вставленный id:

select max(id) from <table>
  • 2
    Что происходит, когда 2 пользователя одновременно вставляют строку в разные соединения? Вы можете получить неправильный идентификатор

Ещё вопросы

Сообщество Overcoder
Наверх
Меню