2016-08-07 2 views
0

私はPHP mysqli proceduralを使って私のプロジェクトを書いたが、データを準備してバインドすることに決めた。役割ベースのユーザーシステムを作成しています。以下は、@ chris85の助けを借りて私の登録コードです。mysqli手続きとprepareステートメントの間にこだわって

<?php 

    session_start(); 
    if(is_file('include/connection.php')) 
    include_once('include/connection.php'); 
    else 
    exit('Database FILES MISSING:('); 


    if(isset($_POST['submit'])) { 
     $errors = array(); 
     $data = array(); 
     $name = $_POST['name']; 
     $last_name = $_POST['last_name']; 
     $user_name = $_POST['user_name']; 
     $user_type = $_POST['user_type']; 
     $email = $_POST['email']; 
     $password = $_POST['password']; 
     $confirm_password = $_POST['confirm_password']; 
     $created_at = $_POST['created_at']; 
     $password_hash = password_hash($password, PASSWORD_DEFAULT);  

     $created_at = date('Y-m-d'); 
     if(!($stmt = $mysqli->prepare("INSERT INTO user (name, last_name, user_name, user_type, email, password, created_at) 
      VALUES (?,?,?,?,?,?,?)"))){ 
      echo "Prepare failed: (" . $mysqli->errno . ")" . $mysqli->error; 
     } 

     if(!$stmt->bind_param('sssssss', $name, $last_name, $user_name, $user_type, $email, $password_hash, $created_at)){ 
     echo "Binding paramaters failed:(" . $stmt->errno . ")" . $stmt->error; 
     } 

     if(!$stmt->execute()){ 
     echo "Execute failed: (" . $stmt->errno .")" . $stmt->error; 
     } 

     if($stmt) { 
      $_SESSION['main_notice'] = "Successfully registered, login here!"; 
      header('Location: index.php'); 

     } 
     else{ 
      echo "Registration failed"; 
     } 

    } 

    $mysqli->close(); 

    ?> 
       <?php 

      //check for any errors 
    //    if(isset($error)){ 
    //     foreach($error as $error){ 
    //      echo '<p style="color: red">'.$error.'</p>'; 
    //     } 
    //    } 
       ?> 

     <form name="register" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" onsubmit="return check()"> 
     <table> 
     <tr> 
      <td>Name</td> 
      <td><input type="text" name="name" value='<?php echo ($name) ?>'></td> 
     </tr> 
     <tr> 
      <td>Last Name</td> 
      <td><input type="text" name="last_name" value='<?php echo ($last_name) ?>'></td> 
     </tr> 
     <tr> 
      <td>User Name</td> 
      <td><input type="text" name="user_name" value='<?php echo ($user_name) ?>'></td> 
     </tr> 
     <tr> 
      <td>User Type</td> 
      <td> 
      <select name="user_type" required> 
      <option value="member">Member</option> 
      <option value="leader">Leader</option> 
      </select> 
      </td> 
     </tr> 

     <tr> 
      <td>Email</td> 
      <td><input type="email" name="email" value='<?php echo ($email) ?>'></td> 
     </tr> 
     <tr> 
      <td>Password:</td> 
      <td><input type="password" name="password" id="password"></td> 
     </tr> 
     <tr> 
      <td>Confirm Password:</td> 
      <td><input type="password" name="confirm_password" id="confirm_password"></td> 
     </tr> 
     <tr> 
      <td></td> 
      <td><input type="submit" name="submit" value="Register"></td> 
      <td><a href='index.php'>Login</a></td> 
     </tr> 
     </table> 
     </form> 
    </div> 
    <script> 
    // function check(){ 
    // if(document.getElementById('password').value != document.getElementById('confirm_password').value){ 
    //  alert('password not match'); 
    //  return false; 
    // }else{ 
    //  return true; 
    // } 
    // } 
    </script> 
    <?php 
    if(is_file('include/footer.php')) 
    include_once('include/footer.php'); 
    ?> 

これで、stmtとbindを含む同じログインシステムを実行しようとしています。キンダーはロールパーツを実行する方法につきましたか?以下は私のログインコードです。

<?php 
    session_start(); 
    if(isset($_SESSION['user_type']) && isset($_SESSION['user_id'])) 
    { 
     header('Location: profile.php'); 
    } 

    session_start(); 
    if(is_file('include/connection.php')) 
     include_once('include/connection.php'); 
    else 
     exit('Database FILES MISSING:('); 

    $username = $_POST['username']; 
    $password = $_POST['password']; 

    if(isset($_POST['submit'])){ 


     if(!($stmt = $mysqli->prepare("SELECT * FROM user WHERE user_name = '$name' AND password = '$password' AND user_type = '$user_type'"))){ 
      echo "Prepare failed: (" . $mysqli->errno . ")" . $mysqli->error; 
     } 

     if(!$stmt->bind_param('sss', $username, $password, $user_type)){ 
      echo "Bind failed: (" . $stmt->errno . ")" . $stmt->error; 
     } 

     if(mysqli_num_rows($result)){ 

      $row = mysqli_fetch_array($result);    
      $_SESSION['user_id'] = $row['id']; 
      $_SESSION['user_name'] = strtoupper($row['name']); 
      $user_type = strtolower($row['user_type']); 
      if(strtolower($user_type) == 'member'){ 

       $_SESSION['user_type'] = 'member'; 
       //header('Location: member-dashboard-home.php'); 
       header('Location: profile.php'); 

      }elseif(strtolower($user_type) == 'admin' || strtolower($user_type) == 'leader'){ 

       $_SESSION['user_type'] = strtolower($user_type);           
       //header('Location: admin-dashboard-home.php'); 
       header('Location: profile.php'); 
      } 


     }else{ 
      $_SESSION['main_notice'] = "Invalid login details!"; 
      header('Location: '.$_SERVER['PHP_SELF']);exit(); 
     } 
    } 
} 

$stmt->bind_result($username, $password); 
$stmt->store_result(); 

if(password_verify($password, $row['password'])){ 

    $_SESSION['user'] = $_POST['username']; 
    header('Location: restricted.php'); 
    exit(); 
} else{ 
    echo "Login Failed: (" . $stmt->errno .")" . $stmt->error; 
} 
$stmt->close(); 

} 

