Yii frameworkとは何か?

Yiiとはphpのフレームワーク
公式サイト: https://www.yiiframework.com/

Yiiの解説

Yii は現代的なウェブ・アプリケーションを迅速に開発するための、高性能な、コンポーネント・ベースの PHP フレームワークです。 Yii という名前 (イー すなわち [ji:] と発音します) は、中国語では「易」であり、「シンプルかつ進化的」であることを意味します。 また Yes It Is のアクロニム (頭字語) であると考えることも出来ます。

中国人が作っているのでしょうか。。。

Google Trendを見てみます。

全く人気がない。
というか、laravelよるrailsの方が使われているんだな。

そろそろ本気出すか。

って、本気はいつだよ。

画像をdrag&drop

<?php
	if(isset($_FILES&#91;'image'&#93;&#91;'tmp_name'&#93;)){
		move_uploaded_file($_FILES&#91;'image'&#93;&#91;'tmp_name'&#93;,'asset/img/01.png');
	}
?>
<!Doctype html>
<html>
<head>
    <meta charset="UTF-8">
<style>
#drag-drop-area{
	background-color:#e6e6fa;
	padding:15px;
}
.drag-drop-inside{
	text-align:center;
	border: dashed 1px gray;
	padding: 5px;
}
</style>
</head>
<body>
<form action="#" method="POST" enctype="multipart/form-data">
	<div id="drag-drop-area">
	 <div class="drag-drop-inside">
		<p class="drag-drop-info">ここにファイルをアップロード</p>
		<p>または</p>
		<!-- <input type="file" value="ファイルを選択" name="image"> -->
		<p class="drag-drop-buttons"><input id="fileInput" type="file" value="ファイルを選択" name="image"></p>
        <input type="submit" value="送信">
     </div>
    </div>
  </form>
<script>
var fileArea = document.getElementById('drag-drop-area');
var fileInput = document.getElementById('fileInput');

fileArea.addEventListener('dragover', function(evt){
	evt.preventDefault();
	fileArea.classList.add('dragover');
});

fileArea.addEventListener('dragleave', function(evt){
	evt.preventDefault();
	fileArea.classList.remove('dragover');
});

fileArea.addEventListener('drop', function(evt){
	evt.preventDefault();
	fileArea.classList.remove('dragenter');
	var files = evt.dataTransfer.files;
	fileInput.files = files;
});

</script>    
</body>
</html>

うお、思ってたよりカッケー

で、これを当てはめたい

まー及第点でしょう。。

phpのファイルアップロード

<?php

	if(isset($_FILES&#91;'image'&#93;&#91;'tmp_name'&#93;)){
		move_uploaded_file($_FILES&#91;'image'&#93;&#91;'tmp_name'&#93;,'asset/img/01.png');
	}

?>
<!Doctype html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<form action="#" method="POST" enctype="multipart/form-data">
    <input type="file" name="image">
    <input type="submit" value="upload">
  </form>    
</body>
</html>

以下でエラーで出ていて、ずっとなんでだろうなーと考えていました。

move_uploaded_file($_FILES['image']['tmp_name'],'asset/img/');

次はドラック&ドロップでアップロードしたい。

PHPUnit

品質の良いプロダクトコードを書くことができるようになる。

use PHPUnit\Framework\TestCase;

classs HogeTest extends TestCase
{
	public function testHoge()
	{
		$stack = [];
		$this->assertEquals(0, count($stack));
	}
}

localのcsvをmysqlにインポートする

1. まずdatabaseをつくります。
mysql> CREATE DATABASE click;
Query OK, 1 row affected (0.00 sec)

mysql> use click;

2. 続いて、tableを作ります。
mysql> create table articles(
-> id int primary key auto_increment,
-> login_id varchar(30),
-> role varchar(50),
-> name varchar(20),
-> password varchar(30),
-> mail varchar(255),
-> test_mail varchar(255),
-> updated_person varchar(50),
-> created_at datetime,
-> updated_at datetime
-> );

mysql> select * from articles;
Empty set (0.00 sec)

s3から取得したcsvをopenして1行目のカラムを飛ばしてmysqlにinsertしていきます。

try {
	$dbh = new PDO('mysql:host=localhost;dbname=click;charset=utf8','hoge','hogehoge', array(PDO::ATTR_EMULATE_PREPARES => false));
} catch(PDOException $e){
	exit('データベース接続失敗。'.$e->getMessage());
}

$stmt = $dbh->prepare('INSERT INTO articles VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?,?)');

$dbh->beginTransaction();
$fp = fopen('article.csv', 'rb');
$i = 0;
while ($row = fgetcsv($fp)){
	if($i == 0){
		$i++;
		continue;
	}
	if ($row === array(null)){
		continue;
	}
	$executed = $stmt->execute($row);
	$i++;
}
fclose($fp);
$dbh->commit();

確認してみましょう。

mysql> select * from articles;
+—-+———-+——–+————–+———–+———————+————————–+—————-+———————+———————+
| id | login_id | role | name | password | mail | test_mail | updated_person | created_at | updated_at |
+—-+———-+——–+————–+———–+———————+————————–+—————-+———————+———————+
| 1 | user1 | master | taniguchi | passowrd | laravel@gmail.com | laravel_test@gmail.com | sasaki | 2018-09-21 21:39:07 | 2018-09-21 21:39:07 |
| 2 | user2 | master | goto | himitsu | laravel@hotmail.com | laravel_test@hotmail.com | sasaki | 2018-09-22 08:31:54 | 2018-09-22 08:51:32 |
| 3 | user3 | master | 橋本芳樹 | password3 | laravel@gmail.com | laravel_test@gmail.com | こばやし | 2018-09-22 15:03:11 | 2018-09-22 15:03:11 |
| 4 | user4 | master | 後藤大輔 | password4 | laravel@gmail.com | laravel_test@gmail.com | こばやし | 2018-09-22 15:48:56 | 2018-09-22 15:48:56 |
| 9 | user2 | master | goto | himitsu | laravel@hotmail.com | laravel_test@hotmail.com | sasaki | 2018-09-22 17:41:59 | 2018-09-22 17:41:59 |
+—-+———-+——–+————–+———–+———————+————————–+—————-+———————+———————+
5 rows in set (0.00 sec)

おいおいおい、やべーことになってる。
とりあえず、laravel -> mysql(1) -> csv -> s3 upload -> s3 import -> csv -> mysql(2)の流れは出来た。やはり、laravelが時間かかったな。frameworkの習得は時間がかかる。s3はセキュリティ周りをもっと学習する必要がある。
next
-> SSL
-> githubからdeploy

mysqlからcsvを作ろう

try {
	$dbh = new PDO('mysql:host=localhost;dbname=hoge;charset=utf8','hoge','hoge', array(PDO::ATTR_EMULATE_PREPARES => false));
} catch(PDOException $e){
	exit('データベース接続失敗。'.$e->getMessage());
}

$file_path = "../s3/article.csv";
$export_csv_title = ["id","login_id","role","name","password","mail","test_mail","updated_person","created_at","updated_at"];
$export_sql = "select * from articles";

foreach($export_csv_title as $key => $val){
	$export_header[] = mb_convert_encoding($val, 'SJIS-win', 'UTF-8');
	}

	if(touch($file_path)){
		$file = new SplFileObject($file_path, "w");

		$file->fputcsv($export_header);
		$stmt = $dbh->query($export_sql);

		while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
			$file->fputcsv($row);
		}
		$dbh = null;

	}

echo "finish!!!!!!";

おいおい、ちょっと待てこれ。来てる!

次は、csvをs3に格納する。

mysqlのデータからcsvをつくろう

まず、mysqlからpdoでデータを取得し、csvデータを作りたいと思います。

まずvagrantでcsv保存用にs3というフォルダをつくります。

まず、mysqlに接続します。
Database changed
mysql> show tables;
+———————+
| Tables_in_laravel57 |
+———————+
| articles |
| documents |
| migrations |
+———————+
3 rows in set (0.00 sec)

mysql> select * from articles;
+—-+———-+——–+————–+———–+———————+————————–+—————-+———————+———————+
| id | login_id | role | name | password | mail | test_mail | updated_person | created_at | updated_at |
+—-+———-+——–+————–+———–+———————+————————–+—————-+———————+———————+
| 1 | user1 | master | taniguchi | passowrd | laravel@gmail.com | laravel_test@gmail.com | sasaki | 2018-09-21 21:39:07 | 2018-09-21 21:39:07 |
| 2 | user2 | master | goto | himitsu | laravel@hotmail.com | laravel_test@hotmail.com | sasaki | 2018-09-22 08:31:54 | 2018-09-22 08:51:32 |
| 3 | user3 | master | 橋本芳樹 | password3 | laravel@gmail.com | laravel_test@gmail.com | こばやし | 2018-09-22 15:03:11 | 2018-09-22 15:03:11 |
| 4 | user4 | master | 後藤大輔 | password4 | laravel@gmail.com | laravel_test@gmail.com | こばやし | 2018-09-22 15:48:56 | 2018-09-22 15:48:56 |
| 9 | user2 | master | goto | himitsu | laravel@hotmail.com | laravel_test@hotmail.com | sasaki | 2018-09-22 17:41:59 | 2018-09-22 17:41:59 |
+—-+———-+——–+————–+———–+———————+————————–+—————-+———————+———————+
5 rows in set (0.00 sec)

データは入ってますね。続いて、batchというフォルダをつくり、そこからpdoを作ります。

try {
	$pdo = new PDO('mysql:host=localhost;dbname=laravel57;charset=utf8','root','', array(PDO::ATTR_EMULATE_PREPARES => false));
} catch(PDOException $e){
	exit('データベース接続失敗。'.$e->getMessage());
}

$stmt = $pdo->query("select * from articles");
while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){
	$id[] = $row['id']; 
	$login_id[] = $row['login_id'];
	$role[] = $row['role'];
	$name[] = $row['name'];
	$password[] = $row['password'];
	$mail[] = $row['mail'];
	$test_mail[] = $row['test_mail'];
	$updated_person[] = $row['updated_person'];
	$created_at[] = $row['created_at'];
	$updated_at[] = $row['updated_at'];
}

var_dump($role);

ここまではOK。何の問題もなし。

続いて、CSVの作り方。

phpのheader情報取得

<?php
  $headers = getallheaders();
  while (list ($header, $value) = each ($headers)) {
    echo "$header: $value" . "<br>";
  }
?>

Host: hpscript.com
X-Real-Ip: xxx.xx.xxx
X-Forwarded-Proto: http
Listen-Ipaddr: xxx.xx.xxx
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Cookie: _ga=GA1.2.792464320.1516407668; _gid=GA1.2.793830752.1537052174

なるほど、chunkedはないな。

php artisan tinker

php artisan tinkerとは?

-既に読み込まれているPHPアプリケーションのためのREPL (Read-Eval-Print Loop)を提供
-データベースへのアクセス、モデルを使うなどが可能

appにあるArticle.phpを編集する。protected $fillableを追加。

class Article extends Model
{
    //
    protected $fillable = ['loginid','role','name','password','mail','test_mail','updated_person']
}

再度artisan tinker
[vagrant@localhost laravel]$ php artisan tinker
Psy Shell v0.9.8 (PHP 7.1.21 — cli) by Justin Hileman
>>> App\Article::create([‘login_id’=>’user2′,’role’=>’master’,’name’=>’goto’,
… ‘password’=>’password’,’mail’=>’laravel@hotmail.com’,’test_mail’=>’laravel_test@hotmail.com’,
… ‘updated_person’=>’sasaki’]);
=> App\Article {#2913
login_id: “user2”,
role: “master”,
name: “goto”,
password: “password”,
mail: “laravel@hotmail.com”,
test_mail: “laravel_test@hotmail.com”,
updated_person: “sasaki”,
updated_at: “2018-09-22 08:31:54”,
created_at: “2018-09-22 08:31:54”,
id: 2,
}

うお!
mysql側で確認
mysql> select * from articles;
+—-+———-+——–+———–+———-+———————+————————–+—————-+———————+———————+
| id | login_id | role | name | password | mail | test_mail | updated_person | created_at | updated_at |
+—-+———-+——–+———–+———-+———————+————————–+—————-+———————+———————+
| 1 | user1 | master | taniguchi | passowrd | laravel@gmail.com | laravel_test@gmail.com | sasaki | 2018-09-21 21:39:07 | 2018-09-21 21:39:07 |
| 2 | user2 | master | goto | password | laravel@hotmail.com | laravel_test@hotmail.com | sasaki | 2018-09-22 08:31:54 | 2018-09-22 08:31:54 |
+—-+———-+——–+———–+———-+———————+————————–+—————-+———————+———————+
2 rows in set (0.00 sec)

抽出もできる。
>>> App\Article::where(‘id’, ‘>’, 1)->get()->toArray();
=> [
[
“id” => 2,
“login_id” => “user2”,
“role” => “master”,
“name” => “goto”,
“password” => “password”,
“mail” => “laravel@hotmail.com”,
“test_mail” => “laravel_test@hotmail.com”,
“updated_person” => “sasaki”,
“created_at” => “2018-09-22 08:31:54”,
“updated_at” => “2018-09-22 08:31:54”,
],
]

これでも取得できる。
>>> App\Article::orderBy(‘created_at’,’desc’)->get()->toArray();

php artisan migrateしよう

public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('login_id');
            $table->string('role');
            $table->string('name');
            $table->string('password');
            $table->string('mail');
            $table->string('updated_person');
            $table->timestamps();
        });
    }

[vagrant@localhost laravel]$ php artisan migrate
Migration table created successfully.
Migrating: 2018_09_19_234806_create_articles_table
Migrated: 2018_09_19_234806_create_articles_table

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel57
DB_USERNAME=root
DB_PASSWORD=

table.php

{
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('login_id');
            $table->string('role');
            $table->string('name');
            $table->string('password');
            $table->string('mail');
            $table->string('test_mail');
            $table->string('updated_person');
            $table->timestamps();
        });
    }

mysql> show columns from articles
-> ;
+—————-+——————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+—————-+——————+——+—–+———+—————-+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| login_id | varchar(255) | NO | | NULL | |
| role | varchar(255) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
| mail | varchar(255) | NO | | NULL | |
| test_mail | varchar(255) | NO | | NULL | |
| updated_person | varchar(255) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+—————-+——————+——+—–+———+—————-+
10 rows in set (0.00 sec)

increments(”)だとint(10) primary key auto_increment, string(”)だとvarchar(255)になりますね。