現在php掲示板の制作をしており、メール認証機能を制作ができましたが、同じメールアドレスでの登録を防ぎたいため、ユニークキーを設定しましたが私はメアで入力時にエラー画面を出したいと考えているため、この方法では解決しませんでした。そこで、調べてたところ、重複しているメアドの数を探し、1以上なら登録ができないようにするという方法で解決することができるということで、下記のようにやってみましたがうまく動いてくれず、ページが真っ白になって動かなくなります。
エラーコードとしては
PHP Warning: mysqli_query() expects parameter 1 to be mysqli
などが出てしまう状況です。
データベース接続は別のシートで行っており、
<?php
function db_connect(){
$dsn = 'mysql:host=localhost;dbname=・・;charset=utf8';
$user = '・・';
$password = '・・';
try{
$dbh = new PDO($dsn, $user, $password);
return $dbh;
}catch (PDOException $e){
print('Error:'.$e->getMessage());
die();
}
}
?>
としており、下記の別ページで読み込んでいます。
このコードに何かおかしな部分はございますか?ちなみにこの後はif (count($errors) === 0){という風にerrorsの有無で管理をしています。わかる方おられましたれ回答よろしくお願いします。
//POSTされたデータを変数に入れる
$mail = isset($_POST['mail']) ? $_POST['mail'] : NULL;
//メール入力判定
if ($mail == ''){
$errors['mail'] = "メールが入力されていません。";
}else{
if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mail)){
$errors['mail_check'] = "メールアドレスの形式が正しくありません。";
}
if (empty($errors)) {
$sql = sprintf('SELECT COUNT(*) AS cnt FROM member WHERE mail="%s"',
mysqli_real_escape_string($db, $_POST['mail'])
);
$record = mysqli_query($dbn, $sql) or die(mysqli_error($dbn));
$table = mysqli_fetch_assoc($record);
if ($table['cnt'] > 0) {
$error['mail'] = 'duplicate';
}
}
if ($error['mail'] == 'duplicate'){
$errors['member_check'] = "このメールアドレスはすでに利用されております。";
}
追記
このエラーの原因がわかりました。下記のコードはsqliでデータベース接続をした場合にしか適応できないようでした。
では、これをPDOで書き換えた場合、どこを変化させることで実行可能になるのでしょうか?
分かる方おられましたら回答よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
new PDO にてデータベースの接続点を確保しているのにも関わらず、
別概念別系統の関数(mysqli_real_escape_string, mysqli_query, mysqli_error, mysqli_fetch_assoc)を使っているのが、
そもそもの間違いです。
を一読して、PDO接続中にmysqli_*系関数を使わない記述に直してください。
PDO接続の方が好まれていて、これから開発するなら絶対PDOを使うべきです。
PHP: どの API を使うか - Manual
mysqli_*系は、古いシステムがmysql_*で書かれているのを
現行サーバー上で最小限の変更で動かすためにあるような面があるので
今更習得しなくて良いと思います。
また、SQL文をsprintfで出力していますが、
これもprepare()→bindValue()→execute()の三段構えで行えばやらずにすみます。
PDO::prepare → PDOStatement::bindValue → PDOStatement::execute の3ステップでクエリを実行する
ちなみに、メールアドレスを正規表現で検査するのは、
RFC準拠のやり方を徹底しようとすると変な話
(docomoはRF2822非準拠とか)
になるため、現実解としてのやり方があります。
404 Blog Not Found:「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ
メールアドレスを表す現実的な正規表現 - Qiita
今時のメールアドレス正規表現 - Qiita
要は、テスト用メールアドレスをどこまで実際の使われているものでテストするか次第で、
ここまでの想定でテストしたのだから良しとする、というのを明確にしておけばよいかと。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.21%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
m.ts10806
2020/03/08 18:49
追記 から始められても経緯分かりませんので、整理いただけますか?
huku
2020/03/08 18:51
すみません、訂正いたしました。
m.ts10806
2020/03/08 18:52
$dbnはどこで定義されるのでしょう
huku
2020/03/08 18:57
追記いたしました。
ockeghem
2020/03/08 19:22
$dbnはmysqli を前提としていますが、定義の箇所はPDOなので対応していないですね。