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

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

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

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

Q&A

解決済

2回答

1627閲覧

"Username already exists"と表示したい

YukaSaku

総合スコア52

PHP

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

0グッド

0クリップ

投稿2017/05/23 14:47

登録画面で、クエリーエラーがあると、Couldn't execute queryと表示されるようになっています。これはきちんと機能しています。

が、ユーザーが入力をし、例えば同じユーザーネームがある場合に登録できない時など、Couldn't execute queryではなく、Username already existsと表示させたいです。

そのため、以下のコードを追加したところ、データベースに存在しないユーザーネームを登録しようとしてもはじかれるようになりました。

php

1if (!empty($_POST['username']) ) { // Confirm the username on the DB that user input 2 //$sql = "SELECT username FROM login"; 3 $sql = ("SELECT username FROM login WHERE username = '" . $_POST['username']); 4 $rows = 1; 5 } 6 if ($rows == 1) 7 { 8 echo "Username already exists"; 9 include("form.inc"); 10 exit; 11 } else {

全体のコードはこちらになります。

php

1<?php 2/* Program name: register.php 3 * Description: Program displays the blank form and checks 4 * all the form fields for blank fields. 5 */ 6 7ini_set("display_errors","on"); 8error_reporting(E_ALL | E_STRICT); 9ini_set("include_path","./includes"); 10include("dbinfo.inc"); 11$gen=""; 12 13if(isset($_POST['submitted']) and $_POST['submitted'] == "yes") 14{ 15 if(!isset($_POST['gen'])) 16 { 17 $blank_data[] = $gen; 18 } 19 foreach($_POST as $field => $value) 20 { 21 if(empty($value)) 22 { 23 $blank_data[] = $field; 24 } 25 else 26 { 27 $good_data[$field] = strip_tags(trim($value)); 28 } 29 } 30 if(@sizeof($blank_data) > 0) 31 { 32 $message = "<p style='color: red; margin-bottom: 0; 33 font-weight: bold'> 34 You didn't fill in one or more required fields. 35 You must enter: 36 <ul style='color: red; margin-top: 0; 37 list-style: none' >"; 38 /* display list of missing information */ 39 foreach($blank_data as $value) 40 { 41 $message .= "<li>$value</li>"; 42 } 43 $message .= "</ul>"; 44 //extract($good_data); 45 echo $message; 46 include("form.inc"); 47 exit(); 48 } 49 foreach($_POST as $field => $value) 50 { 51 if(!empty($value)) 52 { 53 //validations 54 $name_patt = "/^[A-Za-z0-9' -]{1,15}$/"; 55 $email_patt = "/^.+@.+\\..+$/"; 56 $phone_patt = "/^[0-9)(xX -]{7,20}$/"; 57 $passwd_patt = "/^[A-Za-z0-9' -]{1,60}$/"; 58 59 $field = htmlspecialchars($field, ENT_QUOTES); 60 $value = htmlspecialchars($value, ENT_QUOTES); 61 62 if(preg_match("/username/i",$field)) 63 { 64 if(!preg_match($name_patt,$value)) 65 { 66 $error_array[] = "$value is not a valid Username"; 67 } 68 } 69 if(preg_match("/phone/i",$field)) 70 { 71 if(!preg_match($phone_patt,$value)) 72 { 73 $error_array[] = "$value is not a valid Phone"; 74 } 75 } 76 if(preg_match("/email/i",$field)) 77 { 78 if(!preg_match($email_patt,$value)) 79 { 80 $error_array[] = "$value is not a valid Email"; 81 } 82 } 83 84 if(preg_match("/password/i",$field)) 85 { 86 if(!preg_match($passwd_patt,$value)) 87 { 88 $error_array[] = "$value is not a valid password"; 89 } 90 } 91 echo "<div class='field'>"; 92 } 93 } 94 95 if(@sizeof($error_array) > 0) 96 { 97 $message = "<ul style='color: red; list-style: none' >"; 98 foreach($error_array as $value) 99 { 100 $message .= "<li>$value</li>"; 101 } 102 $message .= "</ul>"; 103 echo $message; 104 @extract($clean_data); 105 include("form.inc"); 106 exit(); 107 } 108 else 109 { 110 $cxn = mysqli_connect($host,$user,$passwd,$dbname) 111 or die("Couldn't connect to server"); 112 $clean_data = array(); 113 foreach($_POST as $field => $value) 114 { 115 $clean_data[$field] = mysqli_real_escape_string($cxn,$value); 116 } 117 $date = date("Y-m-d H:i:s"); 118 ?> 119 120 <form method="post"> 121 <input type="hidden" name='$field' value="<?php echo htmlspecialchars($good_data['value']); ?>"> 122 <input type="hidden" name="gen" value="<?php echo $gen; ?>"> 123 <input type="hidden" name="date" value="<?php echo $date; ?>"> 124 </form> 125 126 <?php 127 if (!empty($_POST['username']) ) { // Confirm the username on the DB that user input 128 //$sql = "SELECT username FROM login"; 129 $sql = ("SELECT username FROM login WHERE username = '" . $_POST['username']); 130 $rows = 1; 131 } 132 if ($rows == 1) 133 { 134 echo "Username already exists"; 135 include("form.inc"); 136 exit; 137 } else { 138 139 140 /* loop that displays the form */ 141 $sql = "INSERT INTO login (username,phone,email,password,gen,date) 142 VALUES ('".$clean_data['username']."', 143 '".$clean_data['phone']."', 144 '".$clean_data['email']."', 145 '".$clean_data['password']."', 146 '".$clean_data['gen']."', 147 '$date')"; 148 149 150 $result = mysqli_query($cxn,$sql) 151 or die("Couldn't execute query"); 152 $signUpMessage = 153 'Your Username is '.$clean_data['username'].' <br>'. 154 ' Phone is '.$clean_data['phone'].' <br>'. 155 ' Email is '.$clean_data['email'].' <br>'. 156 ' Gender is '.$clean_data['gen'].' <br>'. 157 ' The registration date is '.$date.' <br>'. 158 ' Keep your password for your security.'; 159 echo $signUpMessage; 160 include("stored.inc"); 161 } 162 } 163} 164else 165{ 166 include("form.inc"); 167} 168?>

どのようにして表示させればいいでしょうか?
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

INSERT IGNORE INTO で登録処理をはしらせ
rowCount()して、更新行が0件だったときに登録失敗させればよいでしょう

PHP

1$username = filter_input(INPUT_POST,'username'); 2$pdo = new PDO($dsn, $user,$password); 3if(!is_null($username)){ 4 $sql="INSERT IGNORE INTO login(username) values(?)"; 5 $stmt = $pdo->prepare($sql); 6 $stmt->execute([$username]); 7 if($stmt->rowCount()==0){ 8 echo "Username already exists"; 9 } 10}

投稿2017/05/24 00:19

yambejp

総合スコア114583

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

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

YukaSaku

2017/05/24 03:45 編集

学校での課題でして、私もPDOを使って処理をしたいと思っているのですが、なぜかPDOを使うと先生に怒られます。なのでmysqliを使わないといけなかったのですが、方法が理解でき、解決できたのでこちらをベストアンサーにさせて頂こうと思います。ありがとうございます。
YukaSaku

2017/05/24 20:11

このPHPマニュアルは、よくチェックするのですが、いまいちピンとこなくて、誰かに説明してもらわないと理解できないんです。でもこの件については、沢山例が載っていたので、参考に出来そうです。ありがとうございます。
guest

0

SELECT文を実行している箇所がない、その上$rowsに1を入れているので常にif文の中に入っていますね。

また、SELECT文は構文エラーになると思います。ログ出力して確認しましょう。
さらにPOST値をそのままSQL文の組立に使うのは危険なのでやめたほうがいいですよ。

投稿2017/05/23 15:30

yona

総合スコア18155

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

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

YukaSaku

2017/05/23 17:24

現在以下のように変えてみたら、Couldn't execute queryと表示されるようになり、この構文を入れてない状態に戻ってしまいました。 if (!empty($good_data['username']) ) { $sql = "SELECT username FROM login WHERE username = '" . $good_data['username']; if ($result = $cxn->query($sql)) { $username_result = $good_data['username']; $rows =1; } if ($rows == 1) { echo "Username already exists"; include("form.inc"); exit; } else { select文を見直して、POSTをgood_dataに変えて、実行文を加えてみたのですが、$rowsはどのように対処したらいいのかわかりません。フラグを立てて、もしフラグが立ってればみたいな方法がいいと思ったのですが、どのようにしたらいいのでしょうか。他に方法があれば、その方法も教えていただければと思います。よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問