PHP vol.28

  • PHP製作中に使ったもののメモ
    • テキストファイルに書かれたデータをSQLにぶち込む
    • 特殊文字を置換える(htmlspecialchars)
    • headerの前にvar_dumpしてエラーが出た。
    • \nを改行タグに替えてくれる関数

テキストファイルに書かれたデータをSQLにぶち込む。

Step1.MySQL INSERT文に書き換える。

テストテストとか思いつつユーザーとか掲示板の投稿とかを追加しまくっていたら
データベースの追加がめんどくさいことに><
ということでとりあえず変換のPHPを間に合わせで書いてみる。
元々のデータはこういうの。

固有の番号 アカウント パスワード 名前 メルアド 作成日時 削除フラグ(1:on/0:off)
1 crazyup hogehoge くれいじーあっぷ crazyup@example.com 2009-05-28 00:00:00 0

これをテキストファイルでは
1,crazyup,hogehoge,くれいじーあっぷ,crazyup@example.com,2009-05-28 00:00:00,0
みたいな形で書かれていました。
これをMySQLのINSERT文に書き換える必要があるということで作りました。

<?php
$file = file('pass.txt'); //データ読み込み
$fp2 = fopen('pass.txt','w'); //データ吐き出し
foreach($file as $value) {
    list($id,$login_account,$login_pass,$u_name,$e_mail,$create_at,$reload_at,$is_deleted) = explode(",",$value);
    $u_name = mysql_real_escape_string($u_name);
    $e_mail = mysql_real_escape_string($e_mail);
    $login_account = mysql_real_escape_string($login_account);
    $value = "INSERT INTO account(login_account,login_pass,u_name,e_mail,create_at,reload_at,is_deleted) VALUES('$login_account','$login_pass','$u_name','$e_mail','$create_at','$reload_at',$is_deleted);\n";
fputs($fp2,$value);
}
fclose($fp2);
?>

実行するとすぐに変換されるのでそれはどうなのよという面もありますが、問題なく書き換えられたようです。
固有の番号部分はMySQLのauto_incrementを使うことにしたので$idを引き継ぐことはしませんでした。
あと、コード汚いなぁ。

Step2.MySQLにぶち込む

shellで入れる。

mysql5 -uユーザー名 データベース名 < ./pass.txt

これで動いた><

特殊文字を置換える

以前は<>とか、そのまま受け付けてしまってそのまま表示すると
コメント欄に書かれたHTMLタグが有効になってしまい
外部から悪意あるものを実行される可能性があります。
ということで以前はわざわざ以下のように置換えていましたが、

/* 悪影響を及ぼすような文字を特殊文字に置き換えて無効化する */
function replaceSpChara($data) {
    $old = array(",","<",">");
    $new = array("&sbquo;","&lt;","&gt;");
    $get = str_replace($old,$new,$data);
    $put = mysql_real_escape_string($get);
    return $put;
}

簡単にできる関数を教えてもらいました。
PHP: htmlspecialchars - Manual
これを使うと

/* 悪影響を及ぼすような文字を特殊文字に置き換えて無効化する */
function replaceSpChara($data) {
    $get = htmlspecialchars($data);
    $put = mysql_real_escape_string($get);
    return $put;
}

かなり、便利です><

headerの前にvar_dumpするとエラーが出る。

なんでだろうと思っていたら、
PHP: header - Manualに、

覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。

http://jp2.php.net/manual/ja/function.header.php

とあるので、そりゃエラーでるよなと気づきました。

名前の付け方に気をつけよう。

個人的な問題ではありますが、名前の付け方がとてもひどい。
直していかなければいけないなーと思います。

\nを改行タグに替えてくれる関数

PHP: nl2br - Manual

<?php echo nl2br($list['body']); ?>

これで複数行の入力にも対応できる><
広告:http://celebook.info