LASTVAL()の使い方

このQ&Aのポイント
  • バッチで伝票を登録するプログラムを組む際に、TRN_DENPYOのDENPYO_NOを取得する方法としてLASTVAL()を使用したいがうまく行かない。
  • TRN_DENPYOにレコードを追加した後、自動的にカウントアップされるTRN_DENPYOのDENPYO_NOを取得するためにLASTVAL()を使いたいが、表示されない。
  • PostgerSQL8.2とPHP5の環境で、伝票を登録するプログラムを組む中でLASTVAL()を使用してTRN_DENPYOのDENPYO_NOを取得する方法がうまく行かない。
回答を見る
  • ベストアンサー

LASTVAL()の使い方

こんにちは。 現在、バッチで伝票を登録するプログラムを組んでいます。 実施したい内容は、伝票番号を採番し、伝票テーブルと伝票明細テーブルにデータを書き込むと言う物です。 具体的には、以下のテーブルです。 1.TRN_DENPYO  DENPYO_NO  DENPYO_HIDUKE 2.TRN_DENPYO_MEISAI  DENPYO_NO  DENPYO_MAISAI_NO  DENPYO_SYOHINCD ※TRN_DENPYOのDENPYO_NOはserialです。 そこで、TRN_DENPYO にレコードを追加した後、自動的にカウントアップされるTRN_DENPYOのDENPYO_NOを取得するために LASTVAL()を使用したいのですが、うまく行きません。 以下、実際に記述しているSQL文です。 $sql = 'INSERT INTO "TRN_DENPYO"("DENPYO_HIDUKE")VALUES(' . $denpyo_hiduke . ')'; $db->query($sql); $sql = 'SELECT LASTVAL()'; $result =& $db->query($sql); while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) { $denpyo_no = $row['LASTVAL()']; } echo $denpyo_no; この時点で、$denpyo_no の値が表示されると思っているのですが、表示されません。 どなたか教えて頂けませんでしょうか? ちなみに環境は、PostgerSQL8.2 php5を使用しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

LASTVAL()は、マニュアルを見る限りPostgreSQL 8.3から登場しているようですが? $sql = 'SELECT LASTVAL()'; $denpyo_no = $row['LASTVAL()']; 一般的には、 SELECT LASTVAL() AS LV のように別名を付け、 $denpyo_no = $row['LV']; のように別名で参照します。

oops1967
質問者

補足

chukenkenkouさま ご回答ありがとうございます。 別名をつけるのですね! 勉強になりました(というか、こんな質問をして恥ずかしいです) マニュアルを見ると8.1.0に書かれていたので使えると、 実際に試してみても関数関係のエラーにならないので、 これは、私の使い方が悪いのだと思っていました。 ありがとうございました。

