質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

5087閲覧

メールアドレスの重複チェックについて

earnest_gay

総合スコア615

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2016/06/05 05:01

下記コードで、アドレスの重複チェックを表示することができました。
DBでuserdataというテーブルにemailというカラムがあり、test@testという値が格納されてます。

<?php $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; try{ $dbh = new PDO($dsn, $user, $password); $dbh->query('SET NAMES sjis'); $sql = 'select * from userdata'; foreach ($dbh->query($sql) as $row) { if($row['email'] == $_POST['email1']){ echo ($_POST['email1'] ."は既に登録されています"); } } }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } $dbh = null; ?> <tr> <td>E-mail</td> <td colspan="2"><input type="email" name="email1" maxlength="50" size="46" placeholder="info@example.com" ></td> <td></td> </tr>

とりあえず正常に動作するかのテストなのでブラウザの一番上に表示されている状態ですが
本当は下記のところに表示させたいのです。

<tr> <td>E-mail</td> <td colspan="2"><input type="email" name="email1" maxlength="50" size="46" placeholder="info@example.com" ></td> <td>ここにエラー時の表示をさせたい</td> </tr>

ということで、変数に代入しました。
$error = ($_POST['email1'] ."は既に登録されています");

<tr> <td>E-mail</td> <td colspan="2"><input type="email" name="email1" maxlength="50" size="46" placeholder="info@example.com" ></td> <td><?php $error ?></td> </tr>

スコープの関係で呼び出せてないだろうなとは思いますが、
まだ勉強中の身で、この例だと$errorはif内でしか呼び出せなかったことを学んだ記憶があります。

アドレスの重複チェックを定義したものを呼び出すには、どうしたら良いのでしょうか?

最終的にはクラスを作って呼び出したいのです...

<?php class mail{ function collation(){ $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; try{ $dbh = new PDO($dsn, $user, $password); $dbh->query('SET NAMES sjis'); $sql = 'select * from userdata'; foreach ($dbh->query($sql) as $row) { if($row['email'] == $_POST['email1']){ $error = ($_POST['email1'] . "は既に登録されています"); } } }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } $dbh = null; } } ?>
<tr> <td>E-mail</td> <td colspan="2"><input type="email" name="email1" maxlength="50" size="46" placeholder="info@example.com" ></td> <td><?php mail::collation(); ?></td> </tr>

イメージは大体あってると思うのですが、記述をどこか間違えていることは自覚していますが、どうすればよいのかわからず...

YuzuRyo61👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

php

1<?php 2//$dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; 3$dsn = 'mysql:dbname=test;host=localhost;charset=sjis'; 4$user = 'root'; 5$password = ''; 6 7$email = filter_input(INPUT_POST, 'email'); 8 9try { 10// try ~ catch で例外を受けるためには必要 11 $option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 12 13// $dbh = new PDO($dsn, $user, $password); 14 $dbh = new PDO($dsn, $user, $password, $option); 15// $dbh->query('SET NAMES sjis'); // <- ダメ $dsn で設定する 16// $sql = 'select * from userdata'; 17 $sql = 'select count(*) as cnt from userdata where email=?'; 18 $stmt = $dbh->prepare($sql); 19 20 $arrParam = array(); 21 $arrParam[] = $email; 22 $stmt->execute(); 23 24 $row = $stmt->fetch(PDO::FETCH_ASSOC); 25 if (0 < $row['cnt']) { 26 $error = "{$email}は既に登録されています"; 27 } 28 29// 全件取得して、PHPでループなんて無駄以外の何物でもない 30// foreach ($dbh->query($sql) as $row) { 31// if ($row['email'] == $_POST['email1']) { 32// echo ($_POST['email1'] . "は既に登録されています"); 33// } 34// } 35} catch (PDOException $e) { 36 $error = $e->getMessage(); 37} 38// $dbh = null; // <- 不要 どうしても必要なら、末尾で。 39?> 40 41<tr> 42 <td>E-mail</td> 43 <td colspan="2"><input type="email" name="email1" maxlength="50" size="46" placeholder="info@example.com" ></td> 44 <td> 45 <?php 46 if (isset($error)) { 47 echo $error; 48 } 49 ?> 50 </td> 51</tr> 52<?php 53$dbh = null; // <- どうしても必要なら、ここ。 54?>

投稿2016/06/05 05:40

編集2016/06/05 05:56
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/06/05 06:03

