web-dev-qa-db-ja.com

PHP:フォームからMySQLへの値の挿入

ターミナルからusersmysqlテーブルを作成し、フォームから値を挿入するという簡単なタスクを作成しようとしています。これは私の dbConfig file

<?php
$mysqli = new mysqli("localhost", "root", "pass", "testDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
?>

これは私のIndex.php

<!doctype html>
<html>
 <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <meta name="description" content="$1">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" type="text/css" href="style.css">

    <title>test</title>

    <?php
    include_once 'dbConfig.php';
    ?>

</head>
<body>
     <?php
    if(isset($_POST['save'])){
        $sql = "INSERT INTO users (username, password, email)
        VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";
    }

    ?>

    <form method="post"> 
    <label id="first"> First name:</label><br/>
    <input type="text" name="username"><br/>

    <label id="first">Password</label><br/>
    <input type="password" name="password"><br/>

    <label id="first">Email</label><br/>
    <input type="text" name="email"><br/>

    <button type="submit" name="save">save</button>
    <button type="submit" name="get">get</button>
    </form>

</body>
</html>

保存ボタンを押しても何も起こりません。データベースはまだ空です。私は試した echo'ingINSERTクエリ。想定されているとおりにフォームからすべての値を取得します。これが端末から機能するかどうかを確認した後、sqlにログインして、ユーザーテーブルからすべてのデータを返そうとすると、空のセットが取得されます。

8
notrealme

次のコードは、MySQLクエリを含む文字列変数を宣言するだけです。

$sql = "INSERT INTO users (username, password, email)
    VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";

クエリは実行されません。それを行うには、いくつかの機能を使用する必要がありますが、最初に他の何かを説明します。

ユーザー入力を信頼しない:ユーザー入力を追加しないでください($_GETまたは$_POSTからのフォーム入力など)直接クエリに。誰かがそのような方法で入力を慎重に操作して、データベースに大きな損害を与える可能性があります。これはSQLインジェクションと呼ばれます。詳細についてはこちらをご覧ください こちら

このような攻撃からスクリプトを保護するには、mustPrepared Statementsを使用する必要があります。準備済みステートメントの詳細 ここ

次のような準備済みステートメントをコードに含めます。

$sql = "INSERT INTO users (username, password, email)
    VALUES (?,?,?)";

?が値のプレースホルダーとして使用されていることに注意してください。次に、mysqli_prepareを使用してステートメントを準備する必要があります。

$stmt = mysqli_prepare($sql);

次に、入力変数の準備済みステートメントへのバインドを開始します。

$stmt->bind_param("sss", $_POST['username'], $_POST['email'], $_POST['password']);

最後に、準備されたステートメントを実行します。 (実際の挿入が行われる場所です)

$stmt->execute();

[〜#〜] note [〜#〜]質問の一部ではありませんが、パスワードを平文で保存しないことを強くお勧めします。代わりに、password_hashを使用してパスワードのハッシュを保存する必要があります

31
dimlucas

コードには2つの問題があります。

  1. フォームにアクションが見つかりません。
  2. クエリを実行していませんmysqli_query()

dbConfig.php

<?php

$conn=mysqli_connect("localhost","root","password","testDB");

if(!$conn)
{
die("Connection failed: " . mysqli_connect_error());
}

?>

index.php

 include('dbConfig.php');

<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="description" content="$1">
<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="stylesheet" type="text/css" href="style.css">

<title>test</title>


</head>
<body>

 <?php

  if(isset($_POST['save']))
{
    $sql = "INSERT INTO users (username, password, email)
    VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";

    $result = mysqli_query($conn,$sql);
}

?>

<form action="index.php" method="post"> 
<label id="first"> First name:</label><br/>
<input type="text" name="username"><br/>

<label id="first">Password</label><br/>
<input type="password" name="password"><br/>

<label id="first">Email</label><br/>
<input type="text" name="email"><br/>

<button type="submit" name="save">save</button>

</form>

</body>
</html>