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

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

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

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

Q&A

解決済

1回答

592閲覧

phpでデータベースに会員データを登録しようとするとエラーがでる。

kazukin_a

総合スコア10

PHP

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

0グッド

0クリップ

投稿2022/01/18 14:16

環境Mac Monterey12.1
MAMAP
PHP Version 7.3.21
Server version: 5.7.30 - MySQL

会員データをデータベースに登録するところを作っているのですが、
うまくいきません。
var_dump($data);でデバッグし載せているコードのところまでは正常に動くことはわかりましたが、
$stmt->execute($data);107行目(shop_form_done.php)を超えるとエラーがでるので、そこが悪いとは思うのですが的確にどこを治すべきなのかわかりません。

よろしくおねがいします。

php(shop_form_done.php)

1<?php 2 session_start(); 3 session_regenerate_id(true); 4?> 5<!DOCTYPE html> 6<html> 7<head> 8<meta charset="UTF-8"> 9<title>ろくまる農園</title> 10</head> 11<body> 12 13<?php 14 15try 16{ 17 require_once('../common/common.php'); 18 19 $post=sanitize($_POST); 20 21 $onamae=$post['onamae']; 22 $email=$post['email']; 23 $postal1=$post['postal1']; 24 $postal2=$post['postal2']; 25 $address=$post['address']; 26 $tel=$post['tel']; 27 $chumon=$post['chumon']; 28 $pass=$post['pass']; 29 $danjo=$post['danjo']; 30 $birth=$post['birth']; 31 32 33 print $onamae.'様 <br/>'; 34 print 'ご注文ありがとうございます。<br />'; 35 print $email.'にメールをお送りしましたのでご確認ください。<br />'; 36 print '商品は以下にお送りさせていただきます。'; 37 print $postal1. '-' .$postal2. '<br />'; 38 print $address. '<br />'; 39 print $tel. '<br />'; 40 41 $honbun =''; 42 $honbun.="\n"; 43 $honbun.=$onamae." 様\n\nこの度はご注文ありがとうございました。\n"; 44 $honbun.="\n"; 45 $honbun.="ご注文商品\n"; 46 $honbun.="----------------\n"; 47 48 $cart = $_SESSION['cart']; 49 $kazu = $_SESSION['kazu']; 50 $max = count($cart); 51 52 $dsn = 'mysql:dbname=shop;host=localhost:8889;charset=utf8'; 53 $user = 'root'; 54 $password = 'root'; 55 $dbh = new PDO($dsn, $user, $password); 56 $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 57 58 for($i=0;$i<$max;$i++) 59 { 60 $sql = 'SELECT name,price FROM mst_product WHERE code=?'; 61 $stmt = $dbh->prepare($sql); 62 $data[0] = $cart[$i]; 63 $stmt -> execute($data); 64 65 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 66 67 $name = $rec['name']; 68 $price = $rec['price']; 69 $kakaku[] = $price; 70 $suryou = $kazu[$i]; 71 $shokei = $price * $suryou; 72 73 $honbun .= $name.' '; 74 $honbun .= $price.'円 x '; 75 $honbun .= $suryou.'個 ='; 76 $honbun .= $shokei. "円 \n"; 77 } 78 79 $sql = 'LOCK TABLES dat_sales WRITE, dat_sales_product WRITE, dat_member WRITE'; 80 $stmt = $dbh->prepare($sql); 81 $stmt -> execute(); 82 83 $lastmembercode=0; 84 if($chumon=='chumontouroku') 85 { 86 $sql ='INSERT INTO dat_member(password,name,email,postal1,postal2,address,tel,danjo,born) VALUES(?,?,?,?,?,?,?,?,?)'; 87 $stmt = $dbh->prepare($sql); 88 $data = array(); 89 $data[]=md5($pass); 90 $data[]=$onamae; 91 $data[]=$email; 92 $data[]=$postal1; 93 $data[]=$postal2; 94 $data[]=$address; 95 $data[]=$tel; 96 if($danjo=='dan') 97 { 98 $data[]=1; 99 } 100 else 101 { 102 $data[]=2; 103 } 104 $data[]=$birth; 105 var_dump($data); 106 exit(); 107 $stmt->execute($data); 108 109 $sql= 'SELECT LAST_INSERT_ID()'; 110 $stmt = $dbh->prepare($sql); 111 $stmt->execute(); 112 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 113 $lastmembercode=$rec['LAST_INSERT_ID()']; 114 115 } 116 117 $sql = 'INSERT INTO dat_sales(code_member,name,email,postal1,postal2,address,tel) VALUES(?,?,?,?,?,?,?)'; 118 $stmt = $dbh->prepare($sql); 119 $data = array(); 120 $data[] = $lastmembercode; 121 $data[] = $onamae; 122 $data[] = $email; 123 $data[] = $postal1; 124 $data[] = $postal2; 125 $data[] = $address; 126 $data[] = $tel; 127 $stmt -> execute($data); 128 129 130 $sql = 'SELECT LAST_INSERT_ID()'; 131 $stmt = $dbh->prepare($sql); 132 $stmt -> execute(); 133 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 134 $lastmembercode = $rec['LAST_INSERT_ID()']; 135 136 // var_dump($kakaku); 137 // exit; 138 for($i=0;$i<$max;$i++) 139 { 140 $sql = 'INSERT INTO dat_sales_product (code_sales,code_product,price,quantity) VALUES(?,?,?,?)'; 141 $stmt = $dbh->prepare($sql); 142 $data = array(); 143 $data[] = $lastmembercode; 144 $data[] = $cart[$i]; 145 $data[] = $kakaku[$i]; 146 $data[] = $kazu[$i]; 147 $stmt -> execute($data); 148 } 149 150 $sql = 'UNLOCK TABLES'; 151 $stmt = $dbh->prepare($sql); 152 $stmt -> execute(); 153 154 $dbh = null; 155 156 $honbun .="送料は無料です。\n"; 157 $honbun .="--------------\n"; 158 $honbun .="\n"; 159 $honbun .="代金は以下の口座に振り込みください.\n"; 160 $honbun .="ろくまる銀行 やさい支店 普通口座 1234567\n"; 161 $honbun .="入金確認が取れ次第、梱包、発送させていただいきます。 \n"; 162 $honbun .="\n"; 163 $honbun .="□□□□□□□□□□□□□□□□□□□□□□□□□□\n"; 164 $honbun .="~安心野菜のろくまる農園~\n"; 165 $honbun .="\n"; 166 $honbun .="○○県六丸郡六丸村123-4\n"; 167 $honbun .="電話 090-6060-xxxx\n"; 168 $honbun .="メール info@rokumarunouen.co.jp\n"; 169 $honbun .="□□□□□□□□□□□□□□□□□□□□□□□□□□\n"; 170 // print "\n"; 171 // print nl2br($honbun); 172 173 $title = 'ご注文ありがとうございます。'; 174 $header = 'From: info@rokumaurnouen.co.jp'; 175 $honbun = html_entity_decode($honbun,ENT_QUOTES,'UTF-8'); 176 mb_language('Japanese'); 177 mb_internal_encoding('UTF-8'); 178 // mb_send_mail($email,$title,$honbun,$header); 179 180 $title = 'お客様からご注文がありました。'; 181 $header = 'From: ' .$email; 182 $honbun = html_entity_decode($honbun,ENT_QUOTES,'UTF-8'); 183 mb_language('Japanese'); 184 mb_internal_encoding('UTF-8'); 185 // mb_send_mail('info@rokumarunouen.co.jp',$title,$honbun,$header); 186 187 $_SESSION=array(); 188 if(isset($_COOKIE[session_name()])==true) 189 { 190 setcookie(session_name(),'',time()-42000,'/'); 191 } 192 session_destroy(); 193} 194 195 196 197catch (Exception $e) 198{ 199 print 'ただいま障害により大変ご迷惑をおかけしております。'; 200 exit(); 201 202} 203 204?> 205 206<br /> 207<a href="shop_list.php">商品画面へ</a> 208 209</body> 210</html> 211

php(shop_form.html)

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>ろくまる農園</title> 6</head> 7<body> 8 9お客様情報を入力してください。<br /> 10<form method="post" action="shop_form_check.php"> 11お名前<br/> 12<input type="text" name="onamae" style="width:200px"><br/> 13メールアドレス<br /> 14<input type="text" name="email" style="width:200px"><br/> 15郵便番号<br /> 16<input type="text" name="postal1" style="width:50px"> - 17<input type="text" name="postal2" style="width:80px"><br /> 18住所<br /> 19<input type="text" name="address" style="width:500px"><br /> 20電話番号<br /> 21<input type="text" name="tel" style="width:500px"><br /> 22<br /> 23<input type="radio" name="chumon" value="chumonkonkai" checked> 今回だけの注文 <br /> 24<input type="radio" name="chumon" value="chumontouroku">会員登録して注文<br/> 25<br /> 26※会員登録する方以下の項目も入力してください。<br /> 27パスワードを入力してください。<br /> 28<input type="password" name="pass" style="width:100px"><br/> 29パスワードをもう1度入力してください。<br /> 30<input type="password" name="pass2" style="width:100px"><br/> 31性別<br /> 32<input type="radio" name="danjo" value="dan" checked>男性<br /> 33<input type="radio" name="danjo" value="jo">女性<br /> 34生まれ年<br /> 35<select name="birth"> 36<option value="1910">1910年代</option> 37<option value="1920">1920年代</option> 38<option value="1930">1930年代</option> 39<option value="1940">1940年代</option> 40<option value="1950">1950年代</option> 41<option value="1960">1960年代</option> 42<option value="1970">1970年代</option> 43<option value="1980">1980年代</option> 44<option value="1990" selected>1990年代</option> 45<option value="2000">2000年代</option> 46<option value="2010">2010年代</option> 47<option value="2020">2020年代</option> 48</select> 49<br/> 50<br/> 51 52<input type="button" onclick="history.back()" value="戻る" > 53<input type="submit" value="OK"><br /> 54 55</form> 56 57</body> 58</html> 59

php(shop_form_check.php)

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>ろくまる農園</title> 6</head> 7<body> 8 9<?php 10 11require_once('../common/common.php'); 12 13$post=sanitize($_POST); 14 15$onamae=$post['onamae']; 16$email=$post['email']; 17$postal1=$post['postal1']; 18$postal2=$post['postal2']; 19$address=$post['address']; 20$tel=$post['tel']; 21$chumon=$post['chumon']; 22$pass=$post['pass']; 23$pass2=$post['pass2']; 24$danjo=$post['danjo']; 25$birth=$post['birth']; 26 27$okflg=true; 28 29if($onamae=='') 30{ 31 print 'お名前が入力されていません。<br /><br />'; 32 $okflg=false; 33} 34else 35{ 36 print 'お名前<br/>'; 37 print $onamae; 38 print '<br /><br />'; 39 40} 41 42if(preg_match('/\A[\w\-\.]+\@[\w\-\.]+\.([a-z]+)\z/',$email)==0) 43{ 44 print 'メールアドレスを正確に入力してください。<br /><br />'; 45 $okflg=false; 46} 47else 48{ 49print 'メールアドレス<br/>'; 50print $email; 51print '<br /><br />'; 52 53} 54 55if(preg_match('/\A[0-9]+\z/',$postal1)==0) 56{ 57 print '郵便番号は半角数字で入力してください。<br /><br />'; 58 $okflg=false; 59} 60else 61{ 62 print '郵便番号<br />'; 63 print $postal1; 64 print '-'; 65 print $postal2; 66 print '<br /><br />'; 67} 68 69if(preg_match('/\A[0-9]+\z/',$postal2)==0) 70{ 71 print '郵便番号は半角数字で入力してください。<br /><br />'; 72 $okflg=false; 73} 74 75if($address=='') 76{ 77 print '住所が入力されていません.<br /><br />'; 78 $okflg=false; 79} 80else 81{ 82 print '住所<br/>'; 83 print $address; 84 print '<br /><br />'; 85} 86 87if(preg_match('/\A\d{2,5}-?\d{2,5}-?\d{4,5}\z/',$tel)==0) 88{ 89 print '電話番号を正確に入力してください。<br /><br />'; 90 $okflg=false; 91} 92else 93{ 94 print '電話番号<br/>'; 95 print $tel; 96 print '<br /><br />'; 97} 98 99if($chumon=="chumontouroku") 100{ 101 if($pass=='') 102 { 103 print 'パスワードが入力されていません。<br /><br />'; 104 $okflg=false; 105 } 106 107 if($pass!=$pass2) 108 { 109 print 'パスワードが一致しません。<br /><br />'; 110 $okflg=false; 111 } 112 113 print '性別<br />'; 114 if($danjo=='dan') 115 { 116 print '男性'; 117 } 118 else 119 { 120 print'女性'; 121 } 122 print'<br /><br />'; 123 124 print '生まれ年<br />'; 125 print $birth; 126 print '年代'; 127 print '<br /><br />'; 128 129} 130 131 132if($okflg==true){ 133 print'<form method="post" action="shop_form_done.php">'; 134 print'<input type="hidden" name="onamae" value="'.$onamae.'">'; 135 print'<input type="hidden" name="email" value="'.$email.'">'; 136 print'<input type="hidden" name="postal1" value="'.$postal1.'">'; 137 print'<input type="hidden" name="postal2" value="'.$postal2.'">'; 138 print'<input type="hidden" name="address" value="'.$address.'">'; 139 print'<input type="hidden" name="tel" value="'.$tel.'">'; 140 print'<input type="hidden" name="chumon" value="'.$chumon.'">'; 141 print'<input type="hidden" name="pass" value="'.$pass.'">'; 142 print'<input type="hidden" name="danjo" value="'.$danjo.'">'; 143 print'<input type="hidden" name="birth" value="'.$birth.'">'; 144 print'<input type="button" onclick="history.back()" value="戻る">'; 145 print'<input type="submit" value="OK">'; 146 print'</form>'; 147} 148else 149{ 150 print '<form>'; 151 print '<input type="button" onclick="history.back()"value="戻る">'; 152 print '</form>'; 153} 154 155 156?> 157 158</body> 159</html> 160

イメージ説明

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

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

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

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

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

AbeTakashi

2022/01/18 14:54

この手の不具合に遭遇した場合は、まずはエラーメッセージもしくはエラーログを見るようにしてください。本当にエラーが出てるのなら、そこに原因が書かれている場合がほとんどです。ブラウザ上にエラーメッセージが表示される設定になっていますか? 表示されないなら表示されるように設定を変更してください。もしくはエラーログがどこかに出力されていると思いますので、そちらを確認してください。エラーメッセージの表示の設定の方法やログの場所が分からない場合は、お使いの環境(MAMP)に近い参考サイトなどを検索して探してみてください。 それらを見てもエラーの原因が分からないようであれば、そのエラーメッセージやエラーログの内容を質問文内に追記するようにしてください。エラー情報が一切書かれてないと、さすがに回答者も答えにくいです(これだけのソースコードを1行ずつチェックしてくれる人や、ソースコードを全部自前の環境でコピーして試してくれるような親切な人はあまりいないです)。 参考) https://teratail.com/help/question-tips 上から下まで全部読んでほしいですが、特に「3-4. 発生している問題・エラーメッセージを書きましょう」はしっかり読まれることをオススメします。
kazukin_a

