pixtabay apiで遊んでみる その5 DB連携

pixtabay urlをUNIQUEで、テーブルをつくります。

CREATE TABLE img.pixtabay (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	pixtaurl VARCHAR(255) UNIQUE,
	imgurl VARCHAR(60),
	tags VARCHAR(255)
);

続いて、apiから、画像を取得し、dbに画像のパス・タグを入れます。

$stmt = $dbh -> prepare("INSERT IGNORE INTO pixtabay (pixtaurl, imgurl, tags) VALUES(:pixtaurl, :imgurl, :tags)");

$date = date("Ymt");
$i=0;
foreach($url as $value){
	$data = file_get_contents($value);
    $pass = "img/" .$date. "-" . $i . ".jpeg";
    $stmt->bindParam(':pixtaurl', $url[$i], PDO::PARAM_STR);
    $stmt->bindParam(':imgurl', $pass, PDO::PARAM_STR);
    $stmt->bindParam(':tags', $tags[$i], PDO::PARAM_STR);
    $stmt->execute();
    file_put_contents($pass, $data);
    $i++;
}
?>

検索クエリに一致するタグがある画像パスをDBから取得して表示

 
$query = "アップル";
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){

	if(strpos($result["tags"], $query) !== false){
		$url[] = $result["imgurl"];
	}
}

echo "タグに". $query. "を含む画像<br>";
// var_dump($url);
foreach($url as $value){
	echo "<img src=\"" .$value. "\" width=\"200\" height=\"120\" >";
}
?>

ぎゃーーーー

mysql UNIQUEとignore

まず、テーブルをつくります。imgurlはuniqueとします。

CREATE TABLE img.test (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	imgurl VARCHAR(60) UNIQUE,
	tags VARCHAR(255)
);

insert ingore intoで挿入します。

