配列の先頭を末尾に変える

PDOで、コード2929の銘柄が、株価416円、前日比+16%となり、それをデータベースに入れたいとする。
array(2929, 416, 18)を、以下のように、codeを末尾に変えるには?

$sql = "UPDATE stoph SET price = ?, ratio = ? WHERE code = ?";

array_sliceで切り取って、以下のように並び順を変える。

$today = array(2929, 416, 18);
$change = array_slice($today, 1);
$change[] = $today[0];

array(3) { [0]=> int(416) [1]=> int(18) [2]=> int(2929) }

$today = array(2929, 416, 18);
$change = array_slice($today, 1);
$change[] = $today[0];


$sql = "UPDATE stoph SET price = ?, ratio = ? WHERE code = ?";
$stmt = $dbh->prepare($sql);

$stmt->execute($change);

PDOで配列のデータをアップデート

以下のように、updateする内容を配列でもって、それをexecuteすれば、そのまま反映されます。

<?php

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

$change = array(420, 21, 2929);
$sql = "UPDATE stoph SET price = ?, ratio = ? WHERE code = ?";
$stmt = $dbh->prepare($sql);

$stmt->execute($change);
// $sql = "UPDATE stoph SET price = :price WHERE code = :code";
// $stmt->execute(array(':price'=>425, ':code'=>2929));
?>

PDOでデータをupdate

まずは”?”を使って更新します。

<?php

$dsn = "mysql:dbname=stock;host=localhost";
$user = "root";
$password = "";
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET CHARACTER SET 'utf8'");
try {
	$dbh = new PDO($dsn, $user, $password, $options);
} catch (PDOException $e){
	print('connection failed:'.$e->getMessage());
}

$sql = "select stoph SET 'price' = ? WHERE id = ?";
$stmt = $dbh->prepare($sql);

$stmt->execute(array(430, 2929));
?>

PDOとは

PHP Data Objectの略で、php5.1.0以降のデータベース接続クラスの事。GDO(golf digest online)ではありません。

では、まずmysqlにログイン(mysql -u root -p)して、データベースをつくりましょう。サンプルで、ストップ高のテーブルをつくります。

create database stock;

次に、ストップ高のテーブルをつくります。

create table stock.stoph(
	code int,
	name varchar(255),
	price int,
        ratio int
);

そして、テーブルにストップ高の銘柄を入れていきます。

insert into stock.stoph values
(1743, 'コーアツ工業', 3175, 18.82),
(2929, 'ファーマフーズ', 440, 22.22),
(3469, 'デュアルタップ', 1144, 15.09),
(3825, 'リミックスポイント', 791, 14.47);

では、コーディングしていきます。

<?php

$dsn = "mysql:dbname=stock;host=localhost";
$user = "root";
$password = "";

try {
	$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
	print('connection failed:'.$e->getMessage());
}

$sql = "select * from stoph";
$stmt = $dbh->query($sql);

while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
	print($result["code"]);
	print($result["name"]);
	print($result["price"]);
	print($result["rate"]."<br>");
}


?>

new PDO とは、PDOのクラスをつくっています。
$dbh->query($sql) は query(※実行)のメソッドに$sqlを代入しています。
$stmt->fetch(PDO::FETCH_ASSOC)は、厳密には、$dbh->query->fetch(PDO::FETCH_ASSOC)ですね。