関連するQ&A

  • DB_FETCHMODE_ASSOCの時、結合した二つのテーブルから同一名のカラムのレコードを連想配列で取得できないのか??

    よろしくお願いします。 $db =& DB::Connect($dsn, array()); $db->setFetchMode(DB_FETCHMODE_ASSOC); とし、 $res = $db->query("select A_t.ID, B_t.ID from A_t, B_t where A_t.NO = B_t.NO"); のようにsqlを発行した時、 while($row = $res->fetchrow()){ //..... } で、$rowに値を格納しようとしたのですが、 print $row[A_t.ID]; などとすると、 Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting ']' のようなエラーが出てしまいます。 $row[ID]; では、Aテーブルから取得したレコードなのかBテーブルから取得したレコードなのか判別できないのでダメだと思います。 $db->setFetchMode(DB_FETCHMODE_ORDERD); にした場合は、$row[0]、$row[1] の添字配列を使用することによって、AテーブルのIDカラムのレコードもBテーブルのIDカラムのレコードもprintすることが出来ましたが、 $db->setFetchMode(DB_FETCHMODE_ASSOC); では、上記のように結合した両テーブルに同一名のカラム名があると、 その同じ名前を持つカラムから連想配列にデータを渡すことは出来ないのでしょうか?? どなたか詳しい方いらっしゃったらご教授くださると幸いです。 よろしくお願いしますm(_ _)m

    • ベストアンサー
    • PHP
  • MySQLから連続でデータを取るとエラーが

    $sql = "select ホゲ from ホゲホゲ where ホゲホゲホゲ like '%ホゲホゲ%';"; $result = $db->query($sql); if (DB::isError( $result )) { die($result->getMessage()); } while($row = $result->fetchRow()){ echo $row[0]; // 返却データをループ } という感じのプログラムを、テーブル名のみを変更して13行並べているのですが、最後の4つあたりが「DB Error: no such field」というエラーが出て正常に処理されません。 エラーが出ている箇所を上のほうに持ってくると解決するのですが、するとまた下の4つが・・・という感じです。 これって何が原因なのでしょうか?

    • 締切済み
    • PHP
  • foreachで配列を作る

    $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { $data_list[]=array( $array[0]=>$row["$array[0]"], $array[1]=>$row["$array[1]"], $array[2]=>$row["$array[2]"], $array[3]=>$row["$array[3]"], $array[4]=>$row["$array[4]"], $array[5]=>$row["$array[5]"]); } をforeachを使って $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { foreach(~){             //処理     } のようにかきかえたいのですがどうしたらいいでしょうか?foreachをしらべていろろやったのですがうまくいきません。よろしくおねがいします。  ちなみに$data_list[]の配列はArray ( [0] => id [1] => name [2] => address [3] => tel [4] => point [5] => a1 ) Array ( [0] => Array ( [id] => 0 [name] => ここあ [address] => 東京 [tel] => 2 [point] => 2 [a1] => 2 ) [1] => Array ( [id] => 1 [name] => 太郎 [address] => 東京 [tel] => 3 [point] => 5 [a1] => あ ) [2] => Array ( [id] => 4 [name] => 五郎 [address] => 東京 [tel] => 0 [point] => 1 [a1] => あああああ ) [3] => Array ( [id] => 5 [name] => 士郎 [address] => 神奈川 [tel] => 26 [point] => 5 [a1] => ああああああああああ ) …となります。

    • 締切済み
    • PHP
  • PostgreSQLの配列項目のデータ展開の方法がわかりません

    PostgreSQL7.4 + PHP4.3 + Pearの環境です。 配列の項目から要素を展開しようとしたところでハマりました。 $sql = "select * from T"; $result = $db->query($sql); $row = $result->fetchRow(DB_FETCHMODE_OBJECT)) $id = $row->id; $a1 = $row->a1; a1は配列項目で、0,1,2,3 のように要素が入っているのですが、上のソースだと、 $a1[1]='{' $a1[2]='0' $a1[3]=',' $a1[4]='1' のように展開されてしまいました。select文からみるとa1項目は {0,1,2,3} という文字列で入っているのがわかりました。 SQL文が select a1[1],a1[2],a1[3],a1[4] from T; のような形だと正しく取得できますが、実際は配列の要素数が不定なのでこのようなSQLは使えません(長くなるし) 色々調べてみましたが、 $a1='{0,1,2,3}' を $a1[1]='0' $a1[2]='1' $a1[3]='2' $a1[4]='3' に展開する関数が見当たらないみたいです。PostgreSQLの配列項目を扱ったのは初めてなのでとまどっているのですが、簡単にarray変数に展開する方法はないでしょうか。

    • 締切済み
    • PHP
  • PEARを使ったフェッチのしかた。

    いつもお世話になっています。 pear と phpを使ったclassを勉強しており 行き詰った点があったので教えてください。 **** class.php ************************ require_once("DB.php"); class DB_Class{ var $db_object;//DB::connectが入る var $db = "mysql"; var $db_user = "user"; var $db_host = "localhost"; var $db_name = "db_name"; var $pass = "pass"; function DB_Class(){ //コンストラクタ $db_string = $this->db."://".$this->db_user.":".$pass."@".$this->db_host."/".$this->db_name; $this->db_object = DB::connect($db_string); } } **** test.php ******************************** require_once("class.php"); $obj = new DB_Class(); $sql = "select * from TEST_TABLE"; $res = $obj->db_object->query($sql); while($row =$res->fetchRow(DB_FETCHMODE_ASSOC)){ print("<td>".$row["TEST"]."</td>"); } class.phpファイルのメンバ変数 var $db_objectにDB::connectが入っており、 test.phpでfetchRowを使ってDBの内容を 取り出したいのですが、 fetchRowメソッドが見つからないというエラー がでます。 それまでのqueryメソッドまではエラーがなく 呼び出せます。 while($row =$res->fetchRow(DB_FETCHMODE_ASSOC)) ここを $res->$obj->db_object->fetchRowや $res->$obj->$this->DB_object->fetchRowや とにかく色々な方法を試してみたのですが うまくいきませんでした。 どなたかご教授お願い致します。

    • ベストアンサー
    • PHP
  • php pear mdb2に質問です。

    php pear mdb2に質問です。 以下の関数でエラーが出ます。 間違っているところがあれば、回答お願いします。 function product_info($id) { global $db; $res = $db->query("SELECT * FROM product WHERE id=?", array($id)); if ($res != null) { $row = $res->fetchrow(MDB2_FETCHMODE_ASSOC); return $row; } return null; }

    • ベストアンサー
    • PHP
  • PEAR DBでの行取得について

    PEAR::DBにてテーブルの内容は現在下記のようにしておりますが 明示的に例えば2行目のデータを取得したい場合はどのようにすれば良いでしょうか。 $res =& $db->query('select * from shouhin'); while ($row =& $res->fetchRow()) { }

    • ベストアンサー
    • PHP
  • 暗号化されない

    MySQLとPHP4でカード番号を暗号化しようとしています。16桁の数値で暗号化が一文字となっていたり復号化できていないようです。教えてください。 暗号化 UPDATE kaiin SET vmem_card_no= aes_encrypt('1111-1111-1111-1111','happy') where vmem_no=9; $result = mysql_query($sql,$db) or die("失敗しました"); 復号化 SELECT AES_DECRYPT(card_no,'happy') FROM kaiin where kaiin_no =9; $result = mysql_query($sql,$db) or die("失敗しました"); if($row = mysql_fetch_array($result,MYSQL_ASSOC)){  print "card_no=".$row['card_no']."<hr>"; }どこかおかしいでしょうか?教えてください。

    • ベストアンサー
    • MySQL
  • PearDBで項目を1回だけ適切に表示するには?

    何度もお問い合わせし申し訳ありません。本日2度目の問い合わせです。 MySQL + PearDBでコンテンツを作っています。 テーブルのカラムは「ID、都道府県名(pre_name)、都道府県ID(pre_no)、市町村名(p_name)、市町村ID(p_no)、会社名(company).....」です。 完成イメージは下記です。 ●ユーザーは都道府県IDをGETする。 ●都道府県名がヘッダーのタイトルに掲載される。 ●指定した都道府県下の市町村の一覧が表示される ●その一覧にあるリンクをクリックすると、市町村内のホテル一覧に飛ぶ そこで作ったのが下のソースです。 ヘッダーでは、GETされた任意のpre_noに基づき、抽出されたpre_nameを1つだけ表示する。 本文では、GETされた任意のpre_noに基づき、抽出された市町村名を1回だけ表示する(その市町村名にはリンクが張られており市町村ごとのホテルページへ飛ぶことが可能) 【結果】 【ソース1】の場合 市町村名へのリンクが、登録会社の数だけ出現! (表示数を指定しないためここまでは当たり前です) ここから、繰り返しさえ制御できれば完成のはずです。 ここで対策としてfetchOneを使おうとしたのですが、fetchOneはMDBからの機能のようでpearDBでは使えません。 ということで、【ソース2】の表示数を指定することにしました。 $rs=$db->limitQuery("SELECT * FROM reform_co where pre_no = '" .addslashes($_GET['pre_no'])." ORDER BY p_no ASC",1,1); しかし今回の使用用途では何故か Parse error: syntax error, unexpected $end in になります。 どなたか、私の間違いをご指摘いただけますでしょうか? ************************************************************ 【ソース1】(市町村名がホテルの数だけ出現) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <?PHP // サーバー情報接続 require_once '../../config_n_reform.php'; require_once '/usr/share/pear/DB.php'; $db = DB::connect($dsn); if (PEAR::isError($db)) { die($db->getMessage()); } print('接続に成功しました<br>'); $db->query('SET NAMES UTF8'); if (PEAR::isError($db)) { die($db->getMessage()); } //////GET URL表示 if(isset($_GET['pre_no'])){ $sql = "select * from reform_co where pre_no = '" .addslashes($_GET['pre_no'])."'"; } $res =& $db->query($sql); if (PEAR::isError($res)) { die($res->getMessage()); } //////タイトル表示 print<<<EOF <title> EOF; $i = 0; while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { if ($i == 0) { print($row['p_name']); print<<<EOF のホテルのご紹介 </title> </head> <body> EOF; } $i++; //////ホテル名1回のみ表示 $rs=$db->limitQuery("SELECT * FROM reform_co where pre_no = '" .addslashes($_GET['pre_no'])." ORDER BY p_name ASC",1,1); while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { print($row['pre_no']); //市町村へのリンク ここは機能しています //print '<a href="http://hoge.com/index1.php?p_no='; //print($row['p_no'].''); //print '">'; //print($row['p_name'].'<br>'); //print "</a><br><br>"; } $db->disconnect(); ?> </body> </html> **************************************************** **************************************************** 【ソース2】 繰り返しを制御したはずなのですが、エラー <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <?PHP // サーバー情報接続 require_once '../../config_n_reform.php'; require_once '/usr/share/pear/DB.php'; $db = DB::connect($dsn); if (PEAR::isError($db)) { die($db->getMessage()); } print('接続に成功しました<br>'); $db->query('SET NAMES UTF8'); if (PEAR::isError($db)) { die($db->getMessage()); } //////GET URL表示 if(isset($_GET['pre_no'])){ $sql = "select * from reform_co where pre_no = '" .addslashes($_GET['pre_no'])."'"; } $res =& $db->query($sql); if (PEAR::isError($res)) { die($res->getMessage()); } //////タイトル表示 print<<<EOF <title> EOF; $i = 0; while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { if ($i == 0) { print($row['p_name']); print<<<EOF のホテルのご紹介 </title> </head> <body> EOF; } $i++; //////ホテル名表示 $rs=$db->limitQuery("SELECT * FROM reform_co where pre_no = '" .addslashes($_GET['pre_no'])." ORDER BY p_name ASC",1,1); while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { //市町村へのリンク print '<a href="http://hoge.com/index1.php?p_no='; print($row['p_no'].''); print '">'; print($row['p_name'].'<br>'); print "</a><br><br>"; } $db->disconnect(); ?> </body> </html> ********************************************************

  • PearDBでタイトル部分に検索結果を反映したい

    PearDBでコンテンツを作っています。 テーブルのカラムは「ID、都道府県名、都道府県ID、市町村名、市町村ID、会社名」です。 まず、市町村IDで検索した時に指定した市町村にある会社一覧が表示されるように作りました。ここまでは問題ありません。 次に、SEO対策として、市町村名がタイトルに掲載されるようにしたいと考えました。 例  千代田区の検索をした場合、内容は千代田区のホテル一覧が表示され、タグのタイトル部分は 「<title>千代田区のホテル</title>」としたい。 そこで作ったのが下のソースです。 テスト結果 千代田区のIDで検索すると、千代田区のホテルの一覧表は出てくるのですが、タイトルはあきるの市になってしまいます。 あきる野市は、全国の市町村名でソートした場合、一番上に表示される市町村です。 「選択した市町村結果の中から、一番上の文字(検索結果の100件の千代田区の中から、一番上の千代田区を拾ってくる」と記載したかったのですが、「選択した2万件のテーブルの中から一番上の文字(あきる野市)を拾ってくる」になってしまったようです。 問題となるソースは下記です。ASCを外しても結果は変わりませんでした。 【タイトル部分のソース】        →検索地域の如何に関わらず、「あきるの市」が拾われ表示される。 print<<<EOF <title> EOF; $rs=$db->limitQuery("SELECT * FROM reform_co ORDER BY city_name ASC",1,1); while ($row =& $rs->fetchRow(DB_FETCHMODE_ASSOC)) { print($row['city_name']); } print<<<EOF のホテル </title> 【ホテル一覧表示のソース】       →検索地域通りに、千代田区のホテル一覧100件が表示される。 $res =& $db->query($sql); if (PEAR::isError($res)) { die($res->getMessage()); } while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { print($row['pre_name'].'<br>'); print($row['city_name'].'<br>'); print($row['company'].'<br>'); print($row['zip'].'<br>'); print($row['address'].'<br>'); print($row['tel'].'<br>'); print($row['fax'].'<br>'); print($row['free_dial'].'<br>'); print($row['gyousyu'].'<br>'); } 質問です。 タイトル部分について、検索地域の一番上の文字(千代田区100件の中の一番上の文字=千代田区)」を拾ってくるようにしたいです。 どなたか修正箇所をご指摘頂けませんでしょうか? 宜しくお願い致します。 【全ソース】 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <?PHP // サーバー情報接続 require_once '../../config_n_reform.php'; require_once '/usr/share/pear/DB.php'; $db = DB::connect($dsn); if (PEAR::isError($db)) { die($db->getMessage()); } print('接続に成功しました<br>'); $db->query('SET NAMES UTF8'); if (PEAR::isError($db)) { die($db->getMessage()); } $res =& $db->query($sql); if (PEAR::isError($res)) { die($res->getMessage()); } //タイトル表示 print<<<EOF <title> EOF; $rs=$db->limitQuery("SELECT * FROM reform_co ORDER BY city_name ASC",1,1); while ($row =& $rs->fetchRow(DB_FETCHMODE_ASSOC)) { print($row['city_name']); } print<<<EOF のホテル </title> </head> <body> EOF; while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { print($row['pre_name'].'<br>'); print($row['city_name'].'<br>'); print($row['company'].'<br>'); print($row['zip'].'<br>'); print($row['address'].'<br>'); print($row['tel'].'<br>'); print($row['fax'].'<br>'); print($row['free_dial'].'<br>'); print($row['gyousyu'].'<br>'); } $db->disconnect(); ?> PHPおわり </body> </html>

    • ベストアンサー
    • MySQL