---
# System prepended metadata

title: PHP 基本手冊
tags: [程式導師, PHP, Backend]

---

# PHP 基本手冊

###### tags: `程式導師` `Backend` `PHP`

## 語法特點

1. 每行結尾要加分號 `;`
2. 只要是變數，就要帶著 `$`
3. 若要印出非數字
    - `var_dump($arr);` 印出變數的型態、長度
    - `print_r($arr);` 跟 `var_dump` 比，少型態

```php
<?php
    echo "<h1>Hello World</h1>"
?>
```

| JavaScript | PHP |
| ---------- | --- |
| `let a = 1;` | `$a = 1;` |
| `'string' + string` | `$a . $b;` |
|            | `echo $a . "<br>"` |
| `let arr = [1, 2, 3]` | `$arr = array(1, 2, 3)` |
| `arr.length` | `sizeof($arr)` |

## PHP 與 Apache 的運作（XAMPP）

request → Apache(server) → PHP → HTML → Apache →  response

Apache 類似物流，提供溝通管道，PHP 是翻譯。

## 隱藏資料庫帳號密碼

分為 data.php、conn.php 兩檔案。

**conn.php** 處理帳密設定與連線
```php
<?
$server_name = 'localhost';
$user_name = 'yenlai';
$password = 'yenlai';
$db_name = 'yenlai';

$conn = new mysqli($server_name, $user_name, $password, $db_name);
//跟資料庫連線（主機位置：localhost, 帳號, 密碼. 資料庫名稱）

if (!empty($conn->connect_error)) {
    die('資料庫連結失敗!'); //使用 die，就會停止往下執行
} else {
    echo '資料庫連結成功';
}

$conn->query('SET NAMES UTF8');
$conn->query('SET time_zone = "+8:00"');

?>
```

**data.php** 處理資料
```php
<?
require_once('conn.php');

// 以下寫執行
?>
```

## PHP 與 MySQL 指令表

### 拿資料

1. 使用 query：`$data = $conn->query('select now() as n;')`
2. 檢查是否有拿到：`if (!$data) { die($conn->error)};`
3. 把拿到的資料拉出來：`$row = $data->fetch_assoc();`

### 一次讀取多筆資料

```php
<?php
    require_once('conn.php');
    //引入資料庫連線設定

    $data = $conn->query("SELECT id, username FROM users;");
    if (!$data) {
        die($conn->error);
    }
    
    // 一次取得多筆資料，不需要一個一個 fetch
    // $row = $data->fetch_assoc();
    // print_r($row);
    // $row = $data->fetch_assoc();
    // print_r($row);

    while($row = $data->fetch_assoc()) {
        print_r($row);
    }
    
?>
```

```php
<?php
  // 連線資料庫
  $server_name = 'localhost';
  $username = 'huli';
  $password = 'huli';
  $db_name = 'huli';

  $conn = new mysqli($server_name, $username, $password, $db_name);

  if ($conn->connect_error) {
    die('資料庫連線錯誤:' . $conn->connect_error);  //使用 die，就會停止往下執行
  }

  $conn->query('SET NAMES UTF8');
  $conn->query('SET time_zone = "+8:00"');

  // 新增資料
  $username = $_POST['username'];
  $sql = sprintf(
    "insert into users(username) values('%s')",
    $username
  );
  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }

  // 讀取資料
  $result = $conn->query("SELECT * FROM users ORDER BY id ASC;");
  if (!$result) {
    die($conn->error);
  }

  while ($row = $result->fetch_assoc()) {
    echo "id:" . $row['id'];
  }

  // 修改資料
  $id = $_POST['id'];
  $username = $_POST['username'];
  $sql = sprintf(
    "update users set username='%s' where id=%d",
    $username,
    $id
  );
  echo $sql . '<br>';
  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }

  // 刪除資料
  $id = $_GET['id'];
  $sql = sprintf(
    "delete from users where id = %d",
    $id
  );
  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }

  if ($conn->affected_rows >= 1) {
    echo '刪除成功';
  } else {
    echo '查無資料';
  }
?>
```
