2016-11-13 8 views
0

私はphp/mysqlの学習に忙しいです。
私が何をやっているのかを理解するために、自分のPHPゲームを作成するプロジェクトを開始しました。余分な(隠された)データ形式

私は登録フォームを作成するようになった。
フォームはプログラムされたとおりに動作します。

フォームは5つの異なるクラスの選択です。アイデアは、特定のものが選択されたときに、そのクラスの開始統計がデータベースに配置されることです。
ここにクラスセレクタがあります。私はそれがdie()を持っていることを知っていますが、それは私がそれが「うまくいく」ことを示しています。

私の質問は
追加の「隠し」入力を追加するにはどうすればよいですか? (馬力のような、マナ、DEF、>>>>)

私はdie()を交換しようとした:
$query = " INSERT INTO user (hp,deff) VALUES (3,2)";

//Class selector 
    if($_POST['class'] == 'ssd') 
    { 
     die("Selected ssd as Class."); 
    } 
    elseif($_POST['class'] == 'holo') 
    { 
     die("Selected holo as Class."); 
    } 
    elseif($_POST['class'] == 'cleric') 
    { 
     die("Selected clerric as Class."); 
    } 
    elseif($_POST['class'] == 'wizzard') 
    { 
     die("Selected wizz as Class."); 
    } 
    elseif($_POST['class'] == 'floppy') 
    { 
     die("Selected pitcher as Class."); 
    } 
    elseif(empty($_POST['class'])) 
    { 
     die("Select a Class."); 
    } 

全コード:

<?php 
require("common.php"); 

