アプリ版:「スタンプのみでお礼する」機能のリリースについて

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()で変換したものを入れてありますが、
「認証していません」が表示されてしまいます。
コード自体に問題があるのでしょうか?
ご教示願います。

A 回答 (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 ) );
?>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
やはり、sqlite3ではsqlite_openが使用できないんですね。
教えていただいたコードも大変参考になりました。

本当にご丁寧にありがとうございました。

お礼日時:2010/12/24 12:40

もう解決されているかもしれませんが、


興味があったので 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 …
    • good
    • 0

直接関係あるのかは、分かりませんが・・・



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は使えないという結論でしょうか?

補足日時:2010/12/20 20:46
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

申し訳ございませんが、単なるコードの写し間違いだと思いますが、

今は出先なので、戻り次第確認してみます。

何でもいいので、他にもお気付きの点がございましたら、

ご教示ください。

お礼日時:2010/12/20 08:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!