• ベストアンサー
  • 困ってます

PHP、SQLite3のデーターでログイン認証

  • 質問No.6465628
  • 閲覧数1565
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 74% (40/54)

PHP、SQLite3のデーターベースでログイン認証をさせたいのですが、うまくいきません。

MySQL用のコードを自分でSQLite3用に改造したのですがやはり駄目でした。

コードは以下の通りです。

<?php
// セッションの生成
session_start();
// ユーザー名/パスワード
$usrid = htmlspecialchars($_POST['usrid'], ENT_QUOTES);
$usrpw = htmlspecialchars($_POST['usrpw'], ENT_QUOTES);
//データーベース接続
require_once('dbcon.php');
// データベースへの問い合わせSQL文
$sql = 'SELECT id,name FROM meibo WHERE usrid = "'.$usrid.'" AND usrpw = "'.$usrpw.'"';
$sth = $dbh->prepare($sql);
$sth->execute();
// 認証
if ($row = $sth->fetch() == 1) {
// ログイン成功
$login = 'OK';
      $row = $sth->fetch();
      // データーをセッション変数に保存
$_SESSION['id'] = $row->id;
$_SESSION['name'] = $row->name;
$_SESSION['usrid'] = $row->usrid;
echo 'ログインに成功しました。';
} else {
echo 'ログインに失敗しました。';
}
//データーベース切断
$dbh = null;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

<?php echo $_SESSION['id']; ?><br />
<?php echo $_SESSION['name']; ?><br />
<?php echo $_SESSION['usrid']; ?><br />

</body>
</html>

データーの表示、追加、削除は可能な状態です。

根本的に間違っているのでしょうか?またはちょっとした手直しで問題解決できるのでしょうか?

お分りの方いらっしゃいましたらお教えください。

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

  • 回答No.3
  • ベストアンサー

ベストアンサー率 77% (73/94)

そのエラーですと$sth = $dbh->prepare($sql);で失敗してるのでしょう。
SQLが正しくないということでしょうね。

$sql = 'SELECT id,name FROM meibo WHERE usrid = "'.$usrid.'" AND usrpw = "'.$usrpw.'"';
上記SQLの設定ですとusridとusrpwはダブルクォーテーションでくくられるようになります。
ダブルクォーテーションは使えなかった・・・ような?
とりあえずシングルクォーテーションに変更するため
$sql = "SELECT id,name FROM meibo WHERE usrid = '".$usrid."' AND usrpw = '".$usrpw."'";
としてみてください。

これが関係なかった場合、prepare以降の処理をコメントアウトした状態で$sqlをprint()等で
出力するようにして正しくSQLがセットされているか確認してみてください。
もしかしたら入力画面から正しくPOSTされていない可能性があります。

それも正しかったらフォーム名(meibo),カラム名(id,name,usrid,usrpw)が正しいか確認してください。
お礼コメント
tinpu

お礼率 74% (40/54)

duronさん、早速の返信ありがとうございます。

>>>それも正しかったらフォーム名(meibo),カラム名(id,name,usrid,usrpw)が正しいか確認してください。

id が no になっておりました。

$sql = 'SELECT id,name FROM meibo WHERE usrid = "'.$usrid.'" AND usrpw = "'.$usrpw.'"';


$sql = "SELECT id,name FROM meibo WHERE usrid = '".$usrid."' AND usrpw = '".$usrpw."'";

どちらでも問題なく動作しました。

さらに dbcon.phpもデーターファイルへのパスに誤入力がありました。

duronさんのおかげで問題は全て解決できました。

”誠にありがとうございました!”

ベストアンサーに選ばせて頂きます。
投稿日時:2011/01/23 18:25

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 77% (73/94)

db接続部分の記述がないのでPDOを使用していると想定します。
ちなみに私はPDOを使ったことがないのでその分でも予想で書くことになります。

// 認証
if ($row = $sth->fetch() == 1) {

この文で$rowは行データが配列の形でセットされることになると思います。
そのため1行であっても「1」と同値にはなりません。
PDOStatement->fetchは失敗した場合FALSEが返るようなので
「if ($row = $sth->fetch()) {」 とすれば行データがあった場合には
ログイン成功ルートにいけるのではないかなと思います。

ただ、fetch()にパラメータ無ですとPDO::FETCH_BOTHがデフォルトであるため
返されるのはオブジェクト形式ではなく配列ですので

// データーをセッション変数に保存
$_SESSION['id'] = $row->id;

$_SESSION['id'] = $row["id"];にする必要があると思います。
もしくはPDO::FETCH_OBJをパラメータに渡せばいいかと思います。
PDOStatement->fetchObject()なんてのもあります。

2回目(if文の中)の「$row = $sth->fetch();」は必要ないです。

と、ここまで書いておいてPDOじゃなかったor間違ってたらすいません・・・
お礼コメント
tinpu

お礼率 74% (40/54)

duronさん、返信ありがとうございます。

お察しの通りPDOを使っております。

ご指摘の箇所を書きなおしましたがやはりエラーが発生してしまいます。

すみません、前回エラーコードを書き込むのを忘れておりました。

エラーコードは
Fatal error: Call to a member function execute() on a non-object in C:\xampp\htdocs\SQLite\login.php on line 12

login.php on line 12 は
 ↓ ↓
$sth->execute(); の所になります。
投稿日時:2011/01/22 22:30
  • 回答No.1

ベストアンサー率 18% (194/1035)

どこで、どのようなエラーが発生しているのでしょうか?

それが分からないと、上記のスクリプトを実行できる環境がある人以外は回答できないですよ
お礼コメント
tinpu

お礼率 74% (40/54)

gtx456gtxさん、返信ありがとうございます。

エラー内容は以下の通りです。
Fatal error: Call to a member function execute() on a non-object in C:\xampp\htdocs\SQLite\login.php on line 12
 ↓ ↓
login.php on line 12は $sth->execute();の列になります。

duronさんの指摘された個所を書き直しましたがやはり同じエラーが出てしまいます。

ちなみにPDOを使っております。
投稿日時:2011/01/22 22:24
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