合計 昨日 今日

naohiro19
 
記事: 243
登録日時: 2010年10月16日(土) 20:16
お住まい: 愛知県
日記: 日記を見る (110)
日記
- 11月 2017
+ 10月 2017
+ 8月 2017
+ 7月 2017
+ 6月 2017
+ 5月 2017
+ 1月 2017
+ 9月 2016
+ 8月 2016
+ 7月 2016
+ 6月 2016
+ 5月 2016
+ 4月 2016
+ 9月 2015
+ 8月 2015
+ 7月 2015
+ 6月 2015
+ 11月 2014
+ 10月 2014
+ 8月 2014
+ 7月 2014
+ 6月 2014
+ 5月 2014
+ 4月 2014
+ 3月 2014
+ 12月 2013
+ 10月 2013
+ 9月 2013
+ 7月 2013
+ 6月 2013
+ 5月 2013
+ 10月 2012
+ 8月 2012
+ 7月 2012
+ 6月 2012
+ 5月 2012
+ 11月 2011
カテゴリー
講座
7 記事
勉強
3 記事
プログラミング
26 記事
フィード
次へ

PHPでINSERT文を自動生成する関数を作ってみました。

パーマリンクby naohiro19 on 2017年11月12日(日) 20:21 カテゴリー: プログラミング

ソースを載せておきます。
コード[PHP]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
 
function insertSql(
            string $table = null,
            array $columns = array(),
            string $priority = null,
            array $partitions = array(),
            array $onDuplicateKeyUpdate = array())
{
    $sql = "INSERT ";
    if (!empty($priority)) {
        if (preg_match('/\A([low]+)\z/i', $priority)) {
            $sql .= 'LOW_PRIORITY ';
        } elseif (preg_match('/\A([delayed]+)\z/i', $priority)) {
            $sql .= 'DELAYED ';
        } elseif (preg_match('/\A([high]+)\z/i', $priority)) {
            $sql .= 'HIGH_PRIORITY ';
        } elseif (preg_match('/\A([ignore]+)\z/i', $priority)) {
            $sql .= 'IGNORE ';
        }
    }
    if (!empty($table)) {
        $sql .= 'INTO '. $table . ' ';
    }
 
    if (!empty($partitions)) {
        $sql .= 'PARTITION (';
        foreach ($partitions as $partition) {
            $sql .= sprintf('`%s`, ', $partition);
        }
        $sql = preg_replace('/,\s$/','', $sql);
        $sql .= ') ';
    }
    if (is_array($columns)) {
        $sql .= 'SET ';
        foreach ($columns as $column => $value) {
            $sql .= sprintf('`%s` = ?, ', $column);
        }
        $sql = preg_replace('/,\s$/','', $sql);
    }
    if (!empty($onDuplicateKeyUpdate)) {
        $sql .= 'ON DUPLICATE KEY UPDATE ';
        foreach ($onDuplicateKeyUpdate as $key => $value) {
            $sql .= sprintf('`%s` = %s, ', $key);
        }
        $sql = preg_replace('/,\s$/','', $sql);
    }
    return $sql;
}

31行目、39行目、46行目は、カンマと半角スペースが最後の文字として追加されてしまうのでそのための文字を整形しています。

コード[PHP]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
I<?php
require_once 'mysql/sql/sql.php';
 
$parameter = [
    'name' => 'テスト',
    'email' => <!-- e --><a href=\"mailto:'naolin_17_1986@yahoo.co.jp\">'naolin_17_1986@yahoo.co.jp</a><!-- e -->',
   'url' => 'http://www.yahoo.co.jp',
   'password' => '1234',
   'main' => '今日もがんばろう',
   'time' => 'CURRENT_TIMESTAMP()',
   'ip' => $_SERVER['REMOTE_ADDR']
];
$sql = insertSql('users', $parameter);
 
echo  $sql;

実行結果:
コード[Text]: 全て選択
1
INSERT INTO users SET `name` = ?, `email` = ?, `url` = ?, `password` = ?, `main` = ?, `time` = ?, `ip` = ?


insertSqlで返される文字は PDO::prepareメソッドを呼び出すのに適しています。
最後に編集したユーザー naohiro19 [ 2017年11月12日(日) 20:29 ], 累計 1 回

コメント数: 0 閲覧数: 109

[PHP] データベース設定クラス

パーマリンクby naohiro19 on 2017年10月29日(日) 11:41 カテゴリー: プログラミング

PHPのデータベースに接続するためのPDOのデータソース名の指定が各データベースで異なっているので楽にするために作りました。
コード[PHP]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
<?php
 
class Config
{
    /** @var array */
    private $configs;
 
    /** @var string */
    private $dsn;
 
    /**
     * データソース名を適切なものを取得する
     * (MySQL/PostgreSQL/CUBRID/SQLite 3/SQLite 2/Oracleに対応)
     * @return mixed
     */
    public function buildDsn()
    {
        if (preg_match('/^(MySQL)+$/', $this->configs['type'])) {
            // MySQLの場合
            $this->dsn = 'mysql:';
            if (! empty($this->configs['server'])) {
                $this->dsn .= 'host=' . $this->checkVar($this->configs['server']);
            }
            if (! empty($this->configs['port'])) {
                $this->dsn .= 'port=' . $this->checkVar($this->configs['port']);
            }
            if (! empty($this->configs['dbname'])) {
                $this->dsn .= 'dbname=' . $this->checkVar($this->configs['dbname']);
            }
            if (! empty($this->configs['charset'])) {
                $this->dsn .= 'charset=' . $this->checkVar($this->configs['charset']);
            }
            if (! empty($this->configs['socket'])) {
                $this->dsn .= 'unix_socket=' . $this->checkVar($this->configs['socket']);
            }
        } elseif (preg_match('/^(PostgreSQL)+$/', $this->configs['type'])) {
            // PostgreSQLの場合
            $this->dsn = 'pgsql:';
            if (! empty($this->configs['server'])) {
                $this->dsn .= 'host=' . $this->checkVar($this->configs['server']);
            }
            if (! empty($this->configs['port'])) {
                $this->dsn .= 'port=' . $this->checkVar($this->configs['port']);
            }
            if (! empty($this->configs['dbname'])) {
                $this->dsn .= 'dbname=' . $this->checkVar($this->configs['dbname']);
            }
            if (! empty($this->configs['username'])) {
                $this->dsn .= 'user=' . $this->checkVar($this->configs['username']);
            }
            if (! empty($this->configs['password'])) {
                $this->dsn .= 'password=' . $this->checkVar($this->configs['password']);
            }
        } elseif (preg_match('/^(CUBRID)+$/', $this->configs['type'])) {
            $this->dsn = 'cubrid:';
            if (! empty($this->configs['server'])) {
                $this->dsn .= 'host=' . $this->checkVar($this->configs['server']);
            }
            if (! empty($this->configs['port'])) {
                $this->dsn .= 'port=' . $this->checkVar($this->configs['port']);
            }
            if (! empty($this->configs['dbname'])) {
                $this->dsn .= 'dbname=' . $this->checkVar($this->configs['dbname']);
            }
        } elseif (preg_match('/^(SQLite 3)+$/', $this->configs['type'])) {
            // SQLite 3の場合
            $this->dsn = 'sqlite:';
            if (! empty($this->configs['dbname'])) {
                $this->dsn .= $this->checkVar($this->configs['dbname']);
            }
        } elseif (preg_match('/^(SQLite 2)+$/', $this->configs['type'])) {
            // SQLite 2の場合
            $this->dsn = 'sqlite2:';
            if (! empty($this->configs['dbname'])) {
                $this->dsn .= $this->checkVar($this->configs['dbname']);
            }
        } elseif (preg_match('/^(Oracle)+$/', $this->configs['type'])) {
            // Oracleデータベースの場合
            $this->dsn = 'oci:';
            if (! empty($this->configs['dbname'])) {
                $this->dsn .= 'dbname=' . $this->checkVar($this->configs['dbname']);
            }
            if (! empty($this->configs['charset'])) {
                $this->dsn .= 'charset=' . $this->checkVar($this->configs['charset']);
            }
        }
        return preg_replace('/;$/', '', $this->dsn);
    }
 
    /**
     * データベースユーザー名を取得
     * @return string
     */
    public function buildUserName()
    {
        return (string)$this->configs['username'];
    }
 
    /**
     * 変数にセットされているかチェック
     *  (buildDsnメソッド内で使用)
     * @param $var
     * @return string
     */
    private function checkVar($var)
    {
        // 渡されたものが nullもしくは空っぽの場合
        if (is_null($var) || empty($var)) {
            return $var . '';
        } elseif (isset($var)) {
            return $var . ';';
        }
        return $var;
    }
 
    /**
     * Unixソケットを設定する
     * @param null $socket
     * @return $this
     */
    public function databaseSocket($socket = null)
    {
        if (! empty($socket)) {
            $this->configs['socket'] = $socket;
        }
        return $this;
    }
 
    /**
     * 文字コードを設定する
     * @param null $charset
     * @return $this
     */
    public function databaseCharset($charset = null)
    {
        if (! empty($charset)) {
            $this->configs['charset'] = $charset;
        }
        return $this;
    }
 
    /**
     * データベース名を設定する
     * @param null $dbname
     * @return $this
     */
    public function databaseName($dbname = null)
    {
        if (! empty($dbname)) {
            $this->configs['dbname'] = $dbname;
        }
        return $this;
    }
 
    /**
     * データベースのパスワードを設定する
     * @param null $password
     * @return $this
     */
    public function databasePassword($password = null)
    {
        if (! empty($password)) {
            $this->configs['password'] = $password;
        }
        return $this;
    }
 
    /**
     * データベースユーザー名を設定する
     * @param null $username
     * @return $this
     */
    public function databaseUserName($username = null)
    {
        if (! empty($username)) {
            $this->configs['username'] = $username;
        }
        return $this;
    }
 
    /**
     * データベースのポートを設定する
     * @param null $port
     * @return $this
     */
    public function databasePort($port = null)
    {
        if (! empty($port)) {
            $this->configs['port'] = $port;
        }
        return $this;
    }
 
    /**
     * データベースサーバーを設定する
     * @param null $server
     * @return $this
     */
    public function databaseServer($server = null)
    {
        if (! empty($server)) {
            $this->configs['server'] = $server;
        }
        return $this;
    }
 
    /**
     * データベースの種類を設定する
     * @param null $type
     * @return $this
     */
    public function databaseType($type = null)
    {
        if (! empty($type)) {
            $this->configs['type'] = $type;
        }
        return $this;
    }
 
    /**
     * メソッドチェーンを作成する
     * @return Config
     */
    public static function create()
    {
        return new self;
    }
}


使い方は非常に簡単です。
コード[PHP]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
<?php
 
require_once 'config.php';
 
$config = Config::create()
    ->databaseType('MySQL')
    ->databaseServer('localhost')
    ->databaseName('niconico_db')
    ->databaseCharset('utf8');
 
echo $config->buildDsn(); // mysql:host=localhost;dbname=niconico_db;charset=utf8 のように文字列に変換してくれます。


あとはPDOのデータソース名に $config->buildDsn()と渡すだけです。
最後に編集したユーザー naohiro19 [ 2017年10月29日(日) 11:45 ], 累計 1 回

コメント数: 0 閲覧数: 251

[PHP] htmlspecialchars 関数の誤った使い方と正しい使い方

パーマリンクby naohiro19 on 2017年10月29日(日) 02:08 カテゴリー: 講座, プログラミング

【PHP, MySQL】日本語をデータベース格納する時に文字化けが起こる
というbonboさんのプログラムですが、以下のようなプログラムがあります。

コード[PHP]: 全て選択
1
2
3
4
//エスケープしてから表示
$pen_name = htmlspecialchars($_POST["pen_name"]);
$mail = htmlspecialchars($_POST["mail"]);
$_pass_word = htmlspecialchars($_POST["_pass_word"]);


htmlspecialchars関数は HTMLタグをサニタイズしてくれる便利な関数です。例えば、フォームに入力されたデータが以下のようになっていたとします。

コード[PHP]: 全て選択
1
<script>alert('hello world!');</script>


