Revでアクセス!

手順は次の通り。

  1. revdb_connectでMySQLサーバーからconnection IDを取得する。
  2. そのconnection IDを使って、MySQLサーバーに対しSELECT、INSERT、UPDATEなどのMySQLコマンドを実行する。
  3. ( SELECTの場合、さらにrevdb_columnbynumberでデータを抽出する。)

 

Connectin IDを取得

以下のスクリプトは、66.242.17.155というサーバーにアクセスし、bankというデータベースに、kenというユーザー名と15073D2025eというパスワードで接続し、返されたIDをtIDに格納するためのものである。

local tID

on connectDB
  put revdb_connect("mysql", "66.242.17.155", "bank", "ken", "15073D2025e", empty, empty) into tID
end connectDB


function getConnection,
  return tID
end getConnection

tIDはMySQLと交信する度に使うので、Local宣言をして、getConnection関数でどのボタンやカードからでもtIDを呼び出せるようにしている。(そのためにはこのスクリプトはスタックに書かれるべきである。)

 

MySQLコマンドの実行 データの書き込み

Connection IDを取得したら、そのIDを使ってMySQLに新規レコードを作ったり、レコードを閲覧することが可能になる。

データベースのレコードは、重複しない固有のシリアル番号を振って、その番号で管理するのが普通である。
すると、データを新たにデータベースに書く場合、何らの方法で、データベース上のレコードの既存のシリアル番号と重複しない番号をみつけなれければならない。

以下のスクリプトはproductというテーブルがMySQLにある、という前提のもの。このテーブルは製品の写真とその価格を記録するシンプルなものである。productテーブルには、product_id、p_image、p_priceの三つのカラムしかない。
product_idのデータ型はVARCHAR(10)としましたが数字専用である。これがシリアル番号で、p_imageはBLOB、p_priceはDECIMAL(9,0)で価格を入れている。
一方、Revのスタックは カード一枚で、画像が張ってある"tPoto"というimageと、その価格を入れるための"Price"フィールド、そして以下のスクリプトを記入したボタンがひとつある。

on mouseUp
  put getConnection() into ConnectionId

  put img "tPhoto" into pImage
  put fld "Price* into ProductPrice

  put "SELECT MAX(product_id) from product" into tQuery
  put revdb_querylist(,,ConnectionId,tQuery) into new_product_ID
  add 1 to new_product_ID

  put "INSERT INTO product(product_id, p_image, p_price) VALUES(:1, :2, :3)" into tQuery
  get revdb_execute(tConnectionId,tQuery,"new_product_ID","*bpImage","ProductPrice")

  if it is a integer then answer "OK!"
end generateList

一行目で接続時のIDを取得、二行目と三行目でカードにユーザーが入力した画像情報と価格の数字をそれぞれpImageとProductPriceに格納している。

次の三行は、データベース上の既存のシリアル番号(product_idカラムに格納されている数字)と重複しない数字を見つけるためのものである。すなわち、productテーブルのproduct_idカラムの中のもっとも高い数値を抽出し、それに1を加えている。

準備ができたら、INSERT文をrevdb_executeで実行し、データベースに新規をレコードを作成する。画像データの場合、revdb_execute文の中で冒頭に"*b"をつけていることに注目。

注意しなければならないのは、productテーブルのレコード数がゼロである場合、SELECT MAX(product_id)文は機能しないことである。従って最初はphpMyAdminなどでproduct_idが0であるダミーのデータをあらかじめ作っておく必要がある。

 

MySQLコマンドの実行 データの閲覧

以下はカード上のボタンに書いたスクリプトである。productというテーブルにアクセスして、一番最初のレコードのカラムのデータを"theList"フィールドに格納することを目的とする。

on generateList
  put getConnection() into tId

  put "SELECT * from product ORDER BY product_id" into tQuery
  put revdb_queryblob(tId,tQuery) into tResult

  repeat with x =1 to revdb_recordcount(tResult)
   get revdb_columnbynumber(tResult , 1, "Pro_ID")
   put Pro_ID into line x of fld "theList"
   get revdb_movenext(tResult)
  end repeat
end generateList

最初の行で、前述のConnection IDを取得、その次の行はMySQLのコマンドをtQueryに格納している。ここではbankというデータベースのproductテーブルにあるすべてのデータを選択している。
三番目のrevdb_queryblobでtQueryのコマンドを実行し、返された数字をtResultに格納している。

四番目のrevdb_recordcountはtResultを使って、選択したデータが何件あるかをカウントしている。これはレコードの数だけループする必要きがあるからである。

ループ文の中では、一番目のデータの一番目のカラムのデータをPro_IDに格納している。ループ文の最後のrevdb_movenextでtResultの値をひとつ繰り上げ、二番目のデータの一番目のカラムのデータをPro_IDに収納する。

カラムが20とか30とかある場合、上記のSELECT * from...ですべてのカラムを選択するとスクリプトの効率がよくない。カラムがたくさんある場合、次のように記述してもよい。

  put "SELECT photoc, price, mcode, id, yksales from product ORDER BY product_id" into tQuery
  put revdb_queryblob(tId,tQuery) into tResult

photoc, price, mcode, id, yksalesはすべてproductテーブルのカラム名だが、MySQL上のproductテーブルにおける順番とは一致していない。このようにして選択したレコードは、そのSELECT文で記述した順番にRevスクリプトで扱うことができる。

   get revdb_columnbynumber(tResult , 1, "tImage")
   get revdb_columnbynumber(tResult , 2, "tPrice")
   get revdb_columnbynumber(tResult , 5, "YokohamaSales")
  ....

MySQLのphotocカラムのデータがRevのtImage、priceカラムがtPrice、yksalesカラムがYokohamaSalesにそれぞれコピーされる。この中でphotocはBLOBの画像データである。

 

MySQLコマンドの実行 データの更新

既存のレコードを書き換えるスクリプトは次の通り。

on mouseUp
  put getConnection() into tId


  put fld "theID" into tProductId
  put img "tPhoto" into pImage
  put fld "Price* into ProductPrice

  put "UPDATE product SET p_image=:1, p_price=2 WHERE product_id=:3" into tQuery
  get revdb_execute(tId, tQuery, "*btImage", "ProductPrice", "tProductId")
  put tResult into fld "theResult"
end mouseUp

 

MySQLコマンドの実行 データの削除

次のスクリプトでは、productテーブルのproduct_idカラムが$idであるレコードを削除する。

on deleteEntry $id
  put getConnection() into tId
  put "DELETE FROM product WHERE product_id = :1" into tQuery
  put revdb_execute(tId, tQuery, "$id") into tResult
  put tResult into fld "theResult"

end deleteEntry

最後に、tResultをtheResultフィールドに表示することによって、削除が本当に実行されたかどうか確認している。