会社名登録フォーム
P粉904191507
2023-09-05 19:05:36
<p>参考のみ。コーディングの初心者、独学、リラックス...</p>
<p>新しい SQL テーブルを作成する登録フォームがあります。入力した会社名は、ログインするたびに作成される新しいテーブルの名前になります。 </p>
<p>テーブル名変数の脆弱性を除いて、すべてが正常に動作しています。 </p>
<p>PHP と MySQL を使用しています。 </p>
<p>会社名に 2 つの単語の間にスペースがあると最初は問題がありましたが、str_replace</p> を使用して修正しました。
<p>多くのテストを行ったところ、「out」に会社名を入力するとコードが壊れることがわかりました。 </p>
<p>次のエラー メッセージが表示されました: </p>
<p>「致命的なエラー: mysqli_sql_例外をキャッチできません: SQL 構文にエラーがあります。MySQL サーバーのバージョンのマニュアルを確認して、near 'out (id INT UNSIGNED AUTO_INCRMENT PRIMARY KEY, first_name VARCHAR(128 )) で使用する正しい構文を確認してください。 NOT ' C:\Users\reece.grover\OneDrive\XML Website\opregister.php:73 の行 1 のスタック トレース: #0 C:\Users\reece.grover\OneDrive\XML Website \opregister.php(73) : mysqli->query('CREATE TABLE ou...') C:\Users\reece.grover\OneDrive\XML Website\opregister.php の #1 {main} の 73 行目 "Thrown"</p>
<p>これはエラーだけでなく SQL インジェクションにもつながるようです。 </p>
<p>bind_param の方法を学びましたが、それでも CREATE TABLE 関数による潜在的なコード破壊を防ぐことができます。 </p>
<p>これはサーバー側の PHP コードです。フォームはブートストラップを使用した単純な HTML フォームです。</p>
<pre class="brush:php;toolbar:false;">//スペースを削除
$company = str_replace(' ', '', $_POST["company"]);
//パスワードをハッシュ化する
$password_hash = パスワード_ハッシュ($_POST["パスワード"], PASSWORD_DEFAULT);
// 新しいオペレータを作成する
$mysql = __DIR__ が必要です。 "/database.php";
$sql = "INSERT INTO 演算子 (名、姓、電子メール、パスワード ハッシュ、会社)
値 (?、?、?、?、?)";
$stmt = $mysql->stmt_init();
if ( ! $stmt ->prepare($sql)){
die("SQL エラー: " . $mysql->error);
}
$stmt->bind_param("sssss",
$_POST["名"]、
$_POST["姓"]、
$_POST["メール"]、
$パスワード_ハッシュ、
$company);
if ( ! $stmt->execute()) {
die($mysqli->error . " " . $mysqli->errno);
}
// 新しい会社テーブルを作成します
$sql = "CREATE TABLE $company (
id INT UNSIGNED AUTO_INCREMENT 主キー、
first_name VARCHAR(128) NOT NULL、
last_name VARCHAR(128) NOT NULL、
電子メール VARCHAR(255) NOT NULL UNIQUE、
会社 VARCHAR(128)、
クレジット VARCHAR(60)、
電話 VARCHAR(60))";
if ( ! $mysql->query($sql)) {
die("テーブルの作成に失敗しました: " . $mysql->error);
}
$sql = "INSERT INTO $company (名、姓、電子メール、会社、クレジット、電話番号)
値 (?、?、?、?、?、?)";
$stmt = $mysql->stmt_init();
if ( ! $stmt ->prepare($sql)){
die("SQL エラー: " . $mysql->error);
}
$stmt->bind_param("ssssss",
$_POST["名"]、
$_POST["姓"]、
$_POST["メール"]、
$会社、
$_POST["クレジット"]、
$_POST["電話"]);
if ($stmt->execute()) {
header("場所:signup_success.php");
終了;</pre></p>
個別の company_name テーブルではなく、事前定義された company テーブルが必要です。また、ユーザー入力に基づいてテーブルを作成しないでください。
会社テーブルを事前に作成します:
リーリーその後、
リーリーINSERT
データをこのテーブルに挿入できます:この表には各企業が挿入されます。これらは
id
列によって区別されます。
リーリーoperators
テーブルに外部キー制約を追加することもできます。オペレーターを削除するときに会社データを削除したい場合は、
を実行できます。 リーリーDELETE CASCADE
: