MySQLを扱うPHP関数おぼえがき
よく忘れてしまうので、
PHPからMySQLを使う時に、
よく使う関数の一覧とカンタンなメモ。
mysql_affected_rows()
直前で実行されたSQLの変更件数が分かる。
update(更新)とかinsert(挿入)とかdelete(削除)。
selectの件数は、この関数では取得できない。
( mysql_num_rows() を使う )
例:
update [table] set 商品属性 = '冷凍' where 商品CD = '8001'
と実施した後に、
$aaa = mysql_affected_rows(); を行うと、
updateした件数が変数$aaaに入る。
失敗した場合は、-1。
sql文を書き間違えていても、-1。
update,deleteしてない場合は、0。
注意点:
1)
update時において、tableに入っている値と同じ値で更新した場合、
mysql_affected_rows()
が返す値は、「0」。
上書き更新していない、という事だろう。
2)
insert時において、一意制約の場合
(tableにユニーク設定、プライマリー設定している場合に、
すでに存在 しているユニークな値を入れようとした時に発生するエラー)
mysql_affected_rows()
が返す値は、「−1」。 構文エラーなどと同じ処理になる。
使い方:
1)何件更新したか、削除したかを表示させる。
2)プログラムミスで、大量に更新してしまうことを検知。
作り方にもよるが、だいたいwebサービスの場合のupdateは、
1件ずつじゃなかろうか。
そういう場合は、updateの後で、
mysql_affected_rows()の値を取得して、
「1」じゃない場合は、強制的に処理を終わらせたり、ログを書き残す。
回避したい場合は、事前にselectで件数を調べてから、updateするのが良いが、
その場合、ワンアクション処理が遅くなる。
なので、結果的に、大量更新されてしまうが、その状況をいち早く検知し、
次の状態を防ぐ事ができる、のは、まぁ重要かと。
3)一意制約を検知する。
どちらが確実になるのかわからないが、
insert時における、一意制約エラーを検知するために、
いままでは、 mysql_errno() を使っていた。
こちらを使ってもいけるかも。
※mysql_errno()での、1062と1022が、一意制約エラー。
※(エラーが無い場合は、0)
他で、忘れそうな、MysqlのPHP関数は、
前述した
mysql_errno()
と、
( mysql_err()だと、コメントが出る。けど、ログに吐くぐらい。 )
直前に実行した、select件数が格納される
mysql_num_rows()
あとは、
SQLを安全に実行させるエスケープ処理や
実行管理系(mysql_query()、mysql_result() )や、
selectで取得したデータを1行ずつ処理するための関数などが
あるけど、
このあたりは、またあとで。
PHPからMySQLを使う時に、
よく使う関数の一覧とカンタンなメモ。
mysql_affected_rows()
直前で実行されたSQLの変更件数が分かる。
update(更新)とかinsert(挿入)とかdelete(削除)。
selectの件数は、この関数では取得できない。
( mysql_num_rows() を使う )
例:
update [table] set 商品属性 = '冷凍' where 商品CD = '8001'
と実施した後に、
$aaa = mysql_affected_rows(); を行うと、
updateした件数が変数$aaaに入る。
失敗した場合は、-1。
sql文を書き間違えていても、-1。
update,deleteしてない場合は、0。
注意点:
1)
update時において、tableに入っている値と同じ値で更新した場合、
mysql_affected_rows()
が返す値は、「0」。
上書き更新していない、という事だろう。
2)
insert時において、一意制約の場合
(tableにユニーク設定、プライマリー設定している場合に、
すでに存在 しているユニークな値を入れようとした時に発生するエラー)
mysql_affected_rows()
が返す値は、「−1」。 構文エラーなどと同じ処理になる。
使い方:
1)何件更新したか、削除したかを表示させる。
2)プログラムミスで、大量に更新してしまうことを検知。
作り方にもよるが、だいたいwebサービスの場合のupdateは、
1件ずつじゃなかろうか。
そういう場合は、updateの後で、
mysql_affected_rows()の値を取得して、
「1」じゃない場合は、強制的に処理を終わらせたり、ログを書き残す。
回避したい場合は、事前にselectで件数を調べてから、updateするのが良いが、
その場合、ワンアクション処理が遅くなる。
なので、結果的に、大量更新されてしまうが、その状況をいち早く検知し、
次の状態を防ぐ事ができる、のは、まぁ重要かと。
3)一意制約を検知する。
どちらが確実になるのかわからないが、
insert時における、一意制約エラーを検知するために、
いままでは、 mysql_errno() を使っていた。
こちらを使ってもいけるかも。
※mysql_errno()での、1062と1022が、一意制約エラー。
※(エラーが無い場合は、0)
他で、忘れそうな、MysqlのPHP関数は、
前述した
mysql_errno()
と、
( mysql_err()だと、コメントが出る。けど、ログに吐くぐらい。 )
直前に実行した、select件数が格納される
mysql_num_rows()
あとは、
SQLを安全に実行させるエスケープ処理や
実行管理系(mysql_query()、mysql_result() )や、
selectで取得したデータを1行ずつ処理するための関数などが
あるけど、
このあたりは、またあとで。
tumblrのcaptionやtagsを書き換える場合
注意:以下の内容は、tumblr API V1です。
注意:すみません、プログラムの参考にした場所を忘れてしまったので、
参考にした時と、同じコードを自分で作ったかのように記載しております。
何か問題がありましたら、ご連絡ください。
photoのcaptionやtagをAPIで書き換える方法。
仕様上は、オプションと書いてあるが、気をつける事が2点。
書き換える際に、
click-through-url
date
を、元のpostから持ってきて、一緒に更新しないと、あまりよくない。
何も設定しないと、
click-through-url
は、クリア、
date
は、更新した日付時刻になってしまう。
tumblrのblog上では、このDate順に
表示されるため、一番上に表示されるようになる。
click-through-urlが、クリアされると、photoなどをクリックしても、
引用元のサイトには遷移しない。あまりよろしくない。
よって、
まず、更新する前に、
$req_url = http://".$tumblrname.".tumblr.com/api/read?id=".$id;
$xml = simplexml_load_file($req_url);
$photolinkurl = $xml->posts->post[0]->{'photo-link-url'};
$date = $xml->posts->post[0]->attributes()->{"date-gmt"};
のように、2つを取得しておく事。
その上で、
$request_multipart = array(
'email' => $tumblr_email,
'password' => $tumblr_password,
'post-id' => $id,
'click-through-url' => $photolinkurl,
'date' => $date,
'caption' => $photocaption1,
'tags' => $tags1 );
$c = curl_init('http://www.tumblr.com/api/write');
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $request_multipart);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$result1 = curl_exec($c);
$status = curl_getinfo($c, CURLINFO_HTTP_CODE);
if (curl_errno($c)) { echo curl_error($c)."
\n"; exit(); }
curl_close($c);
を実施する。(ここのコードは、tumblrAPIからの使い回し)
なお、その後のステータス処理は、
$status == 201 が成功。
$status == 403 は、Invalid post-id or reblog-key specified. (idとか違います)
$status == 503 は、over capacity。(tumblr側のサーバ負荷大)
$status == 400 は、Rate limit exceeded (今日のリミットを超えました)
※更新もリミット数に含まれたりしている?
※公式には、以下のように書いているが、変わった?
400 Bad Request -
There was at least one error while trying to save your post
注意:すみません、プログラムの参考にした場所を忘れてしまったので、
参考にした時と、同じコードを自分で作ったかのように記載しております。
何か問題がありましたら、ご連絡ください。
photoのcaptionやtagをAPIで書き換える方法。
仕様上は、オプションと書いてあるが、気をつける事が2点。
書き換える際に、
click-through-url
date
を、元のpostから持ってきて、一緒に更新しないと、あまりよくない。
何も設定しないと、
click-through-url
は、クリア、
date
は、更新した日付時刻になってしまう。
tumblrのblog上では、このDate順に
表示されるため、一番上に表示されるようになる。
click-through-urlが、クリアされると、photoなどをクリックしても、
引用元のサイトには遷移しない。あまりよろしくない。
よって、
まず、更新する前に、
$req_url = http://".$tumblrname.".tumblr.com/api/read?id=".$id;
$xml = simplexml_load_file($req_url);
$photolinkurl = $xml->posts->post[0]->{'photo-link-url'};
$date = $xml->posts->post[0]->attributes()->{"date-gmt"};
のように、2つを取得しておく事。
その上で、
$request_multipart = array(
'email' => $tumblr_email,
'password' => $tumblr_password,
'post-id' => $id,
'click-through-url' => $photolinkurl,
'date' => $date,
'caption' => $photocaption1,
'tags' => $tags1 );
$c = curl_init('http://www.tumblr.com/api/write');
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $request_multipart);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$result1 = curl_exec($c);
$status = curl_getinfo($c, CURLINFO_HTTP_CODE);
if (curl_errno($c)) { echo curl_error($c)."
\n"; exit(); }
curl_close($c);
を実施する。(ここのコードは、tumblrAPIからの使い回し)
なお、その後のステータス処理は、
$status == 201 が成功。
$status == 403 は、Invalid post-id or reblog-key specified. (idとか違います)
$status == 503 は、over capacity。(tumblr側のサーバ負荷大)
$status == 400 は、Rate limit exceeded (今日のリミットを超えました)
※更新もリミット数に含まれたりしている?
※公式には、以下のように書いているが、変わった?
400 Bad Request -
There was at least one error while trying to save your post
自分のtumblr上でダブり投稿を検知する方法
自分のtumblrBlog上でのダブり投稿を見つけ出す方法。
やっぱり、reblog_keyを使うのがお勧め。
tumblr apiで取得できる、
postごとの、
「reblog_key」 (V1もV2も同じ)
が、
世界中全てのtumblrBlogの中でのユニークキー。
いまの所、アルファベットの大文字と小文字と数字で構成。
8桁。
ただし、今後、増えたら、たぶん桁を増やすんだと思う。
このreblog_keyが同じpostは、ダブり。
たぶん、tumblrのsystemでは、
このreblog_keyで管理していて、notesのカウントは、この単位のはず。
※未確認だが、reblogツリーの中のコメントは、もしかすると、新しいidの方で
表示されるような気がする。昔のidのままだと、そのidよりも新しく書きこまれた
コメントは表示されていないかも。。。
なお、idは、blogの1pageを示すようなもの。
同じモノをreblogした場合、idは変わる。新しく振られる。
blogを削除したい場合は、このidを指定して削除。
すると、ダブりの方だけ削除できる。
また、reblogされたときに、postの形式(photoやtextなど)を
変更することが可能。なので、同じreblog_keyでも、postのtypeが
違う事もありえる。( text,link,quoteのみらしいが未確認)
一番カンタンなダブりチェックは、よって、
reblog_keyを、自分のデータベース内に格納して、ダブりチェックする
というのが、ベターか。
もしくは、javascript等でブラウザ内かクッキーににreblog_keyを
貯めこみ、reblogする際にチェックするとか?
別の方法:(だけど面倒)
tumblrAPIではtypeがphotoの場合、
その画像の置き場所として、photo_urlを取得する事ができる。
このURLを見ると、
widthのサイズが500までは、tumblrサーバに格納されているが、
これを超える、大元の画像は、amazonのクラウドに格納されている。
ここのURLを指し示す場合、自分のtumblrBlog名が記載されている
ため、単純にreblogする前に、photo-urlをチェックしようとしても、
reblog元のtumblrBlog名が入っているため、一致しない。
が、まぁ、その辺りを外しても大丈夫では無いかと思うが、
昔のpostなどでは、形式が違っていて、XMLのtag取得ができない
ケースもあった。
が、そのURLの中のハッシュ?のような文字列は、どうも同じようなので
ここを見つけて、ダブりチェックする、という手もある。
が、
そこまでするよりかは、
tubmlrのsystem自体が用意してくれている、reblog_keyを使うのが、
妥当。
さらにまた別の方法:
tumblrAPIには、photo-link-urlというDataも取得する事が
できる。これは、photoの場合だと、本当の大元のサイトのリンク情報。
(画像等をクリックした時の遷移先)
しかし、、、
人によって、サイト(HTML)でpostしたり、画像(jpg)でpostしたりして
いるため、この部分でのダブりチェックは難易度が高い。
livedoorやfc2の場合、jpgは別サーバに格納されているようだし。
補足:
世界中のいろいろな人のtumblrのデータを見てみたところ、
同じDataだが、reblog_keyが違うケースがある。
これは、
(サーバ資源の無駄遣いではあるが)
正しいreblogをしていない場合で、
tumblrのblogのPhotoなどに対して、postしている状態。
この場合は、新しくreblog_keyが振られ、
さらに、Dataの格納場所も変更される。
もったいないので、気をつけよう。
あとは、
なんとか、サーバサイドでの、類似画像チェックプログラムを
作って、そこでなんとかごにょごにょすれば、できると思うが、
難易度が高い。。。
やっぱり、reblog_keyを使うのがお勧め。
tumblr apiで取得できる、
postごとの、
「reblog_key」 (V1もV2も同じ)
が、
世界中全てのtumblrBlogの中でのユニークキー。
いまの所、アルファベットの大文字と小文字と数字で構成。
8桁。
ただし、今後、増えたら、たぶん桁を増やすんだと思う。
このreblog_keyが同じpostは、ダブり。
たぶん、tumblrのsystemでは、
このreblog_keyで管理していて、notesのカウントは、この単位のはず。
※未確認だが、reblogツリーの中のコメントは、もしかすると、新しいidの方で
表示されるような気がする。昔のidのままだと、そのidよりも新しく書きこまれた
コメントは表示されていないかも。。。
なお、idは、blogの1pageを示すようなもの。
同じモノをreblogした場合、idは変わる。新しく振られる。
blogを削除したい場合は、このidを指定して削除。
すると、ダブりの方だけ削除できる。
また、reblogされたときに、postの形式(photoやtextなど)を
変更することが可能。なので、同じreblog_keyでも、postのtypeが
違う事もありえる。( text,link,quoteのみらしいが未確認)
一番カンタンなダブりチェックは、よって、
reblog_keyを、自分のデータベース内に格納して、ダブりチェックする
というのが、ベターか。
もしくは、javascript等でブラウザ内かクッキーににreblog_keyを
貯めこみ、reblogする際にチェックするとか?
別の方法:(だけど面倒)
tumblrAPIではtypeがphotoの場合、
その画像の置き場所として、photo_urlを取得する事ができる。
このURLを見ると、
widthのサイズが500までは、tumblrサーバに格納されているが、
これを超える、大元の画像は、amazonのクラウドに格納されている。
ここのURLを指し示す場合、自分のtumblrBlog名が記載されている
ため、単純にreblogする前に、photo-urlをチェックしようとしても、
reblog元のtumblrBlog名が入っているため、一致しない。
が、まぁ、その辺りを外しても大丈夫では無いかと思うが、
昔のpostなどでは、形式が違っていて、XMLのtag取得ができない
ケースもあった。
が、そのURLの中のハッシュ?のような文字列は、どうも同じようなので
ここを見つけて、ダブりチェックする、という手もある。
が、
そこまでするよりかは、
tubmlrのsystem自体が用意してくれている、reblog_keyを使うのが、
妥当。
さらにまた別の方法:
tumblrAPIには、photo-link-urlというDataも取得する事が
できる。これは、photoの場合だと、本当の大元のサイトのリンク情報。
(画像等をクリックした時の遷移先)
しかし、、、
人によって、サイト(HTML)でpostしたり、画像(jpg)でpostしたりして
いるため、この部分でのダブりチェックは難易度が高い。
livedoorやfc2の場合、jpgは別サーバに格納されているようだし。
補足:
世界中のいろいろな人のtumblrのデータを見てみたところ、
同じDataだが、reblog_keyが違うケースがある。
これは、
(サーバ資源の無駄遣いではあるが)
正しいreblogをしていない場合で、
tumblrのblogのPhotoなどに対して、postしている状態。
この場合は、新しくreblog_keyが振られ、
さらに、Dataの格納場所も変更される。
もったいないので、気をつけよう。
あとは、
なんとか、サーバサイドでの、類似画像チェックプログラムを
作って、そこでなんとかごにょごにょすれば、できると思うが、
難易度が高い。。。
PHPでtumblrAPIのData取得方法(V1)(XML)
注意:以下の内容は、tumblr API V1です。
注意:すみません、プログラムの参考にした場所を忘れてしまったので、
参考にした時と、同じコードを自分で作ったかのように記載しております。
何か問題がありましたら、ご連絡ください。
tumblrAPIのV1仕様。の、PHPでの取得。(XML版)
まず、
$req_url = http://".$tumblrname.".tumblr.com/api/read?start=".$start."&num=50&type=photo;
のように、変数を用いて、URLを作成。
その後、PHPのXMLを解釈する関数に投げ込む。
$xml = simplexml_load_file($req_url);
これで、$xmlの中に、データが格納される。
とりあえず、firefox等で上記のURLを見てみると、XML構造が
わりかし分かると思うので、まずはそれを見てからだが、
この$xmlからデータを抜き出すには、
まず、num=50で取得しているので、postが、50個ある。
ので、
for ($i = 0 ; $i < count($xml->posts->post); $i++) {
処理
}
という感じで、forを回す。
countは、この$xmlの中の最大post数をカウントする関数。
$i++で、$iの値が1個ずつ、1個のpostずつアップしていく。
forの中の処理は、
postのヘッダ情報は、このようなカタチで。
$date = $xml->posts->post[$i]->attributes()->{"date-gmt"};
$reblogkey = $xml->posts->post[$i]->attributes()->{"reblog-key"};
$type = $xml->posts->post[$i]->attributes()->{"type"};
$id = $xml->posts->post[$i]->attributes()->{"id"};
postの下にぶら下がっている各種情報は、このよなカタチで。
$photourl4 = $xml->posts->post[$i]->{'photo-url'}[4];
※ホントのXMLはphoto-url max-width="100"などと入っているが、
max-widthでの取得方法がよくわからないので、上から5番目を取得。(0からスタート)
※一番小さい、正方形サイズのURLや、最大の大元のURLなどがあるが、
この数は、どうも途中で仕様変更?があったようで、昔のを見たら、数が違う。。。
$photourl = $xml->posts->post[$i]->{'photo-url'};
※このように記すと、一番上のデータが取得できる。一番上は、一番大きなサイズのデータ。
$photolinkurl = $xml->posts->post[$i]->{'photo-link-url'};
※リンク元。これは1個しかないので、普通に。
$tag1 = $xml->posts->post[$i]->{'tag'}[0];
※タグは、たくさん入れる事ができる。ので、取得するには、このように一番初めを
取得するなり、[0]のところに、さらに変数を入れて、forで取得するとか。
$photocaption = strip_tags (strval($xml->posts->post[$i]->{"photo-caption"}) ) ;
$photocaption = str_replace(array("\r\n","\r","\n"), '', $photocaption);
※photo-captionには、HTMLコードが入っている。
HTMLコードを外したかったので、上記では、色々やっている。
typeがphotosetの場合:
※photoset形式とは、1つのpostの中に、複数のphotoが入っているモノ。
この場合、以下のようなカタチで、それぞれのURLが取得できる。
が、こちらも、tagと同じ?ように、限界数がわからないので、
全部取得するなら、forで回すのが吉。
$photoset1 = $xml->posts->post[$i]->photoset->photo[0]->{'photo-url'} ;
$photoset2 = $xml->posts->post[$i]->photoset->photo[1]->{'photo-url'} ;
なお、他にもtextやquoteなどのpostのtypeがある。
タグ名は違うが、XML構造は、大体同じなので、上記を参考に。
注意:すみません、プログラムの参考にした場所を忘れてしまったので、
参考にした時と、同じコードを自分で作ったかのように記載しております。
何か問題がありましたら、ご連絡ください。
tumblrAPIのV1仕様。の、PHPでの取得。(XML版)
まず、
$req_url = http://".$tumblrname.".tumblr.com/api/read?start=".$start."&num=50&type=photo;
のように、変数を用いて、URLを作成。
その後、PHPのXMLを解釈する関数に投げ込む。
$xml = simplexml_load_file($req_url);
これで、$xmlの中に、データが格納される。
とりあえず、firefox等で上記のURLを見てみると、XML構造が
わりかし分かると思うので、まずはそれを見てからだが、
この$xmlからデータを抜き出すには、
まず、num=50で取得しているので、postが、50個ある。
ので、
for ($i = 0 ; $i < count($xml->posts->post); $i++) {
処理
}
という感じで、forを回す。
countは、この$xmlの中の最大post数をカウントする関数。
$i++で、$iの値が1個ずつ、1個のpostずつアップしていく。
forの中の処理は、
postのヘッダ情報は、このようなカタチで。
$date = $xml->posts->post[$i]->attributes()->{"date-gmt"};
$reblogkey = $xml->posts->post[$i]->attributes()->{"reblog-key"};
$type = $xml->posts->post[$i]->attributes()->{"type"};
$id = $xml->posts->post[$i]->attributes()->{"id"};
postの下にぶら下がっている各種情報は、このよなカタチで。
$photourl4 = $xml->posts->post[$i]->{'photo-url'}[4];
※ホントのXMLはphoto-url max-width="100"などと入っているが、
max-widthでの取得方法がよくわからないので、上から5番目を取得。(0からスタート)
※一番小さい、正方形サイズのURLや、最大の大元のURLなどがあるが、
この数は、どうも途中で仕様変更?があったようで、昔のを見たら、数が違う。。。
$photourl = $xml->posts->post[$i]->{'photo-url'};
※このように記すと、一番上のデータが取得できる。一番上は、一番大きなサイズのデータ。
$photolinkurl = $xml->posts->post[$i]->{'photo-link-url'};
※リンク元。これは1個しかないので、普通に。
$tag1 = $xml->posts->post[$i]->{'tag'}[0];
※タグは、たくさん入れる事ができる。ので、取得するには、このように一番初めを
取得するなり、[0]のところに、さらに変数を入れて、forで取得するとか。
$photocaption = strip_tags (strval($xml->posts->post[$i]->{"photo-caption"}) ) ;
$photocaption = str_replace(array("\r\n","\r","\n"), '', $photocaption);
※photo-captionには、HTMLコードが入っている。
HTMLコードを外したかったので、上記では、色々やっている。
typeがphotosetの場合:
※photoset形式とは、1つのpostの中に、複数のphotoが入っているモノ。
この場合、以下のようなカタチで、それぞれのURLが取得できる。
が、こちらも、tagと同じ?ように、限界数がわからないので、
全部取得するなら、forで回すのが吉。
$photoset1 = $xml->posts->post[$i]->photoset->photo[0]->{'photo-url'} ;
$photoset2 = $xml->posts->post[$i]->photoset->photo[1]->{'photo-url'} ;
なお、他にもtextやquoteなどのpostのtypeがある。
タグ名は違うが、XML構造は、大体同じなので、上記を参考に。


