简体   繁体   中英

SELECT LAST_INSERT_ID() works in Direct MySQL Query but not intermittently PHP QUERY

(Baring in mind when I wrote this it works for a MSSQL database no problems, and now I'm writing the same thing for MySQL using SELECT LAST_INSERT_ID() instead of @SCOPE_IDENTITY) I have a piece of code that enters a company and then the client details for that company. The first SELECT LAST_INSERT_ID() works fine for inserting the company_id from the companies table to the clients table but then throws an error to retrieve the client_id.

Here's the code: //// Set initial SQLs

$SQLINSERTCOMPANY = "insert into companies(company_name,is_organisation,company_regno,company_url,is_active,entry_date)
            VALUES ('$company_name',$is_organisation,'$company_regno','$company_url',1,'$entry_date');";

$SQLINSERTCOMPANYDETAILS = "insert into clients (client_name,client_tel,client_mobile,client_email,client_usern,client_pwdx,mailing_list,savedsession,salt,company_id)
            VALUES ('$client_name','$client_tel','$client_mobile','$client_email','$client_email','$psw',$sign_up,'$PHPSESSIONID','$salt'";

$SQLUPDATECOMPANY = "update clients 
        set company_name = '$company_name',
        is_organisation = $is_organisation,
        company_regno = '$company_regno',
        company_url = '$company_url',
        is_active = 1,
        entry_date = '$entry_date' ";

$SQLUPDATECOMPANYDETAILS = "update clients 
            set client_name = '$client_name',
            client_tel = '$client_tel',
            client_mobile = '$client_mobile',
            client_email = '$client_email',
            client_usern = '$client_email',
            client_pwdx = '$psw',
            mailing_list = $sign_up,
            savedsession = '$PHPSESSIONID' ";

////get the cart for later use if the cart has items
$cart = $_SESSION['cart'];
if($cart){
    $strSQL = "select *
        from category_items 
        where category_item_id IN ($cart) order by category_items.item_code;";          
    $query_get_value = mysql_query($strSQL) or die ('query failed ' . mysql_error());
}   

///// add a new client here
if($_POST['action'] == "add"){  

    ////// Insert new company or just update the details
    if($no_of_client_entry == 0) {

        ////// update clients
        $strSQL1 = $SQLINSERTCOMPANY;

        ////// Insert Client Details
        $strSQL2 = $SQLINSERTCOMPANYDETAILS . ",(SELECT LAST_INSERT_ID())); SELECT LAST_INSERT_ID() as NEWID;";

        $sent_to = $client_email;
        $headers = "MIME-Version: 1.0" . "\r\n";
        $headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
        $headers .= "FROM: TheImageLounge<no-reply>";
        $subject = "Welcome to The Image Lounge";
        $message = "<html><head><title>Error Report</title>";
        $message .= "<style type='text/css'>
                        body{margin: 0 auto;text-align:left;}
                        h1, h2, h3 { margin:10px;padding:10px;background-color:#ccc;}                   
                     </style>";
        $message .= "</head><body>";

        $message .= "<p>Welcome to Website... TBC/p>";
        $message .= "<p>Your Details Are:</p>";
        $message .= "<p>Your username: $client_email<br />";
        $message .= "<p>Your password: " . $_SESSION['client_psw'] . "</p>";
        $message .= "<p>We hope that you will enjoy using our website.</p>";
        $message .= "<p>Thank You and best regards,<br />";
        $message .= "<p>The Website.</p>";
        $message .= "</body></html>";

        $sentOK = mail($sent_to,$subject,$message,$headers);    

    } else { ///// just update the client details

        $client_id = $clients_rows['client_id'];

        ////// update clients
        $strSQL1 = $SQLUPDATECOMPANY . " where client_id = $client_id;";

        ////// Insert Client Details
        $strSQL2 = $SQLUPDATECOMPANYDETAILS . " where client_id = $client_id; SELECT client_id as NEWID from clients where client_id = $client_id;";            

    } ///// End if
    ///echo $strSQL2;
    ///// Run transactions

    echo $strSQL1 . "<br />";
    echo $strSQL2;

    $query_insert_client = mysql_query($strSQL1) or die('' . mysql_error());
    $query_insert_clients = mysql_query($strSQL2) or die('' . mysql_error());   

    $last_client = mysql_fetch_assoc($query_insert_clients);
    $client_id =  $last_client['NEWID'];
    mysql_free_result($query_insert_clients);   

Now when I output the SQL it looks like this:

insert into companies(company_name,is_organisation,company_regno,company_url,is_active,entry_date) VALUES ('Individual',0,'','',1,'2011-06-08 14:16:33');

insert into clients (client_name,client_tel,client_mobile,client_email,client_usern,client_pwdx,mailing_list,savedsession,salt,company_id) VALUES ('Andis','0777','','andrew@com','andrew@com','6be86ab8355979352cdd28bbe7026be71a196936fc1ab0c315629f68c0d5f9162acd20b201a27d0ced0cfd53a8e880a1e8bf3714833ed9c4cbe6d0fe3bf15ca0',0,'8730dfec5ce01b315e1a31007185c486','SALTYDOG',(SELECT LAST_INSERT_ID())); SELECT LAST_INSERT_ID() as NEWID;

But then I get this error

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; SELECT LAST_INSERT_ID() as NEWID' at line 2

If I copy and paste the outputted SQL into MySQL it works fine. So I am not sure what why this fails on the second query. This works fine when working with MSSQL database.

Any help would be grateful.

thanks

andi

you are trying to send multiple queries in one go. from the docs:

mysql_query() sends a unique query (multiple queries are not supported)

you might also want to consider using the mysql_insert_id function instead of issuing a manual query: http://www.php.net/manual/en/function.mysql-insert-id.php

error:

 1. u did not close the insert tag

just do simple change
$addorder = "INSERT INTO table_name () 
                        VALUES  ()"; 
$id = "SELECT LAST_INSERT_ID() as new_id"; 
mysql_query($addorder) or die("not added in to the orders db:<br />".mysql_error()."<br />".$addorder."<hr />"); 
echo($id); 

You can not run 2 queries at the same time with mysql_query() You can however do it with PDO.

To achieve your goal you could completely drop SELECT LAST_INSERT_ID() as NEWID and use mysql_insert_id()

SELECT LAST_INSERT_ID() is a query that runs in mysql, but php only allows you to run one query at a time, thus running the SELECT LAST_INSERT_ID() within your query does not work.

my suggestion is to assign a variable to the value of the SELECT LAST_INSERT_ID() and insert the variable in your query.

It's not the SELECT statement that's wrong, it's the fact that you're doing two statements in one go, which is not allowed by the MySQL library of PHP. Just do two distinct queries to solve the issue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM