- $pdo : PDO型
- $table_name : string型
- $calam_name : array型
- $calam_str : array型
- データベース : MySQL
という前提の上で、以下のコードではいかがでしょうか?
ちなみに、インサートする値は、NULL以外は全て文字列として扱っております。
(文字列以外の値は、DBの暗黙の型変換に任せる)
エラーケースは考慮しておりません。
(第3引数と第4引数の要素数が異なる場合、など)
php
1function insert ($pdo,$table_name,$calam_name,$calam_str) {
2
3 $placeholders = array_fill(0, count($calam_str), '?');
4
5 $sql = sprintf(
6 'INSERT INTO %s (%s) VALUES (%s)',
7 $table_name,
8 implode(', ', $calam_name),
9 implode(', ', $placeholders));
10
11 $statement = $pdo->prepare($sql);
12
13 $index = 1;
14 foreach ($calam_str as $value) {
15 $data_type = is_null($value) ? PDO::PARAM_NULL : PDO::PARAM_STR;
16 $statement->bindValue($index, $value, $data_type);
17
18 $index++;
19 }
20
21 $statement->execute();
22}
23
24$pdo = new PDO(...); // 割愛
25
26insert($pdo, 'sample', array('id', 'name'), array(1, 'yosirou mori'));
27insert($pdo, 'sample2', array('id', 'first_name', 'family_name'), array(2, 'tarou', 'asou'));
28
29insert($pdo, 'sample', array('id', 'name'), array(3, NULL));
実行結果
sql
1mysql> select * from sample;
2+------+--------------+
3| id | name |
4+------+--------------+
5| 1 | yosirou mori |
6| 3 | NULL |
7+------+--------------+
82 rows in set (0.00 sec)
9
10mysql> select * from sample2;
11+------+------------+-------------+
12| id | first_name | family_name |
13+------+------------+-------------+
14| 2 | tarou | asou |
15+------+------------+-------------+
161 row in set (0.00 sec)
使用した関数・メソッド・定数
array_fill
count
sprintf
implode
is_null
PDO::prepare
PDOStatement::bindValue
PDOStatement::execute
PDO::PARAM_*