$mysqli->close(); 

$_SESSION['main_title'] = "Login"; 
?> 

私のコードがどこにあっても謝罪します。コードを編集したり、途中で何が起きているのかを説明してください。

ありがとうございます。

+0

SO **ない自由なコーディングやコード変換やデバッグやチュートリアルやライブラリの検索サービスはまた、あなたはあなた自身の問題を解決するためにいくつかの努力をしていることを示さなければならない **です。 – RiggsFolly

+0

こんにちは、私がここに投稿する前に、このコーディングに取り組んでいるのを見ることができます...私のためにプロジェクトを作成するように頼んでいるようなものではありません。 –

+0

よく@chris85が最初の部分をしましたが、今度は他の人が次の部分をやりたがります。あなたの一人があなたのために大部分を書いていることに、あなたは一種の依存関係にあるようです。 – RiggsFolly

答えて

2

あなたはこのコードを持っている:

if (!($stmt = $mysqli->prepare("SELECT * FROM user WHERE user_name = '$name' AND password = '$password' AND user_type = '$user_type'"))) 
{ 
    echo "Prepare failed: (" . $mysqli->errno . ")" . $mysqli->error; 
} 

しかし、あなたの代わりに、具体的な変数名を使用してのprepareに疑問符を使用する必要が準備されたステートメントで

ので、コードは次のように次のようになります。あなたがbind_param前に変数$user_typeを定義する必要があります。また

if (!($stmt = $mysqli->prepare("SELECT * FROM user WHERE user_name = ? AND password = ? AND user_type = ?"))) 
{ 
    echo "Prepare failed: (" . $mysqli->errno . ")" . $mysqli->error; 
} 

bind_paramした後は、さらにあなたは、一般的にはSELECT *

$stmt->bind_result($column_1, ..., $column_n); 

のようなクエリを使用する場合、変数を持つユーザーテーブルからすべての列をバインドする必要がある$stmt->execute();

してクエリを実行する必要があり、より詳細に見てmysqliに用意されている文hereにあります。

最後に、コードに構文上の誤りがあることに気付きました。そこにはさらに2つの閉じ括弧があります。

}else{ 
    $_SESSION['main_notice'] = "Invalid login details!"; 
    header('Location: '.$_SERVER['PHP_SELF']); 
    exit(); 
} 
} 
} <= Delete this bracket 


else{ 
    echo "Login Failed: (" . $stmt->errno .")" . $stmt->error; 
} 
$stmt->close(); 

} <= Delete this bracket 
+0

ああええと...私はそれを書き留めます。ありがとう。 –

+0

もし私がコードを修正すれば、ログインコードの残りの部分はどのように見えますか...私はまだ何かを含めたり削除したりしています。 –

+0

遅く返事を申し...申し訳ありませんが、今これを見ています。本当にうれしいです。ありがとう。 –

関連する問題