早速の回答ありがとうございます! ただ、エラーがでてしまいます... SQLSTATE[HY093]: Invalid parameter number: no parameters were bound $email = filter_input(INPUT_POST, 'email'); と $error = "{$email}は既に登録されています"; は $email = filter_input(INPUT_POST, 'email1'); と $error = "{$email1}は既に登録されています"; でなくてよいのでしょうか?
退会済みユーザー

退会済みユーザー

2016/06/05 06:13

email1なんてどこにあるの?情報を出さずにデバッグさせるのはやめて。
退会済みユーザー

退会済みユーザー

2016/06/05 06:37

ああ、name=email1なのね。適当に修正してやってみてください。
sounisi5011

2016/06/05 07:06

executeメソッド(22行目)の引数に$arrParamが指定されていません。 そのせいで、プリペアドステートメントのプレースホルダ(?の箇所)に値が割り当てられていないのが原因かと思われます。 $arrParam = array(); $arrParam[] = $email; $stmt->execute(); このコードを、以下のように修正してください。 $arrParam = array(); $arrParam[] = $email; $stmt->execute($arrParam); または、以下のように見やすくしても良いかもしれません。 $stmt->execute(array($email));
退会済みユーザー

退会済みユーザー

2016/06/05 07:12

thanks!
earnest_gay

2016/06/05 08:15

お二方ありがとうございます! 提示していただいたコードで正常に動作しました! 合間にphpリファレンス見ながら自分でも改良してみました... お時間がありましたらアドバイス頂けると嬉しいです。 $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $email1 = filter_input(INPUT_POST, 'email1'); try{ $dbh = new PDO($dsn, $user, $password); $dbh -> setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql = 'SELECT count(*) AS cnt FROM userdata WHERE email=?'; $prepare =$dbh->prepare($sql); //プレースホルダーに$mail1をバインド $prepare->bindValue(1,$email1,PDO::PARAM_STR); $prepare->execute(); $result = $prepare->fetchColumn(); if($result > 0){ echo "{$email1}は既に登録されています。"; } }catch (PDOException $e) { echo "Error:".$e->getMessage(); }
退会済みユーザー

退会済みユーザー

2016/06/05 08:45 編集

指摘されたことをやってください。なんで echo をそこでやるかなぁー
earnest_gay

2016/06/05 09:08

すいません...処理では表示をさせてはいけないんでしょうか? あと... クラス化しなければ if (isset($error)) { echo $error; } で呼び出せるのですが クラス化してしまうと if (isset($error)) { echo $error; } で呼び出してDBに登録しているアドレスを入力してみても 表示されないんです...
退会済みユーザー

退会済みユーザー

2016/06/05 09:18

そこでecho したら <td>に表示できないでしょ?
退会済みユーザー

退会済みユーザー

2016/06/05 09:19 編集

なに?クラスかだと?今更そんな事実を出さんでくれ!頼むから情報を小出しにするのはやめておくれ。
退会済みユーザー

退会済みユーザー

2016/06/05 09:21

クラスにするにしても、メソッド内でechoはダメダメソースですね。
earnest_gay

2016/06/05 09:24

すいません、、、 クラス化はまた別で質問してみようと思います。 一応、最終的にはこういう使い方をしようとしていたんです。 class mail{ function collation(){ $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $email = filter_input(INPUT_POST, 'email1'); try{ $option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); $dbh = new PDO($dsn, $user, $password, $option); $sql = 'select count(*) as cnt from userdata where email=?'; $stmt = $dbh->prepare($sql); $arrParam = array(); $arrParam[] = $email; $stmt->execute($arrParam); $row = $stmt->fetch(PDO::FETCH_ASSOC); if (0 < $row['cnt']) { $error = "{$email}は既に登録されています"; return $error; } } catch (PDOException $e) { $error = $e->getMessage(); return $error ; } } } <td><?php echo mail::collation(); ?></td> これで<td>に表示ができます。 何度もお付き合い頂いて本当にありがとうございます。
退会済みユーザー

退会済みユーザー

2016/06/05 09:27

そうそう。これなら問題なしですね。ただ…重複がないときは何もreturn しないの?エラーが出るわけではありませんが。static の方がいいかなー
guest

0

echo
とりあえず、変数がどこで変化しているか、var_dump等で、チェックするクセをつけるとイイですよ。

投稿2016/06/05 05:36

編集2016/06/05 07:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/06/05 06:03

ありがとうございます!
sounisi5011

2016/06/05 06:59

ver_dumpではなく、var_dumpです。
退会済みユーザー

退会済みユーザー

2016/06/05 07:11 編集

失礼^^;修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問