前提
PHPとMySQLを使ってログインのシステムを作っています。
SQLインジェクションを防ぐためにPrepared Statementを使っているのですが、
INSERT INTO user(email,first_name,last_name,city,state,postcode,address_id)Values(?,?,?,?,?,?,(SELECT id FROM address WHERE address1 = ?));
本当はこの”?”に$address1という$_POSTで取得した変数を入れたい。
*addressのテーブルにaddress1というカラムがあります。
のようにすると何もデータベースにデータが入りません。色々調べた結果、この方法ではできないことがわかったのですが、Foreign Keyとしているaddress_idを取得するためには上記のようにSELECT文を使ってidを取得する方法くらいしか今の所思いつかなく、詰まっています。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- Prepared Statementを使って外部キーのIDを他のテーブルから取得してきてデータをデータベースにINSERTしたい。
発生している問題・エラーメッセージ
特にエラーメッセージは出ていません。Formをサブミットすると、ページがリロードして終わりといった感じです。データはデータベースに送信されていません。
該当のソースコード
PHP
1<?php 2 include "config.php"; 3 4 if($_SERVER["REQUEST_METHOD"] == "POST"){ 5 include "isRegistered.php"; 6 $email = mysqli_real_escape_string($conn, $_POST["email"]); 7 $firstName = mysqli_real_escape_string($conn,$_POST["firstName"]); 8 $lastName = mysqli_real_escape_string($conn,$_POST["lastName"]); 9 $password = mysqli_real_escape_string($conn,$_POST["password"]); 10 $confirm_password = mysqli_real_escape_string($conn,$_POST["confirmPassword"]); 11 $country = mysqli_real_escape_string($conn,$_POST["country"]); 12 $address1 = mysqli_real_escape_string($conn,$_POST["address1"]); 13 $address2 = mysqli_real_escape_string($conn,$_POST["address2"]); 14 $city = mysqli_real_escape_string($conn,$_POST["city"]); 15 $state = mysqli_real_escape_string($conn,$_POST["state"]); 16 $postCode = mysqli_real_escape_string($conn,$_POST["postcode"]); 17 18 if(!isRegistered($email)){ 19 if($password == $confirm_password){ 20 $sql = "INSERT INTO address(address1,address2,city,state,postcode,country_id) 21 VALUES(?,?,?,?,?,(SELECT id FROM country WHERE country_name = ?))"; 22 $stmt = mysqli_stmt_init($conn); 23 if(!mysqli_stmt_prepare($stmt,$sql)){ 24 echo "SQL error : INSERT INTO address failed"; 25 echo $conn -> error; 26 }else{ 27 mysqli_stmt_bind_param($stmt,"sssssi",$address1, $address2,$city,$state,$postCode,$country); 28 mysqli_stmt_execute($stmt); 29 30 } 31 32 $sql2 = "INSERT INTO user(first_name,last_name,email,password,address_id)VALUES(?,?,?,?,(SELECT id FROM address WHERE address1 = ?))"; 33 $stmt2 = mysqli_stmt_init($conn); 34 if(!mysqli_stmt_prepare($stmt2,$sql2)){ 35 echo "SQL error : INSERT INTO user failed"; 36 echo $conn -> error; 37 }else{ 38 $encrypted_password = password_hash($password,PASSWORD_BCRYPT); 39 mysqli_stmt_bind_param($stmt2,"ssssi",$firstName,$lastName,$email,$encrypted_password,$address1); 40 mysqli_stmt_execute($stmt2); 41 echo "<p style='color:green;text-align:center;margin-top:1rem; 42 font-weight:bold;'> User account successfully created! <p>"; 43 } 44 45 }else{ 46 echo "<p style='color:red;text-align:center;margin-top:1rem; 47 font-weight:bold;'>Please Re-confirm your password <p>"; 48 } 49 50 }else{ 51 echo "<p style='color:red;text-align:center;margin-top:1rem; 52 font-weight:bold;'>Email already in use. Try again! <p>"; 53 } 54 }
試したこと
直接
INSERT INTO user(email,first_name,last_name,city,state,postcode,address_id)Values(?,?,?,?,?,?,(SELECT id FROM address WHERE address1 = ?);
のようにサブクエリーを記述するのはできないと思ったので、そのサブクエリーを分けて実装した感じになります。そのため、セレクト文を使うたびにprepared statementを使わなければいけないと思ったので、コードの量がとてつもなくなってしまいました。Prepared Statementを使うのも初めてなので、使い方が合ってるかはわかりませんが、多めにみてください。:<
回答2件