いや何がすげぇと思ったかって
Mysql+PHPの課題やってたらbigint使っちゃって、 LAST_INSERT_ID() しか使えないという状況に陥って、しかも運悪く値が「Array」で返ってきて、プログラミング言語素人の私にとって???な状況、あんたなにやってるんだって変な状態になってしまった。
//オートコミットをオフに設定 $sql = "SET AUTOCOMMIT=0" ; mysql_query($sql) ; //トランザクション開始 $sql = "BEGIN" ; mysql_query($sql) ; $now_date = date('Y-m-d'); $sql = " insert into purchase( customer_code, purchase_date, total_price) "; $sql.= " values('$customer_code', '$now_date', $total_price) " ; $res = mysql_query( $sql ); if ($res) { $sql = "COMMIT"; mysql_query($sql) ; } else { $sql = "ROLLBACK"; mysql_query($sql) ; echo "purchase ROLLBACK (COMMIT ERROR)" ; return -1; } $order_id = mysql_query("SELECT LAST_INSERT_ID()"); $row = mysql_fetch_array($order_id); mysql_free_result($res); return $row['order_id'];
//オートコミットをオフに設定 $sql = "SET AUTOCOMMIT=0" ; mysql_query($sql) ; //トランザクション開始 $sql = "BEGIN" ; mysql_query($sql) ; $query = "SHOW TABLE STATUS WHERE Name = 'purchase'"; $result = mysql_query($query); $row = mysql_fetch_array($result); $now_date = date('Y-m-d'); $sql = " insert into purchase( customer_code, purchase_date, total_price) "; $sql.= " values('$customer_code', '$now_date', $total_price) " ; $res = mysql_query( $sql ); if ($res) { $sql = "COMMIT"; mysql_query($sql) ; } else { $sql = "ROLLBACK"; mysql_query($sql) ; echo "purchase ROLLBACK (COMMIT ERROR)" ; return -1; } return $row['Auto_increment'];
課題をやる環境が環境だったり、言語の勉強をおろそかにしてたりいろいろつっこみどころがあるのはさておいて、なんかAuto_incrementをした時の最終の値をとってこないといけない状態を自分で作り込んでしまったんだけど、それを動かそうとしたプログラムが上手く機能しなくて4時間くらい格闘してた。
で、調べてたら「次に予約されているAuto_incrementの値を予め取ってくる」という逆の発想を見つけて、使ったら普通に動いて感動した。
多分、いろいろ弊害は出てくるだろうけど、こんな方法もあるのかと感動した。