2022/01/18 15:33

すみませんでした。 ご指摘ありがとうございます。 データベースのテーブルをつくりなおしたら解決しました。 エラーメッセージについて今後はきをつけます。 ありがとうございます。
m.ts10806

2022/01/18 22:33

>ろくまる 「気づけばプロ並み」でしょうか。 teratailに投稿された当該書籍を利用されたと思わしき質問やその内容から お世辞にも良いとは言えないので、可能なら書籍を変更し、 PHPマニュアルを活用できるようになることを優先されたほうが良いと思います。 (デバッグやエラーメッセージの読み方など初心者が最初に覚えるべきことにもあまり言及してなく、実装もかなりマズいものとして有名です)
kazukin_a

2022/01/18 23:55

そうなのですね。 PHPマニュアルを活用できるようにした方が良いことはわかりました。 もし、おすすめ本やサイトなどあればご教授いただけないでしょうか?
m.ts10806

2022/01/19 01:53

>おすすめ本やサイト あまり本でやってないのですし、すぐ古くなるので書籍での勉強はちょっと微妙なのですけど、 サイトならPHPマニュアル(Webサイトです)
kazukin_a

2022/01/19 04:29

ありがとうございます。 PHPマニュアルを読む練習もしたいと思います。
guest

回答1

0

自己解決

テーブルをつくりなおしたら解決しました。
サイトのキャッシュもクリアしました。

投稿2022/01/18 15:33

kazukin_a

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問