a-4-1-1.PHPでテストAPI(GET/POST/DELETE)を作成する。

### a-4-1-1.PHPでテストAPI(GET/POST/DELETE)を作成する。

#### 目標設定
[一覧に戻る](https://qiita.com/ryouta33/items/57f5e51a26086151a0da)

#### 課題
3. GETのAPIを作成できるか。
3. GETのAPIでパラメーター取得はできるか。
3. GETのAPIでJson形式の戻り値を作成できるか。
3. POSTのAPIを作成できるか。
3. POSTのAPIでBodyの配列情報を取得はできるか。
3. DELETEのAPIを作成できるか。
3. DELETEのAPIでBodyの情報を取得はできるか。

```php:api2_get_test1_table.php
<?php
// 1. GETのAPIを作成できるか。
// ・可能でした。
// curl --include "http://localhost:8080/reversi/php/api2_get_test1_table.php?colum1=3"
// curl --include "https://wakizaka24.sakura.ne.jp/reversi/php/api2_get_test1_table.php?colum1=3"
// http://localhost:3000

/*
-- DROP TABLE IF EXISTS `TEST1_TABLE`;
CREATE TABLE `TEST1_TABLE` (
  `COLUM1` INT NOT NULL PRIMARY KEY,
  `COLUM2` VARCHAR(256) NULL
);
CREATE INDEX `TEST1_TABLE_COLUM1_INDEX`
ON `TEST1_TABLE`(`COLUM1`);
*/

require_once "include_security_review.php";
require_once "class_utils.php";
require_once "class_security_info.php";
$info = SecurityInfo::getDBConnectionInfo();
$pdo = new PDO($info["dns"], $info["username"], $info["password"],
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);

try {
    // 2. GETのAPIでパラメーター取得はできるか。
    // ・可能でした。
    $colum1 = $_GET["colum1"];
    if (!$colum1) {
        http_response_code(400);
        exit;
    }

    $sql = "SELECT * FROM TEST1_TABLE WHERE COLUM1 = :COLUM1;";
    $statement = $pdo->prepare($sql);
    $statement->bindParam(":COLUM1", $colum1, PDO::PARAM_INT);
    $response = $statement->execute();
    if ($response) {
        $data = $statement->fetch();
    }

    header("Content-Type: application/json; charset=utf-8");
    header("Access-Control-Allow-Methods: GET");
    header("Access-Control-Allow-Headers: Content-Type, "
        ."Access-Control-Allow-Headers, Authorization, X-Requested-With");
    // 3. GETのAPIでJson形式の戻り値を作成できるか。
    // ・可能でした。
    echo json_encode(array("data"=>$data ?: json_encode([], JSON_FORCE_OBJECT)),
        JSON_UNESCAPED_UNICODE);

    http_response_code(200);
} catch (PDOException $e) {
    setDBErrorJson($e);
}
?>
```

```php:api3_post_test1_table.php
<?php
/*
4. POSTのAPIを作成できるか。
・可能でした。 
curl --include "http://localhost:8080/reversi/php/api3_post_test1_table.php" \
-X POST -H "Content-Type: application/json" \
-d '{
    "table1_values": [
        {
            "COLUM1": "3",
            "COLUM2": "Value 3"
        }
    ]
}'

curl --include "https://wakizaka24.sakura.ne.jp/reversi/php/api3_post_test1_table.php" \
-X POST -H "Content-Type: application/json" \
-d '{
    "table1_values": [
        {
            "COLUM1": "3",
            "COLUM2": "Value 3"
        }
    ]
}'

http://localhost:3000
*/

/*
-- DROP TABLE IF EXISTS `TEST1_TABLE`;
CREATE TABLE `TEST1_TABLE` (
  `COLUM1` INT NOT NULL PRIMARY KEY,
  `COLUM2` VARCHAR(256) NULL
);
CREATE INDEX `TEST1_TABLE_COLUM1_INDEX`
ON `TEST1_TABLE`(`COLUM1`);
*/

require_once "include_security_review.php";
require_once "class_utils.php";
require_once "class_security_info.php";
$info = SecurityInfo::getDBConnectionInfo();
$pdo = new PDO($info["dns"], $info["username"], $info["password"],
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);

$key = "table1_values";
$bodyStr = file_get_contents("php://input");
//var_dump($bodyStr);
$body = json_decode($bodyStr, true);

if (!array_key_exists($key, $body)) {
    http_response_code(400);
    exit;
}

// 5. POSTのAPIでBodyの配列情報を取得はできるか。
// ・可能でした。
$table1Values = $body[$key];
if (count($table1Values) == 0) {
    http_response_code(400);
    exit;
}  

try {
    $pdo->beginTransaction();

    foreach($table1Values as $i => $colums) {
        $sql = "INSERT INTO `TEST1_TABLE`(`COLUM1`, `COLUM2`) VALUES(:COLUM1, :COLUM2);";
        $statement = $pdo->prepare($sql);
        $statement->bindParam(":COLUM1", $colums["COLUM1"], PDO::PARAM_INT);
        $statement->bindParam(":COLUM2", $colums["COLUM2"], PDO::PARAM_STR);
        $statement->execute();
    }

    $pdo->commit();

    header("Content-Type: application/json; charset=utf-8");
    header("Access-Control-Allow-Methods: POST");
    header("Access-Control-Allow-Headers: Content-Type, "
        ."Access-Control-Allow-Headers, Authorization, X-Requested-With");
    
    http_response_code(200);
} catch (PDOException $e) {
    $pdo->rollBack();
    setDBErrorJson($e);
}
?>
```

```php:api4_delete_test1_table.php
<?php
/*
6. DELETEのAPIを作成できるか。
・可能でした。
curl --include "http://localhost:8080/reversi/php/api4_delete_test1_table.php" \
-X POST -H "Content-Type: application/json" \
-d '{
    "table1_deleting_keys": [3]
}'

curl --include "https://wakizaka24.sakura.ne.jp/reversi/php/api4_delete_test1_table.php" \
-X POST -H "Content-Type: application/json" \
-d '{
    "table1_deleting_keys": [3]
}'

http://localhost:3000
*/

/*
-- DROP TABLE IF EXISTS `TEST1_TABLE`;
CREATE TABLE `TEST1_TABLE` (
  `COLUM1` INT NOT NULL PRIMARY KEY,
  `COLUM2` VARCHAR(256) NULL
);
CREATE INDEX `TEST1_TABLE_COLUM1_INDEX`
ON `TEST1_TABLE`(`COLUM1`);
*/

require_once "include_security_review.php";
require_once "class_utils.php";
require_once "class_security_info.php";
$info = SecurityInfo::getDBConnectionInfo();
$pdo = new PDO($info["dns"], $info["username"], $info["password"],
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);

$key = "table1_deleting_keys";
$bodyStr = file_get_contents("php://input");
//var_dump($bodyStr);
$body = json_decode($bodyStr, true);

if (!array_key_exists($key, $body)) {
    http_response_code(400);
    exit;
}

// 7. DELETEのAPIでBodyの情報を取得はできるか。
// ・可能でした。
$deletingKeys = $body[$key];
if (count($deletingKeys) == 0) {
    http_response_code(400);
    exit;
}  

try {
    $pdo->beginTransaction();

    foreach($deletingKeys as $i => $key) {
        $sql = "DELETE FROM `TEST1_TABLE` WHERE COLUM1=:COLUM1;";
        $statement = $pdo->prepare($sql);
        $statement->bindParam(":COLUM1", $key, PDO::PARAM_INT);
        $statement->execute();
    }

    $pdo->commit();

    header("Content-Type: application/json; charset=utf-8");
    header("Access-Control-Allow-Methods: DELETE");
    header("Access-Control-Allow-Headers: Content-Type, "
        ."Access-Control-Allow-Headers, Authorization, X-Requested-With");
    
    http_response_code(200);
} catch (PDOException $e) {
    $pdo->rollBack();
    setDBErrorJson($e);
}
?>
```