Mysqli_real_escape_string でフォームデータを処理する

Habdul Hazeez 2024年2月15日
  1. ローカルサーバーをセットアップする
  2. データベースとテーブルを作成する
  3. HTML フォームを作成する
  4. プロセスフォームデータ
  5. Mysqli_real_escape_string のエラーの原因
Mysqli_real_escape_string でフォームデータを処理する

この記事では、mysqli_real_escape_string を使用してフォームデータを処理する方法を説明します。

まず、サンプルデータベースとテーブルを設定します。次に、ユーザー入力を受け入れる HTML フォームを作成します。

その後、PHP で、エラーを発生させずに mysqli_real_escape_string を使用する方法を説明します。

ローカルサーバーをセットアップする

この記事のすべてのコードはサーバー上で機能します。したがって、ライブサーバーにアクセスできる場合は、このセクションをスキップして次のセクションに進むことができます。

そうでない場合は、Apache Friends の XAMPPなどのローカルサーバーをインストールします。XAMPP をインストールしたら、htdocs フォルダーを見つけてフォルダーを作成します。

このフォルダには、この記事のすべてのコードが保存されます。

データベースとテーブルを作成する

XAMPP では、phpMyAdmin またはコマンドラインを使用してデータベースを作成できます。コマンドラインを使用している場合は、次のコマンドを使用して MySQL にログインします。

#login to mysql
mysql -u root -p

MySQL にログインしたら、データベースを作成します。この記事では、データベースを my_details と呼びます。

CREATE database my_details

データベースを作成したら、次の SQL コードでテーブルを作成します。このテーブルには、サンプルプロジェクトのデータが保持されます。

CREATE TABLE bio_data (
id INT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
PRIMARY KEY (id)) ENGINE = InnoDB;

HTML フォームを作成する

HTML フォームには 2つのフォーム入力があります。1つ目はユーザーの名を収集し、2つ目は姓を収集します。

<head>
    <meta charset="utf-8">
    <title>Process Form With mysqli_real_escape_string</title>
    <style>
        body {
            display: grid;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }
    </style>
</head>
<body>
    <main>
        <form action="process_form.php" method="post">
            <label id="first_name">First Name</label>
            <input id="first_name" type="text" name="first_name" required>
            <label id="last_name">Last Name</label>
            <input id="last_name" type="text" name="last_name" required>
            <input type="submit" name="submit_form" value="Submit Form">
        </form>
    </main>
</body>

出力:

Firefox 100 の HTML フォーム

プロセスフォームデータ

フォームの処理中に、mysqli_real_escape_string を使用してフォーム入力をエスケープします。さらに、データベース接続は mysqli_real_escape_string の最初の引数である必要があります。

そのため、以下では、名前と名前に mysqli_real_escape_string を使用しました。コードを使用するには、コードを process_form.php として保存します。

<?php
    if (isset($_POST['submit_form']) && isset($_POST["first_name"]) && isset($_POST["last_name"])) {
        // Set up a database connection.
        // Here, our password is empty
        $connection_string = new mysqli("localhost", "root", "", "my_details");

        // Escape the first name and last name using
        // mysqli_real_escape_string function. Meanwhile,
        // the first parameter to the function should
        // be the database connection. If you omit, the
        // database connection, you'll get an error.
        $first_name = mysqli_real_escape_string($connection_string, trim(htmlentities($_POST['first_name'])));
        $last_name = mysqli_real_escape_string($connection_string, trim(htmlentities($_POST['last_name'])));

        // If there is a connection error, notify
        // the user, and Kill the script.
        if ($connection_string->connect_error) {
            echo "Failed to connect to Database. Please, check your connection details.";
            exit();
        }

        // Check string length, empty strings and
        // non-alphanumeric characters.
         if ( $first_name === "" || !ctype_alnum($first_name) ||
                strlen($first_name) <= 3
            ) {
                echo "Your first name is invalid.";
                exit();
        }

         if ( $last_name === "" || !ctype_alnum($last_name) ||
                strlen($last_name) < 2
            ) {
                echo "Your last name is invalid.";
                exit();
        }

        // Insert the record into the database
        $query = "INSERT into bio_data (first_name, last_name) VALUES ('$first_name', '$last_name')";
        $stmt = $connection_string->prepare($query);
        $stmt->execute();

        if ($stmt->affected_rows === 1) {
            echo "Data inserted successfully";
        }
    } else {
        // User manipulated the HTML form or accessed
        // the script directly. Kill the script.
        echo "An unexpected error occurred. Please, try again later.";
        exit();
    }
?>

出力(処理が成功した場合):

データベースにデータを挿入する

Mysqli_real_escape_string のエラーの原因

mysqli_real_escape_string でデータベース接続を省略すると、エラーが発生します。したがって、次のコードでは、process_form.php を変更しました。

一方、このバージョンでは、mysqli_real_escape_string にデータベース接続がありません。その結果、データベースにデータを挿入するときにエラーが発生します。

<?php
    if (isset($_POST['submit_form']) && isset($_POST["first_name"]) && isset($_POST["last_name"])) {
        $connection_string = new mysqli("localhost", "root", "", "my_details");

        // We've omitted the connection string
        $first_name = mysqli_real_escape_string(trim(htmlentities($_POST['first_name'])));
        $last_name = mysqli_real_escape_string(trim(htmlentities($_POST['last_name'])));

        if ($connection_string->connect_error) {
            echo "Failed to connect to Database. Please, check your connection details.";
            exit();
        }
        if ( $first_name === "" || !ctype_alnum($first_name) ||
                strlen($first_name) <= 3
           ) {
            echo "Your first name is invalid.";
            exit();
        }

         if ( $last_name === "" || !ctype_alnum($last_name) ||
                strlen($last_name) < 2
            ) {
                echo "Your last name is invalid.";
                exit();
        }

        $query = "INSERT into bio_data (first_name, last_name) VALUES ('$first_name', '$last_name')";
        $stmt = $connection_string->prepare($query);
        $stmt->execute();

        if ($stmt->affected_rows === 1) {
            echo "Data inserted successfully";
        }
    } else {
        echo "An unexpected error occurred. Please, try again later.";
        exit();
    }
?>

エラーメッセージの例:

Fatal error: Uncaught ArgumentCountError: mysqli_real_escape_string() expects exactly 2 arguments, 1 given in C:\xampp\htdocs\processformmysqli\process_form.php:12 Stack trace: #0 C:\xampp\htdocs\processformmysqli\process_form.php(12): mysqli_real_escape_string('Johnson') #1 {main} thrown in C:\xampp\htdocs\processformmysqli\process_form.php on line 12
著者: Habdul Hazeez
Habdul Hazeez avatar Habdul Hazeez avatar

Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.

LinkedIn

関連記事 - MySQL PHP