PHP,SQL,オブジェクト指向プログラミングで掲示板を作成中。認証処理でつまづいています。

このQ&Aのポイント
  • 現在、PHPとSQLとオブジェクト指向を用いて、掲示板を作成中です。ログインフォームまで完成しましたが、認証処理でつまづいています。
  • 具体的には、テーブルuserの呼び出しの部分とユーザ認証の処理が問題です。
  • つまづいた理由は、ユーザ入力とデータベースの内容を比較する箇所でうまく動作していないためです。
回答を見る
  • ベストアンサー

PHP,SQL,オブジェクト指向プログラミング

こんにちは。僕は、現在、PHPとSQLとオブジェクト指向を用いて、掲示板を作成しています。 今ログインフォームまで完成しましたが、その中の認証処理でつまづいています。 ソースを載せますので、アドバイス等お願いします。 session_start(); include 'class.php'; include 'useclass.php'; $its=new keijibandatabase(); $its->k_conect(); $its->k_usertable(); $its2=new userdata; $its2->k_login(); function k_usertable() { //テーブルuserの呼び出し $sql = 'SELECT * FROM user'; $stmt=$this->pdo->query($sql); while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){ } //データベースクラス function k_login() { //ユーザ認証 $row; $user=$_POST['user']; $pass=$_POST['pass']; if($user===$row['uid'] && $pass===$row['pass']){ echo "成功"; }else{ echo "失敗"; } } 以上です。 これらのコードは別々のファイルに記述されています。 回答よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.4

こんにちは。 >($row = $stmt -> fetch(PDO::FETCH_ASSOC)){」 >で$rowに各ユーザのレコードを格納したわけなんですが、この「$row」を 全てのレコードを利用するなら1レコード毎に$rowを他の変数に入れてあげる必要があります。 var $rows = array(); while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){ $rows[] = $row; } //データベースクラス とすると$rowsという配列に全てのレコードが入ります。 それを他のクラスに渡すならクラスの作りによりますがメソッドで受け取れば良いのでは? $user->setRecord ( $rows ); // どっかのクラスのメソッド function setRecord ( $rows ) { } ただ質問者様がやろうとしていることは一般的ではありません。 質問内容やソースの書き方からすると クラスの作り方、変数の渡し方等々再度学ぶ必要があるレベルだと思います。 複数のレコードを取得しているのに if($user===$row['uid'] && $pass===$row['pass']) { } では誰と一致させようとしているか?

riku3991
質問者

お礼

わかりやすい解説ありがとうございました。 なんとか解決できるように頑張ります

その他の回答 (3)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.3

こんにちは。 まず認証の仕方の構想がずれているようです。 通常、送信されたユーザIDとパスワードを条件としてSQLを発行してレコードが存在するかどうかで認証します。 例:select * from user where userid='userid' and password='password' 今の動きですと全てのデータを取得して一致させようとしていますが、そんな無駄なことはしません。 どちらにせよ今のソースですと$rowは別クラスで取得しているのでそのまま利用できるはずがありません。 もう少しクラスの作り方とかを学ぶ必要があると思います。 例えばユーザIDとパスワードをクラスに設定するなら class User { private $userId; private $password; public function __construct ( $userId, $password ) { $this->userId = $userId; $this->password = $password; } } こんな感じにして $user = new User ( 'ユーザID', 'パスワード' ); として呼び出します。

riku3991
質問者

補足

回答ありがとうございます。 また、別の質問なんですが、 質問1の補足から、 これはデータベースクラスなのですが、「function k_usertabale() { ~ 「while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){」 で$rowに各ユーザのレコードを格納したわけなんですが、この「$row」を ユーザクラスである、 「function k_login() { $user=$_POST['user']; //このPOSTは入力フォームのところで設定してあります $pass=$_POST['pass']; if($user===$row['uid'] && $pass===$row['pass']) { echo "成功"; }else{ echo "失敗"; } } に「$row」に格納されている配列を使いたいときはどうすればいいのでしょうか。 よろしくお願いします

回答No.2

これじゃクラスの関連もわからねーよ。 $user === $row['uid']とかやってるけど$rowっていつ中身が入るんだ? 第一$rowがローカル変数なのかグローバル変数なのかわからないし、グローバル変数なんてクラス使ったら基本的に使わないだろ。 クラス設計から見直したほうがいいよ。 第一何に対してのアドバイスが欲しいのかぜんぜんわからん。 お前さん、自分でこれに回答しようとしたら回答できると思う?

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 >ソースを載せますので、アドバイス等お願いします。 何に対するアドバイスでしょうか。 ソースレビュー? それとも >その中の認証処理でつまづいています。 ってところでしょうか? それだとしたら「どうするとどうなる」という情報が足りなすぎます。 >これらのコードは別々のファイルに記述されています。 どこからどこまでが別のファイルなんだかわかりません。 認証もどのようにして考えているか読み取れません。 補足下さい。

riku3991
質問者

補足

すみません。 かなりわかりにくかったようですね。 捕捉させていただきますと、 一番最初の質問に対してですが、 ソースレビューということで構いません まず、 session_start(); から $its2->k_login(); までで、一つ 次に function k_usertable() { //テーブルuserの呼び出し から while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){ } //データベースクラス までで、一つ 最後に function k_login() { //ユーザ認証 から }else{ echo "失敗"; } } までで、全部3つのファイルになっています。 この処理だと ユーザIDとパスワードを入力すると今の場合だと認証に成功した場合、「成功」、失敗した場合だと、「失敗」と出力できるようにしたいのですが、これだと、失敗とししか出力されませんでした。 >認証もどのようにして考えているか読み取れません。 ということに関してですが、 まず、ログインフォームみたいのがあります。 ユーザIDとパスワード入力することによって、 SQL文で、「user」というテーブルを呼び出し、uid(ユーザID)とpass(パスワード)、ユーザネームを$rowという変数に格納ということになっています。ちなみに、試作なので、「user」というテーブルにはあらかじめ、4人分のアカウントが入っています。 一度while句のところでvar_dump($row);してみたのですが、配列にちゃんとなっているようなのですが、その配列したデータが「function k_login() { //ユーザ認証」のところに行かないようです。 こんな感じの補足でよろしかったでしょうか? よろしくお願いします

関連するQ&A

  • PHPの書き方について

    PHPを独学で勉強中で、気になったことがあるので質問させていただきます。 最初に買った書籍とその次に買った書籍で書き方が違うところがあるので、普通はどちらでやるのか、また、使い分けがあるのかが知りたいです。 たとえば、データベースを1行ずつ取り出す処理で、1冊目では $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM ○○"; $stmt = $pdo->prepare($sql); $stmt->execute(null); $res = ""; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= $row['△△'] ."," .$row['□□'] ."<br>\n"; } ・・・というコードがあったのですが、2冊目には同じような処理が mysqli_fetch_assoc()を使って書かれていたり、 接続の仕方も1冊目では「new PDO($dnsinfo,$USER,$PW);」を使って書かれているのが、2冊目では「mysqli_connect()」になっていたり、 他にも同じような処理がよく似たコードで書かれています。 調べてみると、PHP5.5から1冊目のやり方になった・・・ような記事を見つけたのですが、どちらの本もPHP5.5と書いてあり、いまいちよくわかりません。 詳しい方いらっしゃいましたらご教示お願いいたします。

    • ベストアンサー
    • PHP
  • PHPでスレッド式掲示板を作りたいです

    こんにちは。現在Androidアプリで掲示板を作ろうと思いPHPとDBを活用してスレッド式掲示板を作成しています。 テーブルはこのような感じで構成しています。 スレッド一覧テーブル sureid(int ai) surename(text) name(text) time(text) rescount(int) コメントテーブル sureid(int) surename(text) name(text) msg(text) id(text) time(text) 作っていく途中で躓いてしまったので御教授願います。 1つ目 スレッド一覧画面で選択したsureidをGETしスレッドの中の画面でGETしたsureidの投稿を表示させたい。 2つ目 スレッド一覧画面で各スレッド一覧の横にスレッドのレス数を表示させたい。 <?php $USER= ''; $PW= ''; $dnsinfo= ""; $user= array(); $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM thread"; $stmt = $pdo->prepare($sql); $stmt->execute(null); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $user[] = array ('surename'=> $row["surename"] ,'name' => $row["name"] ,'rescount' => $row["rescount"]; } $res = array_reverse($user); echo json_encode($res); ?> スレッド一覧のプログラムはこのようになっています。

    • 締切済み
    • PHP
  • php どこが間違っているんでしょうか?

    いつも大変お世話になり誠にありがとうございます。 標記の件。 27行目のfunction getAllBlog() { にParse error: syntax error, unexpected token "function", expecting ";" in C:\xampp\htdocs\dbc.php on line 27 と出ます。 一体、どこが間違っているのでしょうか? ご回答のほど宜しくお願い申し上げます。      記 <?php //関数1つに1つの機能のみ持たせる //データベース接続 //データを取得する //1.データベース接続 //引数:なし //返り値:接続結果を返す function dbConnect() { $dsn = 'mysql:host=localhost;dbname=blog;charset=utf8'; $user ='blog_user'; $pass ='**********'; try { $dbh = new PDO($dsn,$user,$pass,[ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗'; $e->getMessage(); exit(); }; return $dbh // 2.データを取得する //引数:なし //返り値:取得したデータ function getAllBlog() { $dbh = dbConnect(); //⓵SQLの準備 $sql = 'SELECT * FROM blog'; //⓶SQLの実行 $stmt = $dbh->query($sql); //⓷SQLの結果を受け取る $result = $stmt-> fetchall(PDO::FETCH_ASSOC); return $result; $dbh = null; } //取得したデータを表示 $blogData = getAllBlog(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ブログ一覧</title> </head> <body> <h2>ブログ一覧</h2> <table> <tr> <th>No.</th> <th>お名前</th> <th>カテゴリー</th> </tr> <?php foreach($blogData as $column): ?> <tr> <td><?php echo $column['id']?></td> <td><?php echo $column['name']?></td> <td><?php echo $column['category']?></td> </tr> <?php endforeach; ?> </table> </body> </html>

    • ベストアンサー
    • PHP
  • 突如!接続エラー!?php

    いつもお世話になりありがとうございます。 標記の件。 下記のエラーがlocalhost/index.php/で出ました。 接続失敗SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for $host failed: ���̂悤�ȃz�X�g�͕s���ł��B 大変恐縮ではございますが、下記のコードを吟味して頂けないでしょうか? 度々申し訳ございません。 宜しくお願い申し上げます。      記 index.php <?php require_once ('blog.php'); $blog = new Blog(); $blogData = $blog->getAll(); function h($s){ return htmlspecialchars($s, ENT_QUOTES,"UTF-8"); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ブログ一覧</title> </head> <body> <h2>ブログ一覧</h2> <p><a href="/form.html">新規作成</a></p> <table> <tr> <th>タイトル</th> <th>カテゴリー</th> <th>投稿日時</th> <tr> <?php foreach ($blogData as $column): ?> <tr> <td><?php echo h($column['title']) ?></td> <td><?php echo h($blog->setCategoryName($column['category'])) ?></td> <td><?php echo h($column['post_at']) ?></td> <td><a href="/detail.php?id=<?php echo $column['id'] ?>">詳細</a></td> <td><a href="/update_form.php?id=<?php echo $column['id'] ?>">編集</a></td> <td><a href="/blog_delete.php?id=<?php echo $column['id'] ?>">削除</a></td> </tr> <?php endforeach; ?> </body> </html> env.php <?php define('DB_HOST','localhost'); define('DB_NAME','blog_app'); define('DB_USER','blog_user'); define('DB_PASS','**********'); ?> dbc.php <?php require_once('env.php'); class Dbc { protected $table_name; protected function dbConnect() { $host = DB_HOST; $dbname = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = 'mysql:host=$host;dbname=$dbname;blog_app;charset=utf8'; try { $dbh = new \PDO($dsn, $user, $pass, [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗' . $e->getMessage(); exit(); }; return $dbh; } public function getAll() { $dbh = $this->dbConnect(); //①SQLの準備 $sql = "SELECT * FROM $this->table_name"; //②SQLの実行 $stmt = $dbh->query($sql); //③SQLの結果を受け取る $result = $stmt->fetchall(\PDO::FETCH_ASSOC); return $result; $dbh = null; } public function setCategoryName($category) { if ($category == '1') { return '日常'; } elseif ($category == '2') { return '非日常'; } else { return 'その他'; } } public function getById($id) { if (empty($id)) { exit('idが不正です。'); } $dbh = $this->dbConnect(); $sql = "SELECT * FROM $this->table_name"; $stmt = $dbh->prepare("SELECT * FROM $this->table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetch(\PDO::FETCH_ASSOC); if (!$result) { exit('本文がありません。'); } return $result; } public function delete($id) { if (empty($id)) { exit('idが不正です。'); } $dbh = $this->dbConnect(); $stmt = $dbh->prepare("DELETE FROM $this->table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT); $stmt->execute(); echo 'ブログを削除しました!'; return $result; } } ?> <p><a href="/">戻る</a></p> 大変、お手数をおかけします。 どうか教えてください。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • PHPでGLOBAL STATUSを取得?

    PHPのプログラム上で、global status情報を取得するにはどうすれば良いのでしょうか? MySQLへの接続にはPDOを使用しているので、PDOを使用して取得したいのですが・・・ 単純に、 $sql_global = 'SHOW GLOBAL STATUS'; $stmt_global = $dbh -> prepare($sql_global); $stmt_global -> execute(); while($value = $stmt_global->fetch(PDO::FETCH_ASSOC)) { var_dump($global); } としてみましたが、これでは全てNULLが返ってきてしまいました。 どうすれば良いか、ご存知の方がいらっしゃったら教えてください! どうぞよろしくお願いいたしますm(_ _)m

    • ベストアンサー
    • PHP
  • php 66行目の関数に矛盾???

    いつも大変お世話になり誠にありがとうございます。 標記の件。 たくさんファイルがあるので、他の箇所に 問題があるのかもしれません。 エラーメッセージは Fatal error: Cannot redeclare Dbc::getBlog() in C:\xampp\htdocs\dbc.php on line 66 です。 度々申し訳ございません。 アドバイスを宜しくお願い申し上げます。      記 <?php require_once('env.php'); Class Dbc { protected $table_name; //1.データベース接続 //引数:なし //返り値:接続結果を返す protected function dbConnect() { $host = DB_HOST; $dbname = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = "mysql:host = $host;dbname = $dbname;charset=utf8"; try { $dbh = new \PDO($dsn,$user,$pass,[ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗'; $e->getMessage(); exit(); }; return $dbh; } //カテゴリー名を表示 //引数:数字 //返り値:カテゴリーの文字列 function setCategoryName($category) { if ($category == '1') { return '日常'; }elseif ($category == '2') { return '非日常'; }else{ return 'その他'; } } //引数:id //返り値:$result public function getBlog($id) { if(empty($id)) { exit('idが不正です。'); } } public function getAllBlog() { $dbh = $this->dbConnect(); //⓵SQLの準備 $stmt = $dbh->prepare('SELECT * FROM blog Where id = :id'); $stmt->bindValue(':id',(int)$id, \PDO::PARAM_INT); //⓶SQLの実行 $stmt->execute(); //⓷SQLの結果を受け取る $result = $stmt-> fetchall(\PDO::FETCH_ASSOC); if(!$result) { exit('本文がありません。'); } return $result; $dbh = null; } //引数:$id //返り値:$result public function getBlog($id) { ★ここが66行目です。 if(empty($id)) { exit('idが不正です。'); } $dbh = $this->dbConnect(); //SQL準備 $stmt = $dbh->prepare('SELECT * FROM blog Where id = :id'); $stmt->bindValue(':id',(int)$id, \PDO::PARAM_INT); //SQL実行 $stmt->execute(); //結果を取得 $result = $stmt->fetch(\PDO::FETCH_ASSOC); if(!$result) { exit('本文がありません。'); } } //return $result; } function delete($id) { exit('idが不正です。'); } return $result;

    • ベストアンサー
    • PHP
  • phpのコードでうまく動かず困っています

    現在ある書籍でログイン機能の基礎を学んでいるのですが、エラーが出て困っています。 書籍内のコードや付属のサンプルファイルの物をいれたり確認したりするのですがエラーがでます。 エラー Fatal error: Call to a member function bindParam() on a non-object in C:\xampp\htdocs\tennis\login.php on line 15 (この15行目は〇の部分です) コード <?php session_start(); //セッション開始 if(isset($_SESSION['id'])){ //セッションにユーザーIDがある(ログインしている) header('Location:index.php'); }else if(isset($_POST['name']) && isset($_POST['password'])){ $dsn = 'mysql:host=localhost; dbname=tennis; charset=utf8'; $user ='tennisuser'; $password = 'password'; try{ $db = new PDO($dsn, $user, $password); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $db->prepare("SELECT * FROM users WHERE name=:name AND password=:pass"); ○$stmt->bindParam(':name', $_POST['name'], PDO::PARAM_STR); $stmt->bindParam(':pass', sha1($_POST['password']), PDO::PARAM_STR); //クエリ実行 $stmt->execute(); if($row = $stmt->fetch()){ //ユーザーが存在していたので、セッションにユーザーIDをセット $_SESSION['id'] = $row['id']; header('Location:index.php'); exit(); }else{ //1レコードも取得できなかった場合 //ユーザー名・パスワードは間違っている可能性があるのでもう一度ログインフォームを表示 header('Location:login.php'); exit(); } }catch(PDOException $e){ die('エラー:'.$e->getMessage()); } }else{ //ログインしていない場合はログインフォームを表示 ?> <html> ~省略~

    • ベストアンサー
    • PHP
  • php ページャー

    php ページャー機能がうまくいきません。 ご教授お願いいたします。 ページリンク2、3と押しても ページが移動しません。 ずっと一ページ目のままです。 解決方法よろしくお願いいたします。 index.php peger.php 書きソースはpeger.phpです。 index.htmlとのソースの違いは if(preg_match('/^[1-9][0-9]*$/', $_GET['page']) ){ $page = (int)$_GET['page']; }else{ $page = 1; } のプログラムががindex.phpにはないだけです。 <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>検索</title> </head> <body> <?php if(preg_match('/^[1-9][0-9]*$/', $_GET['page']) ){ $page = (int)$_GET['page']; }else{ $page = 1; } $page = 1; $limit = 2; $offset = $limit * ($page - 1); $dsn='mysql:dbname=****;host=****'; $user='*****'; $password='*****'; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql='SELECT count(*) FROM `mst_product`'; $stmt=$dbh->prepare($sql); $stmt->execute(); $db=null; $total=$stmt->fetchColumn(); $lastpage= ceil($total/$limit); $sql = 'SELECT * FROM mst_product ORDER BY code DESC LIMIT '.$limit.' OFFSET '.$offset.' ' ; $stmt = $dbh->prepare($sql); $stmt->execute(); $db = null; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ echo $row['name']; echo'</br>'; echo $row['price']; } echo '<ul class="pager">'; ?> <?php if($page > 1){?> <li><a href="pager.php?page=<?php echo $page-1; ?>"> << </a></li> <?php } for($i = $page; $page-2 < $i && $i <= $page+4 && $i <= $lastpage; $i++){ ?> <?php if($i == $page){ ?> <li><a href="kensaku_pager.php?page=<?php echo $i; ?>"><?php echo '<font color="#FF4DC4">'.$i.'</font></a></li>'; }else{?> <li><a href="pager.php?page=<?php echo $i; ?>"><?php echo $i.'</a>'; ?> <?php echo '</li>'; } } if($page < $lastpage){ ?> <li><a href="pager.php?page=<?php echo $page+1; ?>"> >> </a></li> <?php } ?> </ul> </body> </html>

    • ベストアンサー
    • PHP
  • php ログインについて

    php ログインについて phpでログイン画面を作っているのですがログインできません。エラー等々もでず、「スタッフコードかパスワードが違います」になります。ちなみにDBにはスタッフのデータはしっかり存在します。 コードとパスワードを正しく入力しているにもかかわらずログインできません。 ソースはこちらです [staff_login.php] <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>ログイン</title> </head> <body> スタッフログイン<br/> <br/> <form method="post" action="staff_login_check.php"> スタッフコード<br/> <input type="text" name="code"><br/> パスワード<br/> <input type="password" name="pass"><br/> <br/> <input type="submit" value="ログイン"> </form> </body> </html> [staff_login_check.php] <?php try { $staff_code=$_POST['code']; $staff_pass=$_POST['pass']; $staff_code=htmlspecialchars($staff_code); $staff_pass=htmlspecialchars($staff_pass); $staff_pass=md5($staff_pass); $dsn='mysql:dbname=*****;host=********'; $user='*********'; $password='********'; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql='SELECT name FROM mst_staff WHERE code=? AND password=?'; $stmt=$dbh->prepare($sql); $data[]=$staff_code; $data[]=$staff_pass; $stmt->execute($data); $dbh = null; $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { print'スタッフコードかパスワードが違います<br/>'; print'<a href="staff_login.html">戻る</a>'; } else { header('Location: staff_top.php'); } } catch(Exception $e) { print'エラーが発生しました'; exit(); } ?> 解決方法、ご指摘ございましたら教えていただきたいです。

    • ベストアンサー
    • PHP
  • Call to a member function fetch() on a non-object in

    初歩的なことかもしれませんがよろしくお願いいたします。 以下のようなソースでSQLITEからデータを取得しようとしています。 $dsn = "sqlite:aaaa.db,'',''"; $pdo = new PDO($dsn); $sql = "SELECT * FROM m00_aaatbl WHERE m00_aaaaa = '".$_POST['aaaaaa']."'"; $stmt = $pdo->query($sql); $row = $stmt->fetch(); ローカル環境で試験してたときには動作していたのですが、サーバにUPして動作させようとすると Call to a member function fetch() on a non-object in /public_html/index.php on line XX と出てしまいます。(エラーの箇所は$row = $stmt->fetch();) これは、どういった原因が考えられるのでしょうか? php Version 5.2.8です。 お願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう