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

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

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

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Q&A

解決済

2回答

1881閲覧

DBで自動発行されたcust_IDの取得の仕方

YukaSaku

総合スコア52

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

0グッド

0クリップ

投稿2017/05/25 04:42

編集2017/05/25 05:29

現在、以下のようなプログラムになっています。ユーザーがデータを登録するとDB側で自動的にcust_IDが割り振られるようになっています。

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

そのcust_IDをSELECT文で取得したいのですが、今まで登場してこなかったcust_IDなので、Undefine errorになってしまいます。
現在、このようになってるところを

php

1$sql = "SELECT username FROM login WHERE username = '" . $good_data['username'];

このように直してみました。

php

1$sql = "SELECT cust_ID, username FROM login WHERE username = '" . $good_data['cust_ID']. $good_data['username'];

インプットされたデータではなく、DB側で自動発行されたcust_IDをどのようにすれば取得できるでしょうか。

テーブルはこのようになっています。

テーブル名: login

cust_ID INT(5) AUTO_INCREMENT.Primary key.Unique.
username VARCHAR(15)
email VARCHAR(50)
password VARCHAR(60)
date datetime

テーブル名: login_time

login_no INT(5)Primary key.
cust_ID INT(5)Primary key.
logtime TIMESTAMP

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

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

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

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

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

guest

回答2

0

ベストアンサー

自動発行されたcust_IDというのは

INSERT INTO login (username,phone,email,password,gen,date)

ここでauto_incrementにより発番されるIDでしょうか?

login のテーブル構造などがわからないと「DB側で自動発行されたcust_ID」が謎です

投稿2017/05/25 05:09

u-sukesan

総合スコア156

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

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

YukaSaku

2017/05/25 05:29

情報足らずですみません。テーブル情報を追加しました。 よろしくお願いします。
u-sukesan

2017/05/25 05:57 編集

INSERT文の後で SELECT LAST_INSERT_ID() AS id; とすると直前に発番したIDを取得できます $sql = "SELECT LAST_INSERT_ID() AS id;"; $newID = $cxn->query($sql));
YukaSaku

2017/05/25 06:18

$sql ="SELECT LAST_INSERT_ID() AS id"; と入れるとエラーになるのですが、どのように書けばいいでしょうか? PDO構文だと調べるとたくさん出てくるんですけど、私のこのコードだとどのように書けばいいでしょうか。
u-sukesan

2017/05/25 07:52

どこでcust_IDを使いたいのかわかりませんが INSERT文をqueryした後に記述すれば取得できると思いますよ //省略 /* loop that displays the form */ $sql = "INSERT INTO login (username,phone,email,password,gen,date) VALUES ('".$clean_data['username']."', '".$clean_data['phone']."', '".$clean_data['email']."', '".$clean_data['password']."', '".$clean_data['gen']."', '$date')"; } $result = mysqli_query($cxn,$sql) or die("Couldn't execute query"); $sql = "SELECT LAST_INSERT_ID() AS id;"; $newID = mysqli_query($cxn,$sql) or die("Couldn't execute query"); print_r($newID); //省略
YukaSaku

2017/05/25 08:11

ありがとうございます。 cust_IDは他のページでログインタイムを記録する時にselectでIDを持ってきて、insertで、ログインタイムを入れるということをしたいのですが、SELECT とINSERTが同時に使えなくて困っていたので、ユーザー登録する時点でIDを持っておいた方がいいのかなと思ったんです。 今、いただきましたコードを試したのですが、Catchable fatal error: Object of class mysqli_result could not be converted to string inとエラーが出ました。 なんでstringにしようとしているのでしょうか。。。?INTのままでいいのですが。。。
u-sukesan

2017/05/25 08:24

print_r($newID); でCatchable fatal error: Object of class mysqli_result could not be converted to string inとエラーになりますか? echo しているのではなく?
YukaSaku

2017/05/25 14:56

echoしていました。すみません。 print_r($newID);に変えて実行したところ、 mysqli_result Object ( [current_field] => 0 [field_count] => 1 [lengths] => [num_rows] => 1 [type] => 0 ) と表示されました。 DBにあるIDを表示させたかったのですが、何かの配列を持ってきてるのでしょうか。
u-sukesan

2017/05/26 00:37

失礼しました。 一文抜けていました $sql = "SELECT LAST_INSERT_ID() AS id;"; $res = mysqli_query($cxn,$sql) or die("Couldn't execute query"); $newID = mysqli_fetch_assoc($res); print_r($newID); 結果 Array ( [id] => 新しく発番したID )
YukaSaku

2017/05/26 01:00

なんどもコメントありがとうございます。 このコードを実行したところ、今度は Couldn't execute query と表示され、Queryエラーとなってしまいました。
u-sukesan

2017/05/26 01:42

なぜでしょう こちらでは確認できたのですが ちなみにINSERTは正常にされているのでしょうか?
u-sukesan

2017/05/26 01:45

ちなみにこちらでテストした内容です $cxn = mysqli_connect($host, $dns_id, $dns_pw, $dbname); $sql = "INSERT INTO login (username,phone,email,password,gen,date) VALUES ('".$clean_data['username']."', '".$clean_data['phone']."', '".$clean_data['email']."', '".$clean_data['password']."', '".$clean_data['gen']."', '$date')"; $result = mysqli_query($cxn,$sql); $sql= "SELECT LAST_INSERT_ID() AS id"; $res = mysqli_query($cxn, $sql); $newid= mysqli_fetch_assoc($res); print_r($newid);
YukaSaku

2017/05/26 02:30

