PEAR::AuthにPDOのContainerを追加してみる(検証中)の続きです。
addUser()を使ってテーブルにユーザー登録はできたのですが、
同じユーザー名を入れられないようにするにはどうしたらいいかなと思いまして。
1.addUserする前に検索して1つあるかどうかを探す。
2.エラーをキャッチして表示する。
1は例があったので、2にしてみました。(あまのじゃく)
515 516 517 518 519 520 521 | try{ $sth->execute(); $res = $sth->fetch(PDO::FETCH_ASSOC); }catch(PDOException $e){ //var_dump($e); return PEAR::raiseError($e->getMessage()); } // try |
こんな感じでエラーをキャッチします。var_dumpで見たときはこんな出力でした。
object(PDOException)#6 (8) { ["message":protected]=> string(175) "SQLSTATE[23505]: Unique violation: 7 ERROR: 重複キーが一意性制約"player_name_uniq"に違反しています DETAIL: キー (name)=(test) はすでに存在します" ["string":"Exception":private]=> string(0) "" ["code":protected]=> string(5) "23505" ["file":protected]=> string(54) "/usr/xxxxxxxxxxxxxxxlib/pear.auth.PDO.class.php" ["line":protected]=> int(516) ["trace":"Exception":private]=> array(3) { [0]=> array(6) { ["file"]=> string(54) "/usr/xxxxxxxxxxxxxxx/lib/pear.auth.PDO.class.php" ["line"]=> int(516) ["function"]=> string(7) "execute" ["class"]=> string(12) "PDOStatement" ["type"]=> string(2) "->" ["args"]=> array(0) { } } [1]=> array(6) { ["file"]=> string(24) "/usr/share/pear/Auth.php" ["line"]=> int(1213) ["function"]=> string(7) "addUser" ["class"]=> string(18) "Auth_Container_PDO" ["type"]=> string(2) "->" ["args"]=> array(3) { [0]=> &string(4) "test" [1]=> &string(4) "test" [2]=> &string(0) "" } } [2]=> array(6) { ["file"]=> string(51) "/usr/xxxxxxxxxxxxxxx/htdocs/xxxxxx/xxxxx.php" ["line"]=> int(30) ["function"]=> string(7) "addUser" ["class"]=> string(4) "Auth" ["type"]=> string(2) "->" ["args"]=> array(2) { [0]=> &string(4) "test" [1]=> &string(4) "test" } } } ["previous":"Exception":private]=> NULL ["errorInfo"]=> array(3) { [0]=> string(5) "23505" [1]=> int(7) [2]=> string(138) "ERROR: 重複キーが一意性制約"player_name_uniq"に違反しています DETAIL: キー (name)=(test) はすでに存在します" } } |
この出力の中で、この行を入れることで簡単にメッセージが抜けます。
520 return PEAR::raiseError($e->getMessage());
※getMessageだけじゃなくて、getCodeとかもあるので、これらの中から自由に取れるかも。
http://php.net/manual/ja/language.exceptions.phpに書いてあった例です。
/* Protected methods inherited from Exception class */ public function getMessage(); // Exception message public function getCode(); // User-defined Exception code public function getFile(); // Source filename public function getLine(); // Source line public function getTrace(); // An array of the backtrace() public function getTraceAsString(); // Formated string of trace |
プログラムでライブラリを呼んだ時の動作です。
if(isset($_POST['username']) && isset($_POST['password'])){ echo '登録しています<br>'; $out=$auth_obj->addUser($_POST['username'],$_POST['password']); //echo $out.'<br>'; // debug if(stristr($out,'SQLSTATE[23505]')){ echo $_POST['username'].'はすでに使用されています。別のIDを入力してください。<br>'; }else{ echo $_POST['username'].'は正常に登録されました。<br>'; } // if SQLSTATE[23505] } // if $_GET check |