PHP初心者で、PEAR Authによるsqliteを使用して認証のテストを行っています。
コード:
<?php
require_once "Auth.php";
function loginFunction()
{
echo "<form method=\"post\" action=\"test_auth.php\">";
echo "<input type=\"text\" name=\"username\">";
echo "<input type=\"password\" name=\"password\">";
echo "<input type=\"submit\">";
echo "</form>";
}
$dsn = array(
'phptype' => 'sqlite',
'database' => 'test.sqlite',
'mode'=>'0644'
);
$options = array(
'dsn' => $dsn,
'table'=>"schedule_usr",
'usernamecol'=>"username",
'passwordcol'=>"password"
);
$a = new Auth("DB", $options, "loginFunction");
$a->start();
if ($a->checkAuth()) {
print("認証しました。");
}else{
print("認証していません。"));
}
?>
エラーなどは表示されませんが、「認証しました」が表示されません。
test.sqliteではschedule_usrテーブルに username=test password=1111を
入力してあります。パスワードはmd5()で変換したものを入れてありますが、
「認証していません」が表示されてしまいます。
コード自体に問題があるのでしょうか?
ご教示願います。
No.3ベストアンサー
- 回答日時:
ちょっと面白半分でsqlite3でも認証だけは出来るようにしてみました。
書き込める文字数制限でいろいろ簡易にしていますので、参考程度にしてください。<?php
require_once 'Auth.php';
require_once 'Auth/Container.php';
class Auth_Container_SQLite3 extends Auth_Container {
function Auth_Container_SQLite3($param) {
$this->_setDefaults();
$this->_parseOptions($param);
}
function _setDefaults() {
$this->options['table'] = 'auth';
$this->options['usernamecol'] = 'username';
$this->options['passwordcol'] = 'password';
$this->options['dsn'] = '';
}
function _parseOptions($array) {
foreach ($array as $key => $value) {
if (isset($this->options[$key]))
$this->options[$key] = $value;
}
}
function fetchData( $username, $password, $isChallengeResponse = false ) {
$sql= sprintf( 'SELECT %s, %s FROM %s WHERE %s = ? AND %s = ?',
$this->options['usernamecol'], $this->options['passwordcol'], $this->options['table'],
$this->options['usernamecol'], $this->options['passwordcol']);
try {
$db= new PDO( $this->options['dsn'], NULL, NULL );
$sth= $db->prepare( $sql );
$sth->bindParam(1, $username);
$sth->bindParam(2, md5($password));
$sth->execute();
$result= $sth->fetchAll();
return ( sizeof( $result ) > 0 ) ? TRUE : FALSE;
} catch( PDOException $e ) {
return PEAR::raiseError($e->getMessage(), $e->getCode());
}
return FALSE;
}
}
function loginFunction( $username = null, $status = null, &$auth = null ) {
$contents= <<<HTML
<form method="post">
<input type="text" name="username" value="%s" />
<input type="password" name="password" value="" />
<input type="submit" />
</form>
HTML;
return printf( $contents, $username );
};
$options = array(
'dsn'=> 'sqlite:////test.sqliteまでをフルパスで記述',
'table'=> 'schedule_usr',
'usernamecol'=> 'username',
'passwordcol'=> 'password'
);
$a = new Auth( new Auth_Container_SQLite3($options), NULL, 'loginFunction' );
$a->start();
$msg = ( $a->checkAuth() === TRUE ) ? '認証しました。' : '認証していません。';
exit( sprintf( '<div>%s<div>'.PHP_EOL, $msg ) );
?>
ご回答ありがとうございました。
やはり、sqlite3ではsqlite_openが使用できないんですね。
教えていただいたコードも大変参考になりました。
本当にご丁寧にありがとうございました。
No.2
- 回答日時:
もう解決されているかもしれませんが、
興味があったので PEAR::Auth のソースの該当部分を読んでみました。
$a = new Auth("DB", $options, "loginFunction");
にて選択されている "DB" では PEAR::DB に依存しているのですが,
データベースを open するときに sqlite_open (もしくは sqlite_popen )を呼んでいます。
この関数は sqlite3 のデータベースを開けないようです。
#file is encrypted or is not a database のエラーを発行します。
sqlite3 を開くには PDO を使うか SQLite3 オブジェクトを利用するようです。
ざっと見たところ PEAR::Auth にはどちらのデータベースドライバも使った実装が無いようでした。
ただ、全く手が出ないワケではないみたいで、自分で認証コンテナを実装することはできるみたいです。
作り方は参照URLにサンプルがあります(残念ながら sqlite3 の例ではありません。)が、
Auth_Container を継承し function fetchData($username, $password) を実装するだけみたいです。
参考URL:http://pear.php.net/manual/en/package.authentica …
No.1
- 回答日時:
直接関係あるのかは、分かりませんが・・・
print("認証していません。"));
は、
print("認証していません。");
でないですか?
この回答への補足
確認しましたが、
print("認証していません。"));は間違いで、
コードはちゃんとprint("認証していません。");になっていました。
申し訳ないです。
sqlite のバージョンは3.7.4なんですが、$dsnの作成方法が違うのでしょうか?
下記のページでもsqlite3ではDB Error: no database selectedとなると書いてありました。(DBの場合、私は問題なかったんですけど・・・)
http://www.phpbook.jp/pear/pear_db/index6.html
使い方があっている分からないんですが、
$a->listUsers()で検証したんですが、DB Error: no database selected
となっていました。sqlite3は使えないという結論でしょうか?
ご回答ありがとうございました。
申し訳ございませんが、単なるコードの写し間違いだと思いますが、
今は出先なので、戻り次第確認してみます。
何でもいいので、他にもお気付きの点がございましたら、
ご教示ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php ログイン 1 2022/11/01 00:24
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<input type="hidden" >で配列...
-
PHP ボタンが押されたら処理を...
-
PHPで、ボタンを押すと同じペー...
-
フォームへの前回入力値をクリ...
-
syntax error, unexpected '}' ...
-
PHPでフォームから任意の画像削...
-
$_SESSIONについて教えて下さい。
-
フォームでのリセットを使う方法
-
エラーを元の画面に表示させるには
-
検索時の選択内容を保持する方法
-
入力フォーム→確認画面→送信画...
-
HTMLで前の画面に戻る時、入力...
-
複数行のデータ一括更新に関して
-
DBのWHERE~ANDの使い分けをphp...
-
PHPの関数実行
-
チェックボックスのvalueに変数...
-
phpの掲示板で新しい順に表...
-
チェックボックスの全選択/解除...
-
テキストボックスに初期値を入れる
-
extract($_POST)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<input type="hidden" >で配列...
-
HTMLで前の画面に戻る時、入力...
-
PHPでユーザー情報を入力して簡...
-
PHP ボタンが押されたら処理を...
-
PHPとHTML+Xamppの掲示板で画像...
-
syntax error, unexpected '}' ...
-
検索時の選択内容を保持する方法
-
PHPでCookieを使った訪問回数に...
-
チェックボックスによる検索
-
PHPで画像の渡しが上手く行きま...
-
フォームでのリセットを使う方法
-
チェックボックスによる検索(...
-
フォームへの前回入力値をクリ...
-
フォームボタンを押すたびに数...
-
php mysql でチェックボックス...
-
PHPの関数実行
-
PHPで、ボタンを押すと同じペー...
-
phpで分からないエラーが出てし...
-
ラジオボタンをsessionで使いたい
-
入力フォーム→確認画面→送信画...
おすすめ情報