准备

ESP32使用POST方式调用PHP存储到数据库并显示,整个Demo需要准备的事项如下:

  • ESP32 端代码
  • 服务器端php代码
  • 数据库

ESP32 使用 ESP-IDF 工程代码,通过 POST 方式发送数据到服务器端的 php 文件处理。
php 文件分为两部分,一部分用作接收 ESP32数据,另一部分做数据显示。
phpPOST 接收文件将接收到的数据进行处理,然后存储到数据库
php 的显示文件读取数据库,并将数据实时显示到网页。

数据库创建

数据库的创建这里不多讲,搭建服务器创建mysql数据库即可。
本例子建立了如下一个表:

mysql> SELECT * FROM table_esp32_post;
+----+-------------+---------------------+--------+---------------------+---------------------+
| id | name        | str1                | value1 | time_update         | time_create         |
+----+-------------+---------------------+--------+---------------------+---------------------+
|  1 | DaoBanMoJie | www.daobanmojie.com |   1991 | 2021-03-08 17:47:43 | 2021-03-08 17:46:37 |
+----+-------------+---------------------+--------+---------------------+---------------------+
3 rows in set (0.07 sec)

ESP32 代码

ESP32通过wifi连接到网络

关于ESP32连接wifi的代码可以参考下面这篇帖子。

ESP32 启用http

主函数代码:

主函数代码以及注册的http_test_task函数代码。

static void http_test_task(void *pvParameters)
{
    http_post_demo();
    ESP_LOGI(TAG, "http示例结束\n");
    vTaskDelete(NULL);
}
void app_main(void)
{
    NVS_Init();
    wifi_init_sta();
    xTaskCreate(&http_test_task, "http_test_task", 8192, NULL, 5, NULL);    //创建HTTP任务
}

http_post_demo 代码:

http_post_demo 代码中是ESP32需要详细讲解的部分。
代码分两部分,第一部分创建需要存储到数据库JSON数据表。

    cJSON *root  = cJSON_CreateObject();
    cJSON_AddItemToObject(root , "api_key",   cJSON_CreateString("DaoBanMoJie_JiaIT"));
    cJSON_AddItemToObject(root , "id",        cJSON_CreateString("2"));
    cJSON_AddItemToObject(root , "name",      cJSON_CreateString("daobanmojie"));
    cJSON_AddItemToObject(root , "str1",      cJSON_CreateString("Pirate IT!"));
    cJSON_AddItemToObject(root , "value1",    cJSON_CreateNumber(1230));
    const char *post_data = cJSON_Print(root);
    cJSON_Delete(root);

第二部分:POST代码

    esp_http_client_config_t config = {
        .method = HTTP_METHOD_POST,  
        .url = "http://esp.daobanmojie.com/esp-data-post.php",
        .event_handler = _http_event_handler,
    };
    esp_http_client_handle_t client = esp_http_client_init(&config);
    esp_http_client_set_post_field(client, post_data, strlen(post_data));
    esp_err_t err = esp_http_client_perform(client);
    if (err == ESP_OK) {
        ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %d",esp_http_client_get_status_code(client),esp_http_client_get_content_length(client));
    } else {
        ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
    }
    esp_http_client_cleanup(client);

服务器端PHP代码

服务器端php代码分为两部分。一部分post提交数据代码,另一部分为数据库查询显示代码。

POST提交代码


<?php
$servername = "localhost";              //数据库地址
$dbname = "db_esp32_dbmj";              // 数据库名
$username = "db_esp32_dbmj";            // 数据库用户名
$password = "数据库密码";                 // 数据库密码
$api_key_value = "DaoBanMoJie_JiaIT";   //POST密匙
if ($_SERVER["REQUEST_METHOD"] == "POST") 
{
    $read_post = file_get_contents('php://input');
    $datas = json_decode($read_post, TRUE);
    $api_key = $datas['api_key'];
    if ($api_key == $api_key_value) {
        $id     = $datas['id'];
        $name   = $datas['name'];
        $str1   = $datas['str1'];
        $value1 = $datas['value1'];
        $conn = new mysqli($servername, $username, $password, $dbname);         // 创建数据库连接
        if ($conn->connect_error) { die("连接失败:" . $conn->connect_error);}   // 检查数据库连接状态
        $sql = "SELECT id FROM table_esp32_post";
        $result = $conn->query($sql);
        $db_id_flag = 0;
        if ($result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                $db_id = $row["id"];
                if ($db_id == $id) {
                    $db_id_flag = 1;
                    break;
                }
            }
        }
        if ($id != "" && $db_id_flag == 0) {
            $sql = "INSERT INTO table_esp32_post ( id, name, str1, value1)
            VALUES ('".$id."', '".$name."', '".$str1."', ".$value1.")";
            $result = $conn->query($sql);
            if ($result === TRUE) {echo "新记录插入成功";} 
            else {echo "插入记录错误: " . $sql . "<br>" . $conn->error;}
        } else {
            $sql = "UPDATE table_esp32_post 
            SET name='".$name."', str1='".$str1."', value1=".$value1." 
            WHERE id=" . $id;
            $result = $conn->query($sql);
            if ($result === TRUE) {echo "记录更新成功";}
            else {echo "记录更新错误: " .$sql. "<br>" .$conn->error;}
        }
        $conn->close();
    } 
} 
?>

数据显示代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>数据显示</title>
    <link rel="stylesheet" href="https://www.layuicdn.com/layui/css/layui.css">
</head>
<body>
    <?php
    $servername = "localhost";              // 数据库地址
    $dbname = "db_esp32_dbmj";              // 数据库名
    $username = "db_esp32_dbmj";            // 数据库用户名
    $password = "数据库密码";               // 数据库密码
    $conn = new mysqli($servername, $username, $password, $dbname); // 创建数据库连接
    if ($conn->connect_error) {                                     // 检查数据库连接状态
        die("Connection failed: " . $conn->connect_error);
    }

    echo '
<table class="layui-table">
  <colgroup>
    <col width="150">
    <col width="200">
    <col>
  </colgroup>
  <thead>
    <tr>
      <th>ID</th>
      <th>name</th>
      <th>str1</th>
      <th>Value1</th>
      <th>更新时间</th>
      <th>创建时间</th>
    </tr> 
  </thead>
  <tbody>';

    //查询数据库bak  table_esp32_post表中的内容
    $sql = "SELECT id, name, str1, value1, time_update, time_create FROM table_esp32_post ORDER BY id "; 
    $result = $conn->query($sql);
    if ($result = $conn->query($sql)) {
        while ($row = $result->fetch_assoc()) {
            $row_id = $row["id"];
            $name = $row["name"];
            $str1 = $row["str1"];
            $value1 = $row["value1"];
            $time_update = $row["time_update"];
            $time_create = $row["time_create"];
            echo '
            <tr> 
                <td>' . $row_id . '</td> 
                <td>' . $name . '</td> 
                <td>' . $str1 . '</td> 
                <td>' . $value1 . '</td> 
                <td>' . $time_update . '</td> 
                <td>' . $time_create . '</td> 
            </tr>';
        }
        $result->free();
    }
    $conn->close();

    echo ('
    </tbody>
</table>');

    //<!-- 自动刷新 间隔10s -->
    echo ("
<script type=\"text/javascript\">
function fresh_page()
{
window.location.reload();
}
setTimeout('fresh_page()',10000);
</script>
");
    ?>
    </table>
</body>
</html>

完整程序下载

PHP文件、数据库sql文件、ESP32的工程文件下载。

该部分仅登录用户可见

显示效果

显示页面

最后修改:2021 年 03 月 09 日
男宾一位~ 欢迎下次再来!