これを htmlspecialchars 関数に掛けると以下の文字列に変換されます。
コード[Javascript]: 全て選択
1
&lt;script&gt;alert(&#039;hello world!&#039;);&lt;/script&gt;


ユーザーがJavaScriptの書き方で書いた場合データベースのパラメータに htmlspecialchars関数で変換された結果がデータベースに挿入することになります

ですのでhtmlspecialchars関数はHTMLに表示する場合に用いるための関数です。
ですのでユーザー入力を受け取る場合は filter_input関数を用いて以下のように入力データをきちんと受け取るようにするべきでしょう。

コード[PHP]: 全て選択
1
2
3
$pen_name = (string)filter_input(INPUT_POST,'pen_name', FILTER_SANITIZE_STRING);
$mail = (string)filter_input(INPUT_POST,'mail',  FILTER_SANITIZE_STRING);
$_pass_word = (string)filter_input(INPUT_POST,'_pass_word', FILTER_SANITIZE_STRING);

コメント数: 1 閲覧数: 353

コードが見やすくなるスタイルシート(CSS3)

パーマリンクby naohiro19 on 2017年8月09日(水) 11:08

ここにおいておきます。ウェブフォントとしてGoolgeがホストしている「Source Code Pro」と「Source Sans Pro」を利用しています。
コード[CSS]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
@import url('https://fonts.googleapis.com/css?family=Source+Code+Pro:400,700|Source+Sans+Pro');
 
body {
    margin:5px auto;
    text-align: left;
    font-size: 12px;
    font-family: 'Source Code Pro', monospace;
}
 
.container {
    margin: 4px;
}
 
h2 {
    display: block;
    margin: 4px;
    padding:0 2px;
    font-size: 24px;
    border-left: solid 10px #6495ed;
    border-bottom: solid 10px #324a7f;
    border-radius: 4px;
}
pre {
    font-family: 'Source Code Pro', monospace;
    border-radius: 10px;
    position: absolute;
    display: inline-block;
    text-align: left;
    font-size: 16px;
    background-color: #dcdcdc;
    border: 5px solid #646464;
    margin: 7px;
    box-sizing: border-box;
    padding:0 2px;
}
 
pre > span.keyword {
    text-align: left;
    font-weight: bold;
    color: #4169e1;
}
 
pre > span.comment {
    text-align: left;
    font-style: italic;
    color: #2e8b57;
}
pre > span.define {
    font-weight: bold;
    text-align: left;
    color: #ff4500;
}
 
pre > span.string {
    text-align: left;
    color: #b22222;
}
 
pre > span.apitype {
    text-align: left;
    font-weight: bold;
    color: #008080;
}
 
pre > span.unit {
    text-align: left;
    box-sizing: border-box;
    color:#f92672;
}
pre > span.numbers {
    text-align: left;
    box-sizing: border-box;
    font-weight: bold;
    color: #ae81ff;
}
最後に編集したユーザー naohiro19 [ 2017年8月09日(水) 11:10 ], 累計 2 回

コメント数: 0 閲覧数: 605

RequireJSでJavaScriptライブラリを使ってみた

パーマリンクby naohiro19 on 2017年7月23日(日) 12:03 カテゴリー: プログラミング

RequireJSとは、JavaScriptを読み込んでくれるライブラリです。

公式サイトでも
「RequireJS is a JavaScript file and module loader.」
(RequireJSは、JavaScriptファイルとモジュールのローダーです)
と表記されているようにJavaScriptのファイルを読み込むのに適したものになります。

以下のプログラムはjQueryライブラリをRequireJSで読み込んでmain.jsからいじってみるというものです。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8" />
    <title>RequireJSの練習</title>
</head>
<body>
    <p>RequireJSの練習</p>
    <script data-main="js/main" src="js/require.min.js"></script>
    <script>
        // RequireJSの設定
        requirejs.config({
            paths : {
                'jquery': 'https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min',
                'main' : 'main'
            }
        });
    </script>
</body>
</html>


コード[Javascript]: 全て選択
1
2
3
4
5
6
7
// main.js
require(['jquery'], function($) {
    'use strict';
    $(function() {
        $('p').css('color', 'red');
    });
});

コメント数: 0 閲覧数: 869

オンラインデータ

登録ユーザー: なし