
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ベストアンサー
- 回答日時:
そのエラーですと$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)が正しいか確認してください。
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さんのおかげで問題は全て解決できました。
”誠にありがとうございました!”
ベストアンサーに選ばせて頂きます。
No.2
- 回答日時:
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間違ってたらすいません・・・
参考URL:http://jp.php.net/manual/ja/pdostatement.fetch.php
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(); の所になります。
No.1
- 回答日時:
どこで、どのようなエラーが発生しているのでしょうか?
それが分からないと、上記のスクリプトを実行できる環境がある人以外は回答できないですよ
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を使っております。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アラートでyes noを作りたいです。
-
DBで検索結果に該当するデータ...
-
SELECT結果から動的にコンボボ...
-
PHPでMySQLのストアドプロシー...
-
mysqlから取得した配列をカンマ...
-
MySQLでデータベースにデータin...
-
VB.NET エラーになる箇...
-
テキストボックスに入れた内容...
-
Pro*Cの構文エラー
-
実行時エラー3131 FROM 句の構...
-
JAVA SQLServerException 列名 ...
-
MySqlのテーブルのサイズを取得...
-
phpmyadminにタグを格納するには
-
ASPでSQL文を使う場合に。
-
カラムにデータがあるかないか...
-
PHPのSQLインジェクションはspr...
-
Q&Aサイトを作成していてURLの...
-
sqliteの構造体
-
テーブルの最後のレコードしか...
-
sqlから多次元配列に要素を格納...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
dbに登録したデータをphpのプル...
-
DBで検索結果に該当するデータ...
-
アラートでyes noを作りたいです。
-
PHPの画像表示関連(?)プログラ...
-
データの取得方法
-
配列で指定した値のみをMySQLか...
-
警告を出さないコードの書き方
-
PHPで[]の使い方について
-
ループ文で呼び出したデータの...
-
DBからSelectしたレコードのデ...
-
mySQLで結果が無いときの処理
-
データベースのページング出力...
-
PHP セレクトメニューの呼び出...
-
PHP 10件表示 "前へ" "次へ"
-
mySQLからデータを取り出す
-
データベースサーバーにあるデ...
-
PHPのプルダウンメニューにDBの...
-
mysql>PHPにデータ表示、10件ご...
-
テーブル<TR></TR>の処理について
-
php テーブルが作成できない
おすすめ情報