私のコードはこちらになります。教えていただいたコードを入れる前は動いていたので、INSERTは問題ないと思うのですが。。。 何か変えないといけない箇所はありますか? <?php /* Program name: register.php * Description: Program displays the blank form and checks * all the form fields for blank fields. */ ini_set("display_errors","on"); error_reporting(E_ALL | E_STRICT); ini_set("include_path","./includes"); include("dbinfo.inc"); $gen="Gender"; $rows = 0; if(isset($_POST['submitted']) and $_POST['submitted'] == "yes") { if(!isset($_POST['gen'])) { $blank_data[] = $gen; } foreach($_POST as $field => $value) { if(empty($value)) { $blank_data[] = $field; } else { $good_data[$field] = strip_tags(trim($value)); } } if(@sizeof($blank_data) > 0) { $message = "<p style='color: red; margin-bottom: 0; font-weight: bold'> You didn't fill in one or more required fields. You must enter: <ul style='color: red; margin-top: 0; list-style: none' >"; /* display list of missing information */ foreach($blank_data as $value) { $message .= "<li>$value</li>"; } $message .= "</ul>"; //extract($good_data); echo $message; include("form.inc"); exit(); } foreach($_POST as $field => $value) { if(!empty($value)) { //validations $name_patt = "/^[A-Za-z0-9' -]{1,15}$/"; $email_patt = "/^.+@.+\\..+$/"; $phone_patt = "/^[0-9)(xX -]{7,20}$/"; $passwd_patt = "/^[A-Za-z0-9' -]{1,60}$/"; $field = htmlspecialchars($field, ENT_QUOTES); $value = htmlspecialchars($value, ENT_QUOTES); if(preg_match("/username/i",$field)) { if(!preg_match($name_patt,$value)) { $error_array[] = "$value is not a valid Username"; } } if(preg_match("/phone/i",$field)) { if(!preg_match($phone_patt,$value)) { $error_array[] = "$value is not a valid Phone"; } } if(preg_match("/email/i",$field)) { if(!preg_match($email_patt,$value)) { $error_array[] = "$value is not a valid Email"; } } if(preg_match("/password/i",$field)) { if(!preg_match($passwd_patt,$value)) { $error_array[] = "$value is not a valid password"; } } echo "<div class='field'>"; } } if(@sizeof($error_array) > 0) { $message = "<ul style='color: red; list-style: none' >"; foreach($error_array as $value) { $message .= "<li>$value</li>"; } $message .= "</ul>"; echo $message; @extract($clean_data); include("form.inc"); exit(); } else { $cxn = mysqli_connect($host,$user,$passwd,$dbname) or die("Couldn't connect to server"); $clean_data = array(); foreach($_POST as $field => $value) { $clean_data[$field] = mysqli_real_escape_string($cxn,$value); } $date = date("Y-m-d H:i:s"); ?> <form method="post"> <input type="hidden" name='$field' value="<?php echo htmlspecialchars($good_data['value']); ?>"> <input type="hidden" name="gen" value="<?php echo $gen; ?>"> <input type="hidden" name="date" value="<?php echo $date; ?>"> </form> <?php if (!empty($good_data['username']) ) { // Confirm the username on the DB that user input //$sql = "SELECT username FROM login"; $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 { /* loop that displays the form */ $sql = "INSERT INTO login (username,phone,email,password,gen,date) VALUES ('".$clean_data['username']."', '".$clean_data['phone']."', '".$clean_data['email']."', '".$clean_data['password']."', '".$clean_data['gen']."', '$date')"; } $result = mysqli_query($cxn,$sql) or die("Couldn't execute query dayo!"); $sql = "SELECT LAST_INSERT_ID() AS id;"; $res = mysqli_query($cxn,$sql) or die("Couldn't execute query"); $newID = mysqli_fetch_assoc($res); print_r($newID); $signUpMessage = 'Your Username is '.$clean_data['username'].' <br>'. ' Phone is '.$clean_data['phone'].' <br>'. ' Email is '.$clean_data['email'].' <br>'. ' Gender is '.$clean_data['gen'].' <br>'. ' The registration date is '.$date.' <br>'. ' Keep your password for your security.'; echo $signUpMessage; include("stored.inc"); } } } else { include("form.inc"); } ?>
YukaSaku

2017/05/26 03:22

なぜかわからないですが、色々プログラムをいじって、やっぱりできないので、最初の段階に戻って、教えていただいたコードを入れたら、すんなりと表示されました。 手取り足取り、本当にありがとうございました。
u-sukesan

2017/05/26 05:20

それはよかったです^^
guest

0

cust_IDをどうやって発行しているかもわからないので回答しようがないかと
すくなくともINSERT構文にはないので

ちなみに

$sql = "SELECT username FROM login WHERE username = '" . $good_data['username'];

はusernameへの値の渡し方がおかしいのでSQL文として文法エラーですよね?
クォーテーションを閉じるところまで書いて下さい

それとおそらく$good_dataにサニタイズしたデータを格納しているのだと
思いますが、インジェクション対策としては不十分です
きちんとやるならプレースホルダーを利用して下さい

投稿2017/05/25 05:04

yambejp

総合スコア114757

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

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

YukaSaku

2017/05/25 05:37

一応、このコードでcust_ID以外のことは特に文法エラーもなく情報が渡せています。 プレースホルダー、必要でした。ありがとうございます。 情報足らずですみません。テーブル情報を追加しました。 よろしくお願いします。
yambejp

2017/05/25 05:42

> このコードでcust_ID以外のことは特に文法エラーもなく情報が渡せています。 そうですか・・・ かりに$good_data['username']が「123」だったとしてprint sqlすると SELECT username FROM login WHERE username = '123 となりますよね? むしろなぜ問題にならないかを詰めていったほうがよさそうですね
YukaSaku

2017/05/25 17:18

コーテーションを消しました。同じように、ID以外は機能しています。 ダブルコーテーションの中のコーテーションは、このようによくスルーなことがあります。なぜでしょうかね。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問