phpの最近のブログ記事

SQLコマンドをエスケープするのに昨今ではmagic_quotes_gpcでが不十分なため、

MySQL:mysql_real_escape_string
PostageSQL:pg_escape_string
SQLite:sqlite_escape_string

を使ったりする。

そのため、magic_quotes_gpcを一旦解除する必要があり、その際にmagic_quotes_gpcのONOffを調べるのに使用する。


if(get_magic_quotes_gpc()){
   $hoge = stripslashes()$hoge;
}

上記の通りstripslashesでエスケープを一旦解除して、その後今一度エスケープさせる。

| トラックバック(0) |  

ブログなどのRSSをphpで一覧表示する。

<ul>
<?php
$pstsAtomTree = simplexml_load_file('http://spiral-records.com/psts/atom.xml');
for($i=0;$i<3;$i++){
print('<li><a href="'.$pstsAtomTree->entry[$i]->link[href].'">'.$pstsAtomTree->entry[$i]->title.'</a></li>');
}
?>
</ul>

phpにはsimplexml_load_file()という便利な関数がある。

上記例は、これを用いてこのブログのxmlを3件表示するためのコード。

RSSは吐き出されるデータが色々と違う(階層構造など)ので、RSSの中身を見ながらちょいちょいこのコードを修正すればOK。
この例の場合は

$pstsAtomTree->entry[$i]->link[href]

がリンクURLの部分で、
atom.xmlでは

<feed xmlns="http://www.w3.org/2005/Atom">
〜省略〜
<entry>
<title>データの有無や判別</title>
<link rel="alternate" type="text/html" href="http://www.spiral-records.com/psts/2011/12/post_151.html"/>
<id>tag:www.spiral-records.com,2011:/psts//6.1305</id>
<published>2011-12-26T07:13:54Z</published>
<updated>2011-12-27T01:38:34Z</updated>
<summary>is_null()とisset()は変数の値が長さ0の「""」でもtrueになっ...</summary>
<author>
<name>hrbys</name>
</author>
<category term="php" scheme="http://www.sixapart.com/ns/types#category"/>
<content type="html" xml:lang="ja" xml:base="http://www.spiral-records.com/psts/">
<〜コンテンツの中身省略〜
</content>
</entry>

という感じで階層構造になっているので、階層の通りに指定する。
URLはlinkタグのhrefなので、

link[href]

となる。

あああ、メタクソ便利。

| トラックバック(0) |  

is_null()とisset()は変数の値が長さ0の「""」でもtrueになっちゃう。
「""」空の判定はemptyでできるが「0」でもfalseを返しちゃう。

<form method="post" action="">
<input type="text" name="c1" value="">
<p><input type="submit" name="sub2" value="送信する"></p>
</form>
<p><?php
if(empty($_POST[c1])) {
echo "はいっとらんがや";
} else {
echo"はいってるがな";
}
?>
</p>

↑はemptyのテストコードなので、0や空、1でsubmitして見て確かめられる。

strlen()はデータのバイト数を返すので、0バイトなら「無」の判定とか。
strlen()はマルチバイト文字を処理する時のmb_strlen()。
php.iniで「mbstring.func_overload」に値を設定するとstrlen()でもオーバーロードされるようになるみたい。

半角数字はereg()でチェックできるけど

POSIX拡張 正規表現をサポートするereg関数などのPOSIX 正規表現関数は、PHP6.0でコアから消えるらしい。
ereg関数はPHP6.0でコアから消える予定【PHP】 - Programming Magic

なので、

is_numeric()

とか。

<?php
$number = "0120";

if(is_numeric($number)){
echo "数字じゃ";
} else {
echo "数字じゃあらへんねん";
}
?>

is_numercのテストコード↑

| トラックバック(0) |  

base64_encode()

指定した data を base64 でエンコードします。
このエンコードは、メールの本体のように 8 ビットクリーンではないトランスポート層を通じても、 バイナリデータが生き残れるように設計されている。
Base64 でエンコードされたデータは、エンコード前のデータにくらべて 33% 余計に容量が必要。
逆はbase64_decode()関数

serialize()

値の保存可能な表現を生成します。
型や構造を失わずに PHP の値を保存または渡す際に有用です。
シリアル化された文字列を PHP の値に戻すには、 unserialize() を使用。

いずれもphp.netのマニュアルより引用。


<?php
$array = array("menu"=>"オノナツメの単行本", "price"=>"1000");
echo "<h2>base64_encodeとserializeでエンコードした場合</h2>";
print_r(unserialize(base64_decode($_POST["ar_enc"])));
echo "<h2>serializeしただけの場合</h2>";
print_r($_POST["ar-s"]);
echo "<h2>エンコードしなかった場合</h2>";
print_r($_POST["ar"]);
?>
<form method="post" action="">
<input type="hidden" name="ar_enc" value="<?php echo base64_encode(serialize($array)) ?>">
<input type="hidden" name="ar-s" value="<?php echo serialize($array) ?>">
<input type="hidden" name="ar" value="<?php echo $array ?>">
<p><input type="submit" name="sub1" value="送信する"></p>
</form>

これを試すと違いがわかる。

サンプル実行ページ

| トラックバック(0) |  

要素の値を取得