cronが動かないとき((getpwnam() failed)

cronが動かないのでコマンドラインで、cat /var/log/cron を打つと、

Feb 13 13:50:01 localhost crond[3093]: (/usr/bin/php) ERROR (getpwnam() failed)

getpwnamはパスワードファイルの取得にエラーがあるようです。

以下のように書き換えました。

// 前
00,10,20,30,40,50 * * * * /usr/bin/php /home/vagrant/api/test.php
// 後
00,10,20,30,40,50 * * * * root /usr/bin/php /home/vagrant/api/test.php

上手く動くようになりました。

### コマンドプロンプトの本
まあ買うまでもないかな

MySQLに配列をInsert, update

もっとスマートな書き方があると思いますが。。。

<?php

$link = mysql_connect('localhost', 'root', '***');
if(!link){
	die('接続失敗です。'.mysql_error());
}
$selected = mysql_select_db('sample', $link);
if ($db_selected){
	die('データベース選択失敗です。'.mysql_error());
}

echo "接続に成功しました。<br>";

$data = array('4','word31','word32','word33','word34','word35','word36','word37','word38','word39','word40');
var_dump($data);

$sql = "INSERT INTO words(id, word1, word2, word3, word4, word5, word6, word7, word8, word9, word10) VALUES ('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]','$data[9]','$data[10]')";
$result_flag = mysql_query($sql);

$result = mysql_query('SELECT * FROM words');
if (!$result){
	die('クエリーが失敗しました。'.mysql_error());
}

while ($row = mysql_fetch_assoc($result)) {
    print('<p>');
    print('id='.$row['id']);
    print(',word1='.$row['word1']);
    print('</p>');
}

echo "<br>";
$close_flag = mysql_close($link);

if($close_flag){
	echo "切断に成功しました。";
}

接続に成功しました。
array(11) { [0]=> string(1) “4” [1]=> string(6) “word31” [2]=> string(6) “word32” [3]=> string(6) “word33” [4]=> string(6) “word34” [5]=> string(6) “word35” [6]=> string(6) “word36” [7]=> string(6) “word37” [8]=> string(6) “word38” [9]=> string(6) “word39” [10]=> string(6) “word40” }
id=1,word1=ワード01

id=2,word1=ワード11

id=3,word1=ワード21

id=4,word1=word31

切断に成功しました。

update

$sql = sprintf("UPDATE words SET word1=%s, word2=%s, word3=%s, word4=%s, word5=%s, word6=%s, word7=%s, word8=%s, word9=%s, word10=%s WHERE id=2", quote_smart($data[1]), quote_smart($data[2]), quote_smart($data[3]), quote_smart($data[4]), quote_smart($data[5]), quote_smart($data[6]), quote_smart($data[7]), quote_smart($data[8]), quote_smart($data[9]), quote_smart($data[10]));

MySQLに接続し、データを取得

まず接続

<?php

$link = mysql_connect('localhost', 'root', '***');
if(!link){
	die('接続失敗です。'.mysql_error());
}

echo "接続に成功しました。<br>";

$close_flag = mysql_close($link);

if($close_flag){
	echo "切断に成功しました。";
}

接続に成功しました。
切断に成功しました。

データベースの選択

$selected = mysql_select_db('sample', $link);
if ($db_selected){
	die('データベース選択失敗です。'.mysql_error());
}

mysql_query とmysql_fetch_assocで、テーブルからデータを取得。

<?php

$link = mysql_connect('localhost', 'root', '');
if(!link){
	die('接続失敗です。'.mysql_error());
}
$selected = mysql_select_db('sample', $link);
if ($db_selected){
	die('データベース選択失敗です。'.mysql_error());
}

echo "接続に成功しました。<br>";
$result = mysql_query('SELECT * FROM words');
if (!$result){
	die('クエリーが失敗しました。'.mysql_error());
}
$row = mysql_fetch_assoc($result);

$result = array();
foreach($row as $key => $value){
	$result[] = $value;
}
var_dump($result);

echo "<br>";
$close_flag = mysql_close($link);

if($close_flag){
	echo "切断に成功しました。";
}

接続に成功しました。
array(11) { [0]=> string(1) “1” [1]=> string(11) “ワード01” [2]=> string(11) “ワード02” [3]=> string(11) “ワード03” [4]=> string(11) “ワード04” [5]=> string(11) “ワード05” [6]=> string(11) “ワード06” [7]=> string(11) “ワード07” [8]=> string(11) “ワード08” [9]=> string(11) “ワード09” [10]=> string(11) “ワード10” }
切断に成功しました。 

MySQLに接続し、データベースを作成

mysql -u root -p で接続します。

[vagrant@localhost api]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.6.34 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

次に、データベースをつくります。今回は、”sample”。

mysql> create database sample;
Query OK, 1 row affected (0.11 sec)

テーブルを作成する。

mysql> use  sample;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table sample.words(
    ->  id int,
    ->  word1 varchar(255),
    ->  word2 varchar(255),
    ->  word3 varchar(255),
    ->  word4 varchar(255),
    ->  word5 varchar(255),
    ->  word6 varchar(255),
    ->  word7 varchar(255),
    ->  word8 varchar(255),
    ->  word9 varchar(255),
    ->  word10 varchar(255)
    -> );
Query OK, 0 rows affected (0.27 sec)

mysql> show tables;
+------------------+
| Tables_in_sample |
+------------------+
| words            |
+------------------+
1 row in set (0.00 sec)

データを挿入します。

mysql> insert into sample.words values
    -> (1, 'ワード01','ワード02','ワード03','ワード04','ワード05','ワード06','ワード07','ワード08','ワード09','ワード10'),
    -> (2, 'ワード11','ワード12','ワード13','ワード14','ワード15','ワード16','ワード17','ワード18','ワード19','ワード20'),
    -> (3, 'ワード21','ワード22','ワード23','ワード24','ワード25','ワード26','ワード27','ワード28','ワード29','ワード30');
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

テーブルのカラムを表示
desc words;
テーブルの中身を表示
select * from words;

中国語(ISO 3166-1 alpha-2:cn)の文字コード

中国語には繁体字と簡体字があり、繁体字は主に台湾、簡体字は主に本土で使われている。
character set
繁体字:big5
簡体字:GB2312 (EUC_CN)

では、文字コードはどう使われているのでしょう?

国工商银行

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>欢迎光临中国工商银行东京网站</title>
<META name="ICBCChannel" content="海外分行">

Agricultural bank of china

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <title>中国农业银行</title>

中国银行
Bank of china

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>中国银行全球门户网站</title>
<meta content="中国银行,中行,银行,保险,基金管理,直接投资,投资管理,飞机租赁,外汇,理财,金融,网上银行,网银,电子银行,手机银行,公司金融,个人金融,银行卡" name="keywords" />

どこもcharsetはutf-8で問題なさそうです。