insert ignore into test(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');
insert ignore into test(imgurl, tags) values('img/20180331-2.jpeg', 'iphone, 6 s, プラス');
insert ignore into test(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');

結果


mysql> insert ignore into test(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');
Query OK, 1 row affected (0.01 sec)

mysql> insert ignore into test(imgurl, tags) values('img/20180331-2.jpeg', 'iphone, 6 s, プラス');
Query OK, 1 row affected (0.00 sec)

mysql> insert ignore into test(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');
Query OK, 0 rows affected (0.05 sec)

mysql> select * from test;
+----+---------------------+-------------------------------------------------+
| id | imgurl              | tags                                            |
+----+---------------------+-------------------------------------------------+
|  1 | img/20180331-0.jpeg | スマー トな腕時計, アップル, 技術               |
|  2 | img/20180331-2.jpeg | iphone, 6 s, プラス                             |
+----+---------------------+-------------------------------------------------+
2 rows in set (0.00 sec)

あら、いけるかも。

PDOでpixtabay apiの情報をmysqlに入れる

<?php

$apikey = "donot watch";
$query = "apple+watch";
$type = "photo"; 
//  "all", "photo", "illustration", "vector" 
$cate = "fashion";
// fashion, nature, backgrounds, science, education, people, feelings, religion, health, places, animals, industry, food, computer, sports, transportation, travel, buildings, business, music
$lang = "";

$orientation = "";
//"all", "horizontal", "vertical" 
$per_page = "";
//Accepted values: 3 - 200 
$order = "";
//"popular", "latest" 
$per_page = "";
//Accepted values: 3 - 200 

$baseurl = "https://pixabay.com/api/?key=". $apikey."&q=".$query."&image_type=".$type."&lang=ja&category=".$cate."";


$json = file_get_contents($baseurl);
$obj = json_decode($json);


// print_r('<pre>');
// var_dump($obj);
// print_r('</pre>');

foreach($obj->hits as $value){
	$url[] = $value->webformatURL;
	$tags[] = $value->tags;
}

$dsn = "mysql:dbname=img;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
}

$stmt = $dbh -> prepare("INSERT INTO pixtabay (imgurl, tags) VALUES(:imgurl, :tags)");

$date = date("Ymt");
$i=0;
foreach($url as $value){
    $pass = "img/" .$date. "-" . $i . ".jpeg";
    $stmt->bindParam(':imgurl', $pass, PDO::PARAM_STR);
    $stmt->bindParam(':tags', $tags[$i], PDO::PARAM_STR);
    $stmt->execute();
    $i++;
}
?>

入ってますね♪

問題は画像の重複ですが。。。

pixtabay apiで遊んでみる その4 DB連携

まず、DBをつくってデータを入れます。

create database img;

CREATE TABLE img.pixtabay (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	imgurl VARCHAR(60),
	tags VARCHAR(255)
);

insert into pixtabay(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');
insert into pixtabay(imgurl, tags) values('img/20180331-2.jpeg', 'iphone, 6 s, プラス');
insert into pixtabay(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');

mysql> select * from pixtabay;
+----+---------------------+-------------------------------------------------+
| id | imgurl              | tags                                            |
+----+---------------------+-------------------------------------------------+
|  1 | img/20180331-0.jpeg | スマートな腕時計, アップル, 技術                |
|  2 | img/20180331-2.jpeg | iphone, 6 s, プラス                             |
|  3 | img/20180331-0.jpeg | スマー トな腕時計, アップル, 技術               |
+----+---------------------+-------------------------------------------------+
3 rows in set (0.00 sec)

次に、DBからデータを取り出して、表示します。

<?php

$dsn = "mysql:dbname=img;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select * from pixtabay";
$stmt = $dbh->query($sql);
 
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
    $url[] = $result["imgurl"];
}

var_dump($url);
foreach($url as $value){
	echo "<img src=\"" .$value. "\" width=\"200\" height=\"120\" >";
}
?>

そして、fetchの条件に、〇〇を含むを入れます。ここでは、タグに”プラス”という単語が入っていた場合を考えます。

<?php

$dsn = "mysql:dbname=img;host=localhost";
$user = "foo";
$password = "foofoo";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select * from pixtabay";
$stmt = $dbh->query($sql);
 
$query = "プラス";
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){

	if(strpos($result["tags"], $query) !== false){
		$url[] = $result["imgurl"];
	}
}

echo "タグに". $query. "を含む画像<br>";
// var_dump($url);
foreach($url as $value){
	echo "<img src=\"" .$value. "\" width=\"200\" height=\"120\" >";
}
?>

おいおい、割と簡単にできたけど、こんなんでいいのか?

pixtabay apiで遊んでみる その2 画像の取得

apiで取得したデータをfile_get_contents, file_put_contentsで取得する。

<?php

$apikey = "hogehoge";
$query = "apple+watch";
$type = "photo"; 
//  "all", "photo", "illustration", "vector" 
$cate = "fashion";
// fashion, nature, backgrounds, science, education, people, feelings, religion, health, places, animals, industry, food, computer, sports, transportation, travel, buildings, business, music
$orientation = "";
//"all", "horizontal", "vertical" 
$per_page = "";
//Accepted values: 3 - 200 
$order = "";
//"popular", "latest" 
$per_page = "";
//Accepted values: 3 - 200 

$baseurl = "https://pixabay.com/api/?key=". $apikey."&q="."&image_type=".$type."&category=".$cate."";

$json = file_get_contents($baseurl);
$obj = json_decode($json);


// print_r('<pre>');
// var_dump($obj);
// print_r('</pre>');

foreach($obj->hits as $value){
	$url[] = $value->webformatURL;
	$tags[] = $value->tags;
}


$date = date("Ymt");
$i=0;
foreach($url as $value){
	$data = file_get_contents($value);
    $pass = "img/" .$date. "-" . $i . ".jpeg";
    file_put_contents($pass, $data);
    $i++;
}

echo "<img src='img/".$date."-1.jpeg' >";
?>

結果、取れるには取れるが、file_get_contentsに1毎3秒かかっている。。。20毎で約1分。

しかし、クエリは”apple+watch”なんだけど、えらい写真が来たな。。

phpでpixtabay apiで遊んでみる その1

<?php

$apikey = "hoge";
$query = "apple+watch";
$type = "photo"; 
//  "all", "photo", "illustration", "vector" 
$cate = "fashion";
// fashion, nature, backgrounds, science, education, people, feelings, religion, health, places, animals, industry, food, computer, sports, transportation, travel, buildings, business, music
$orientation = "";
//"all", "horizontal", "vertical" 
$per_page = "";
//Accepted values: 3 - 200 
$order = "";
//"popular", "latest" 
$per_page = "";
//Accepted values: 3 - 200 

$baseurl = "https://pixabay.com/api/?key=". $apikey."&q="."&image_type=".$type."&category=".$cate."";

$json = file_get_contents($baseurl);
$obj = json_decode($json);

print_r('<pre>');
var_dump($obj);
print_r('</pre>');

“webformatURL”だと、600x420pxですね。

JPEG, GIF, PNG

写真画像ならJPEGが一般的、非可逆圧縮の画像フォーマット
256色以下ならGiF ロゴ、ボタン、イラストなど
PNG 可逆圧縮の画像形式、背景透過も可能、ウェブ用として有用

画像ファイルの中から複数の古い画像を削除する

まず、最初の状態。
6毎の画像があります。

<?php

//画像一覧んを取得
foreach(glob('img/*') as $file){
	if(is_file($file)){
		$file_list&#91;&#93; = $file;
		// $file_list&#91;&#93; = str_replace('img/', '', $file);
	}
}

//ファイル名でソート
sort($file_list);
var_dump($file_list);

echo '<br>';

//古いファイルを切り出す
$result = array_slice($file_list, 0, 3);
var_dump($result);

//取得したファイルをunlinkで削除
foreach($result as $value){
		unlink($value);
}

//結果を表示
foreach(glob('img/*') as $file){
	if(is_file($file)){
		$file_list[] = $file;
	}
}
sort($file_list);
var_dump($file_list);

結果

なるほど、なんとなく見えてきましたね。

unlink()でファイル削除

まず初期状態

unlinkを使います。

<?php

unlink('sample.txt');
unlink('03.jpeg');
?>

削除されました。なるほど。

複数のファイル削除は、glob関数

<?php

foreach(glob('*.jpeg') as $file){
		unlink($file);

		echo $file.'を削除しました。<br>';
}
?>

特定フォルダのファイル名一覧の取得もglobでok

<?php

foreach(glob('img/*') as $file){
	if(is_file($file)){
		$file_list&#91;&#93; = str_replace('img/', '', $file);
	}
}

var_dump($file_list);
?>

array(3) { [0]=> string(17) “20180331-City.jpg” [1]=> string(19) “20180331-Cuisse.jpg” [2]=> string(19) “20180331-Nomura.jpg” }