ターミナルからusers
にmysql
テーブルを作成し、フォームから値を挿入するという簡単なタスクを作成しようとしています。これは私の 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'ing
INSERT
クエリ。想定されているとおりにフォームからすべての値を取得します。これが端末から機能するかどうかを確認した後、sql
にログインして、ユーザーテーブルからすべてのデータを返そうとすると、空のセットが取得されます。
次のコードは、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
を使用してパスワードのハッシュを保存する必要があります
コードには2つの問題があります。
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>