foreach( 配列 as $value ) { // 配列の終わりまで、繰り返し処理。 }

インデックスと要素の値を取得

foreach( 配列 as $key => $value ) { // 配列の終わりまで、繰り返し処理。 }

「continue (スキップ)」・「break (中断)」も利用でき、それを使った例。
text1は飛ばして、text4で中断なので、ポストされた配列のうち、text2とtext3の2つだけ表示される。breakはbreakに指定されたものも実行しないので、指定したものを実行して中断ではない。

<?php
foreach($_POST as $data => $val){
if($data == text1) continue;
if($data == text4) break;
echo $data."=".$val.'<br>';
}
?>
<form method="post" action="">
<input type="text" name="text1" />
<input type="text" name="text2" />
<input type="text" name="text3" />
<input type="text" name="text4" />
<input type="text" name="text5" />
<input type="submit" name="sub1" value="送信する" />
</form>

上記コードはこちらでテストできる。→http://www.spiral-records.com/psts-lib/php/111225.php

なお、説明文はこちらのほぼパクリ。
初心者向けPHPナビ - PHP - foreach 文
このサイトが一番わかりやすかったので。

| トラックバック(0) |  

コード表示のためのhtml特殊文字変換ツールを作った。
... というか、作ったとかいうほどのもんじゃないな。

コード表示のためのhtml特殊文字変換ツール

まあ自分用。

ポイントは

htmlspecialchars()

を2回繰り返すところと、\が表示されないように

stripslashes()・・・\(バックスラッシュ)でクォートされた文字列からクォート部分を取り除いて返す関数。

を使っているところ。

抜粋ソースは以下の通り。


<form action="" method="post">
<textarea cols="70" rows="10" name="codes"></textarea>
<input type="submit" id="submitbtn" value="変換する" />
<input type="reset" value="クリア">
</form>

<?php
$before = stripslashes($_POST["codes"]);
$after = htmlspecialchars($before,ENT_QUOTES);
?>
<?php
if($before) {
echo '<div id="afterarea">';
echo '<h2>変換後</h2>';
echo '<pre>';
echo (htmlspecialchars($after,ENT_QUOTES));
echo '</pre>';
echo '</div>';
echo '<div id="beforearea">';
echo '<h2>変換前</h2>';
echo '<pre>';
echo $after;
echo '</pre>';
echo '</div>';
}
?>


| トラックバック(0) |  

count()は、指定した配列の要素数を数える関数。

<?php
for($i = 0 ; $i < count($_POST["check"]); $i ++) {
echo ($_POST["check"][$i] . "が選択されました。");
}
?>
<form method="post" action="<?php echo $_SERVER["PHP_SELF"] ?>">
<input type="checkbox" name="check[]" value="ヨーロッパ">ヨーロッパ
<input type="checkbox" name="check[]" value="日本">日本
<input type="checkbox" name="check[]" value="アフリカ">アフリカ
<input type="checkbox" name="check[]" value="アメリカ">アメリカ
<input type="submit" value="送信する">
</form>

inputのcheckboxは

name="check[]"

と[]をつけることで配列にセットされる。


action=""



action=""
action="そのページのURL"

いずれとも一緒。


| トラックバック(0) |  

配列された中身を表示。

print_r(get_defined_functions());
print(get_defined_functions());

上記2つを実行すれば、print()関数とprint_r()関数のその違いがわかる。

ちなみに、get_defined_functions()は定義されている関数を表示するもので、PHP関数にはinternal、ユーザー定義関数にはuserというインデックスがつけられているため、

$array = get_defined_functions();
print_r($array["user"]);

とすれば、ユーザー定義関数のみ、表示される。

で、print_rに近いので

var_dump

があるが、こっちは簡単にいうともっと詳しくしてくれる感じ。

$classname = "myclass";

print_r($classname);

var_dump($classname);

実行すると

myclass
string(7) "myclass"

$classname = array("今度","そのうち","いつかは");
print_r($classname);
var_dump($classname);

実行すると

Array ( [0] => 今度 [1] => そのうち [2] => いつかは )
array(3) { [0]=> string(6) "今度" [1]=> string(12) "そのうち" [2]=> string(12) "いつかは" }

となる。

| トラックバック(0) |  

call_user_func()

ユーザーが定義した関数を呼び出す。



function your_name(){ //ユーザー定義関数名
echo("わたしはボブでございまっせ。");
}

call_user_func("your_name");

処理させた値を受け取るにはreturnで値を指定する。



function get_total_charge($kingaku) {
$total = $kingaku*1.05;
return $total;
}

echo ("(1)".call_user_func("get_total_charge",10000));
echo ("(2)".get_total_charge(10000));

(1)(2)どちらも同じ結果。


引用:phpによるwebアプリケーションスーパーサンプル

| トラックバック(0) |  

数値を***円見たいな通貨表示するのに、カンマで区切りたい。

phpは


number_format(数値)

また

money_format(フォーマット,通貨)


javascriptは以下のコードが一番シンプルでよいかも。


function num3(str) {
var num = new String(str).replace(/,/g,"");
while(num != (num = num.replace(/^(-?\d+)(\d{3})/,"$1,$2")));
return num;
}

引用:Javascriptで金額表示に使う3桁区切り、カンマ挿入

| トラックバック(0) |  

MagpieRSS、かなり古いんだけどケースバイケースで利用するのもありかなと。
で、ひとつ、ひっかかったところのメモ。

Magipie RSS

| トラックバック(0) |  

$_FILESのこと忘れとったのでメモ。
意外とこういうとこ忘れて先進もうとするわたしおばかさん。

$_FILESは連想配列で内訳は
$_FILES['要素名']['情報名'];

情報名と得られる値は以下の通り

情報名 得られる値
name 選んだファイル名
type アップロードしたファイルのMIMEタイプ
size アップロードしたファイルのサイズ
tmp_name サーバに一時保存されたファイル名
error アップロード時に発生したエラーコード


引用元:http://bismarck08.blog72.fc2.com/blog-entry-12.html

こっちの説明意味不。→http://jp.php.net/manual/ja/reserved.variables.files.php

| トラックバック(0) |  
Powered by Movable Type 4.261

Tumblr : log long long time ago