LoginSignup
5
8

More than 5 years have passed since last update.

メモ: Idiorm使ってみた

Last updated at Posted at 2017-02-14

参考

必要なもの : pdo,mysql

idiorm.phpだけあれば使える手軽さ
wget "https://raw.githubusercontent.com/j4mie/idiorm/master/idiorm.php" \
 --no-check-certificate

例 (mysql)

例1
<?php
require_once("./idiorm.php");

ORM::configure('mysql:host=localhost;port=3306;dbname=test');
ORM::configure('username', 'root');
ORM::configure('password', '');

//$record = ORM::for_table('テーブル名')
//           ->where('カラム名','検索したい値')
//           ->find_one();
$record = ORM::for_table('テーブル名')->find_one();

print_r($record->as_array());

$data = $record->カラム名;
print $data;

例1. クリック毎にinsert

count.png

create.sql
CREATE TABLE clicks (
  id int(11) NOT NULL AUTO_INCREMENT,
  count int(11) NOT NULL default '0',
  created_at datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY (id)
) TYPE=InnoDB COMMENT='クリック数';
index.html(jquery)
<!DOCTYPE html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<input type="button" id="btn1" value="click" />
<span id="counts"></span>
<script>
$(function() {
  var counts = 0;
  $('#btn1').click(function() {
    $.ajax('countup.php',
      {
        type: 'get',
        data: { count: counts++ }
      }
    )
    .done(function(data) {
      $("#counts").html('success');
    })
    .fail(function() {
      $("#counts").html('error');
    });
  });
});
</script>
index.html(axios)
<!DOCTYPE html>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<input type="button" value="click" onclick="countup();" />
<script>
var counts = 0;
function countup() {
  counts++;
  axios.get('./countup.php?count='+counts)
    .then(function (response) {
      console.log(response.statusText);
    })
    .catch(function (error) {
      console.log(error.statusText);
    });
}
</script>
countup.php
<?php
require_once("./idiorm.php");
$DBNAME='test';
ORM::configure(array(
    'connection_string' => 'mysql:host=127.0.0.1;dbname='.$DBNAME,
    'username' => 'root',
    'password' => ''
));

# validation
$count = $_GET["count"];
if(!is_numeric($count)) {
        die("[quit] not number.");
}

# insert
$click = ORM::for_table('clicks')->create();
$click->count = $count;
$click->set_expr('created_at', 'NOW()');
$click->save();

echo "[success] 200";

例2. userテーブル

count2.png

create.sql
CREATE TABLE clicks (
  id int(11) NOT NULL AUTO_INCREMENT,
  user_id int(11) NOT NULL default '0',
  count int(11) NOT NULL default '0',
  updated_at datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY (id)
) TYPE=InnoDB COMMENT='クリック数';

CREATE TABLE users (
  id int(11) NOT NULL AUTO_INCREMENT,
  sessid varchar(32) NOT NULL default '0',
  updated_at datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY (id)
) TYPE=InnoDB COMMENT='user';
index.php
<?php session_start(); ?>
<!DOCTYPE html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<input type="button" id="btn1" value="click" />
<span id="counts"></span>
<script>
$(function() {
  var counts = 0;
  var sessid = '<?php echo $_COOKIE["PHPSESSID"]; ?>';
  $('#btn1').click(function() {
    $.ajax('countup.php',
      {
        type: 'get',
        data: {
            sessid: sessid,
            count: ++counts,
        }
      }
    )
    .done(function(data) {
      $("#counts").html("クリック回数:"+counts);
    })
    .fail(function() {
      $("#counts").html('error');
    });
  });
});
</script>
countup.php
<?php
require_once("./idiorm.php");
#------------------------------------------------------------------------------
class Counter {
    public $count;
    public $sessid;
    function __construct() {
        $this->count = $_GET["count"];
        $this->sessid = $_GET["sessid"];
    }
    function db_connect() {
        $DBNAME='test';
        ORM::configure(array(
            'connection_string' => 'mysql:host=127.0.0.1;dbname='.$DBNAME,
            'username' => 'root',
            'password' => '',
            'caching' => true,
            'caching_auto_clear' => true,
        ));
    }

    function validation() {
        if(!is_numeric($this->count)) {
            die("[quit] not number.");
        }
        if(empty($this->sessid)) {
            die("[quit] no sessid.");
        }
    }

    function up() {
        $this->validation();
        $this->db_connect();
        # user
        $user = ORM::for_table('users')->where('sessid', $this->sessid)->find_one();
        if(!$user) {
            # insert
            $user = ORM::for_table('users')->create();
            $user->sessid = $this->sessid;
            $user->set_expr('updated_at', 'NOW()');
            $user->save();
        }
        $user_id = $user->id();

        # click数
        $click = ORM::for_table('clicks')->where('user_id', $this->user_id)->find_one();
        if(!$click) {
            $click = ORM::for_table('clicks')->create();
        }
        $click->count = $this->count;
        $click->user_id = $user_id;
        $click->set_expr('updated_at', 'NOW()');
        $click->save();

        echo "[success] 200";
    }
}
#------------------------------------------------------------------------------
$Counter = new Counter();
$Counter->up();

例 (sqlite3)

CREATE TABLE bbs (
 id INTEGER PRIMARY KEY
, body TEXT
, created_at datetime
);
<?php
require_once("vendor/idiorm.php");
ORM::configure('sqlite:a.sqlite3');
ORM::configure('id_column', 'id');

if($_GET["body"]) {
        $record = ORM::for_table('bbs')->create();
        $record->body = $_GET["body"];
        $record->created_at = date("Y-m-d H:i:s");
        $record->save();
}
  • sqliteを使う場合、親ディレクトリに書き込み権限が必要。
    • 恐らく一旦tmpファイルに書き込んでからmvしているのでは。

書き方

SQL直書き

raw_query
//SQL直書き (raw_query)
$query = 'SELECT * FROM members WHERE name = :name';
$entries = ORM::for_table('members')
    ->raw_query($query, array('name' => $name))
    ->find_array();

Join

$records = ORM::for_table('addresses')
       ->left_outer_join('members', 'members.id=addresses.memid')
       ->find_many();

foreach ($records as $r) {
    echo sprintf("id: %s, name: %s, pref: %s<br>"
        ,$r->id, $r->name, $r->pref);
}

複数DB接続

<?php
require_once("vendor/idiorm.php");

// a.sqlite3
ORM::configure('sqlite:a.sqlite3', null, 'connection_A');
ORM::configure('id_column', 'id', 'connection_A');
if($_GET["body"]) {
        $record = ORM::for_table('bbs','connection_A')->create();
        $record->body = $_GET["body"];
        $record->save();
}

// b.sqlite3
ORM::configure('sqlite:b.sqlite3', null, 'connection_B');
ORM::configure('id_column', 'id', 'connection_B');
if($_GET["body"]) {
        $record = ORM::for_table('bbs','connection_B')->create();
        $record->body = $_GET["body"];
        $record->save();
}

show tables

$res = ORM::raw_execute("SHOW TABLES LIKE 'sales_%'");
$statement = ORM::get_last_statement();
echo "<pre>";
while ($row = $statement->fetch(PDO::FETCH_NUM)) {
    echo $row[0]."<br>";
}
5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8