if(!empty($_POST)) 
{ 
// Ensure that the user has entered a non-empty username 
    if(empty($_POST['username'])) 
    { 
     die("Please enter a username."); 
    }  
// Ensure that the user has entered a non-empty password 
    if(empty($_POST['password'])) 
    { 
     die("Please enter a password."); 
    } 
//Class selector 
    if($_POST['class'] == 'ssd') 
    { 
     die("Selected ssd as Class."); 
    } 
    elseif($_POST['class'] == 'holo') 
    { 
     die("Selected holo as Class."); 
    } 
    elseif($_POST['class'] == 'cleric') 
    { 
     die("Selected clerric as Class."); 
    } 
    elseif($_POST['class'] == 'wizzard') 
    { 
     die("Selected wizz as Class."); 
    } 
    elseif($_POST['class'] == 'floppy') 
    { 
     die("Selected pitcher as Class."); 
    } 
    elseif(empty($_POST['class'])) 
    { 
     die("Select a Class."); 
    } 
//Character name 
    if(empty($_POST['charname'])) 
    { 
     die("Please enter a Charactername."); 
    }  
// Make sure the user entered a valid E-Mail address 
    if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
    { 
     die("Invalid E-Mail Address"); 
    } 


//SQL query to see whether the username entered by the user is already in use 
    $query = " 
      SELECT 
       1 
      FROM user 
      WHERE 
       username = :username 
     "; 

    $query_params = array(
      ':username' => $_POST['username'] 
    ); 

    try 
    { 
     $stmt = $db->prepare($query); 
     $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    { 
     die("Failed to run query:"); 
    } 
    $row = $stmt->fetch(); 
    if($row) 
    { 
     die("This username is already in use"); 
    }  
// email address unique check 
    $query = " 
      SELECT 
       1 
      FROM user 
      WHERE 
       email = :email 
     "; 

    $query_params = array(
      ':email' => $_POST['email'] 
    ); 

    try 
    { 
     $stmt = $db->prepare($query); 
     $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    { 
     die("Failed to run query"); 
    } 

    $row = $stmt->fetch(); 

    if($row) 
    { 
     die("This email address is already registered"); 
    } 

//charname unique check 
    $query = " 
      SELECT 
       1 
      FROM user 
      WHERE 
       charname = :charname 
     "; 

    $query_params = array(
      ':charname' => $_POST['charname'] 
    ); 

    try 
    { 
     $stmt = $db->prepare($query); 
     $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    { 
     die("Failed to run query"); 
    } 

    $row = $stmt->fetch(); 

    if($row) 
    { 
     die("This charactername is already taken"); 
    } 
    $query = " 
      INSERT INTO user (
       username, 
       charname, 
       password, 
       salt, 
       email, 
       class 
      ) VALUES (
       :username, 
       :charname, 
       :password, 
       :salt, 
       :email, 
       :class 
      ) 
     "; 

    $salt = dechex(mt_rand(0, 2147483647)) . dechex(mt_rand(0, 2147483647)); 

$password = hash('sha256', $_POST['password'] . $salt); 

    for($round = 0; $round < 65536; $round++) 
    { 
     $password = hash('sha256', $password . $salt); 
    } 

    $query_params = array(
      ':username' => $_POST['username'], 
      ':password' => $password, 
      ':salt' => $salt, 
      ':email' => $_POST['email'], 
      ':charname' => $_POST['charname'], 
      ':class' => $_POST['class'] 
    ); 

    try 
    { 
     // Execute the query to create the user 
     $stmt = $db->prepare($query); 
     $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    { 
     die("Failed to run query: "); 
    } 

    die("Redirecting to login.php"); 
} 


?> 
<h1>Register</h1> 
<b>NOTE! A admin or moderator will NEVER ask you for a loginname or password. Only a Character is needed for help or problems.</b> 
<form action="register.php" method="post"> 
    <br />Loginname<b> keep this private!</b>:<br /> 
    <input type="text" name="username" value="" /><br /> 
    Charactername<b> Advice is to use different name then the loginname, this is how people will see you</b>: <br /> 
    <input type="text" name="charname" value="" /><br /> 
    E-Mail: <br /> 
    <input type="text" name="email" value="" /><br /> 
    Password: <br /> 
    <input type="password" name="password" value="" /><br /> 
    Class: <br /> 
    <input type="radio" name="class" value="ssd"> Solid State Defender<br /> 
    <input type="radio" name="class" value="holo"> Hologram<br /> 
    <input type="radio" name="class" value="cleric"> Office Cleric<br /> 
    <input type="radio" name="class" value="wizzard"> IT Wizzard<br /> 
    <input type="radio" name="class" value="floppy"> Floppy Picher<br /><br /> 
    <input type="submit" value="Register" /> 
</form> 
+0

フィールドを探していますか? – axlj

+0

あなたはどちらが死んでいるのですか?条件付きでクエリを実行するとどうなりますか? – chris85

答えて

0

は、さらに2つのテーブルを作成します。

Classes - >この表には、ClassId,ClassName、およびStarting Class Properties(すなわち:HP、Manaなど)。

UserProperties - >この表は、各ユーザーへの参照を含む列、新しいユーザーが作成されPropertyNamePropertyValue

を持ってClassesテーブルから選択したクラスをロードし、とUserPropertiesテーブルを読み込む必要があります選択されたクラスの初期プロパティ。

特定のユーザーの特定のプロパティを照会して更新できるようになりました。

0

非表示の入力フィールドは、クラスごとにあらかじめ定義されているため、必要ありません。これは、データベース内の別のテーブル(たとえばClasses(classID, classLabel, HPInitial, ManaInitial)))に格納できるためです。

は、その後、あなたのクエリでは、単に追加することができます。

$query = ' INSERT INTO user (...,mana, hp,...) VALUES 
       (..., 
        (SELECT ManaInitial FROM Classes WHERE classLabel = :class), 
        (SELECT HPInitial FROM Classes WHERE classLabel = :class), 
       ...); 

あなたがサブクエリの多くを持つことになりますと、あなたがクラスに多くの属性を追加する場合、このアプローチは、多くの問題を引き起こします。より実際的な方法は、事前に属性を選択し、実行する前に挿入クエリにそれらを追加することです。

0

非常に興味深いソリューション、私は

axljあなたが好きな私は実際にいじり続け、あなたがそれについて考えるものを教えて、解決策を見つけました。 まだ基本的な統計をテーブルに入れることを考えていますが、これは実際にはうまくいきます。

//Class selector and full userinfo prepare 

if($_POST['class'] == 'ssd') 
{ 
    $query = "INSERT INTO user (username,charname,password,salt,regkey,email,class,hp,mana,atkpwr,defpwr,speed,crit,luck) VALUES (:username,:charname,:password,:salt,:regkey,:email,:class,'4','0','3','3','1','1','5')"; 
} 
elseif($_POST['class'] == 'holo') 
{ 
    $query = "INSERT INTO user (username,charname,password,salt,regkey,email,class,hp,mana,atkpwr,defpwr,speed,crit,luck) VALUES (:username,:charname,:password,:salt,:regkey,:email,:class,'4','2','5','0','1','1','5')"; 
} 
elseif($_POST['class'] == 'cleric') 
{ 
    $query = "INSERT INTO user (username,charname,password,salt,regkey,email,class,hp,mana,atkpwr,defpwr,speed,crit,luck) VALUES (:username,:charname,:password,:salt,:regkey,:email,:class,'4','3','2','1','1','1','5')"; 
} 
elseif($_POST['class'] == 'wizzard') 
{ 
    $query = "INSERT INTO user (username,charname,password,salt,regkey,email,class,hp,mana,atkpwr,defpwr,speed,crit,luck) VALUES (:username,:charname,:password,:salt,:regkey,:email,:class,'3','3','5','1','1','1','5')"; 
} 
elseif($_POST['class'] == 'floppy') 
{ 
    $query = "INSERT INTO user (username,charname,password,salt,regkey,email,class,hp,mana,atkpwr,defpwr,speed,crit,luck) VALUES (:username,:charname,:password,:salt,:regkey,:email,:class,'2','1','3','2','1','1','10')"; 
} 
elseif(empty($_POST['class'])) 
{ 
    die("Chose a class plix."); 
} 
関連する問題