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

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

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

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

解決済

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

kazukin_a
kazukin_a

総合スコア10

PHP

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

1回答

0評価

0クリップ

268閲覧

投稿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)

<?php session_start(); session_regenerate_id(true); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ろくまる農園</title> </head> <body> <?php try { require_once('../common/common.php'); $post=sanitize($_POST); $onamae=$post['onamae']; $email=$post['email']; $postal1=$post['postal1']; $postal2=$post['postal2']; $address=$post['address']; $tel=$post['tel']; $chumon=$post['chumon']; $pass=$post['pass']; $danjo=$post['danjo']; $birth=$post['birth']; print $onamae.'様 <br/>'; print 'ご注文ありがとうございます。<br />'; print $email.'にメールをお送りしましたのでご確認ください。<br />'; print '商品は以下にお送りさせていただきます。'; print $postal1. '-' .$postal2. '<br />'; print $address. '<br />'; print $tel. '<br />'; $honbun =''; $honbun.="\n"; $honbun.=$onamae." 様\n\nこの度はご注文ありがとうございました。\n"; $honbun.="\n"; $honbun.="ご注文商品\n"; $honbun.="----------------\n"; $cart = $_SESSION['cart']; $kazu = $_SESSION['kazu']; $max = count($cart); $dsn = 'mysql:dbname=shop;host=localhost:8889;charset=utf8'; $user = 'root'; $password = 'root'; $dbh = new PDO($dsn, $user, $password); $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); for($i=0;$i<$max;$i++) { $sql = 'SELECT name,price FROM mst_product WHERE code=?'; $stmt = $dbh->prepare($sql); $data[0] = $cart[$i]; $stmt -> execute($data); $rec = $stmt->fetch(PDO::FETCH_ASSOC); $name = $rec['name']; $price = $rec['price']; $kakaku[] = $price; $suryou = $kazu[$i]; $shokei = $price * $suryou; $honbun .= $name.' '; $honbun .= $price.'円 x '; $honbun .= $suryou.'個 ='; $honbun .= $shokei. "円 \n"; } $sql = 'LOCK TABLES dat_sales WRITE, dat_sales_product WRITE, dat_member WRITE'; $stmt = $dbh->prepare($sql); $stmt -> execute(); $lastmembercode=0; if($chumon=='chumontouroku') { $sql ='INSERT INTO dat_member(password,name,email,postal1,postal2,address,tel,danjo,born) VALUES(?,?,?,?,?,?,?,?,?)'; $stmt = $dbh->prepare($sql); $data = array(); $data[]=md5($pass); $data[]=$onamae; $data[]=$email; $data[]=$postal1; $data[]=$postal2; $data[]=$address; $data[]=$tel; if($danjo=='dan') { $data[]=1; } else { $data[]=2; } $data[]=$birth; var_dump($data); exit(); $stmt->execute($data); $sql= 'SELECT LAST_INSERT_ID()'; $stmt = $dbh->prepare($sql); $stmt->execute(); $rec = $stmt->fetch(PDO::FETCH_ASSOC); $lastmembercode=$rec['LAST_INSERT_ID()']; } $sql = 'INSERT INTO dat_sales(code_member,name,email,postal1,postal2,address,tel) VALUES(?,?,?,?,?,?,?)'; $stmt = $dbh->prepare($sql); $data = array(); $data[] = $lastmembercode; $data[] = $onamae; $data[] = $email; $data[] = $postal1; $data[] = $postal2; $data[] = $address; $data[] = $tel; $stmt -> execute($data); $sql = 'SELECT LAST_INSERT_ID()'; $stmt = $dbh->prepare($sql); $stmt -> execute(); $rec = $stmt->fetch(PDO::FETCH_ASSOC); $lastmembercode = $rec['LAST_INSERT_ID()']; // var_dump($kakaku); // exit; for($i=0;$i<$max;$i++) { $sql = 'INSERT INTO dat_sales_product (code_sales,code_product,price,quantity) VALUES(?,?,?,?)'; $stmt = $dbh->prepare($sql); $data = array(); $data[] = $lastmembercode; $data[] = $cart[$i]; $data[] = $kakaku[$i]; $data[] = $kazu[$i]; $stmt -> execute($data); } $sql = 'UNLOCK TABLES'; $stmt = $dbh->prepare($sql); $stmt -> execute(); $dbh = null; $honbun .="送料は無料です。\n"; $honbun .="--------------\n"; $honbun .="\n"; $honbun .="代金は以下の口座に振り込みください.\n"; $honbun .="ろくまる銀行 やさい支店 普通口座 1234567\n"; $honbun .="入金確認が取れ次第、梱包、発送させていただいきます。 \n"; $honbun .="\n"; $honbun .="□□□□□□□□□□□□□□□□□□□□□□□□□□\n"; $honbun .="~安心野菜のろくまる農園~\n"; $honbun .="\n"; $honbun .="○○県六丸郡六丸村123-4\n"; $honbun .="電話 090-6060-xxxx\n"; $honbun .="メール info@rokumarunouen.co.jp\n"; $honbun .="□□□□□□□□□□□□□□□□□□□□□□□□□□\n"; // print "\n"; // print nl2br($honbun); $title = 'ご注文ありがとうございます。'; $header = 'From: info@rokumaurnouen.co.jp'; $honbun = html_entity_decode($honbun,ENT_QUOTES,'UTF-8'); mb_language('Japanese'); mb_internal_encoding('UTF-8'); // mb_send_mail($email,$title,$honbun,$header); $title = 'お客様からご注文がありました。'; $header = 'From: ' .$email; $honbun = html_entity_decode($honbun,ENT_QUOTES,'UTF-8'); mb_language('Japanese'); mb_internal_encoding('UTF-8'); // mb_send_mail('info@rokumarunouen.co.jp',$title,$honbun,$header); $_SESSION=array(); if(isset($_COOKIE[session_name()])==true) { setcookie(session_name(),'',time()-42000,'/'); } session_destroy(); } catch (Exception $e) { print 'ただいま障害により大変ご迷惑をおかけしております。'; exit(); } ?> <br /> <a href="shop_list.php">商品画面へ</a> </body> </html>

php(shop_form.html)

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ろくまる農園</title> </head> <body> お客様情報を入力してください。<br /> <form method="post" action="shop_form_check.php"> お名前<br/> <input type="text" name="onamae" style="width:200px"><br/> メールアドレス<br /> <input type="text" name="email" style="width:200px"><br/> 郵便番号<br /> <input type="text" name="postal1" style="width:50px"> - <input type="text" name="postal2" style="width:80px"><br /> 住所<br /> <input type="text" name="address" style="width:500px"><br /> 電話番号<br /> <input type="text" name="tel" style="width:500px"><br /> <br /> <input type="radio" name="chumon" value="chumonkonkai" checked> 今回だけの注文 <br /> <input type="radio" name="chumon" value="chumontouroku">会員登録して注文<br/> <br /> ※会員登録する方以下の項目も入力してください。<br /> パスワードを入力してください。<br /> <input type="password" name="pass" style="width:100px"><br/> パスワードをもう1度入力してください。<br /> <input type="password" name="pass2" style="width:100px"><br/> 性別<br /> <input type="radio" name="danjo" value="dan" checked>男性<br /> <input type="radio" name="danjo" value="jo">女性<br /> 生まれ年<br /> <select name="birth"> <option value="1910">1910年代</option> <option value="1920">1920年代</option> <option value="1930">1930年代</option> <option value="1940">1940年代</option> <option value="1950">1950年代</option> <option value="1960">1960年代</option> <option value="1970">1970年代</option> <option value="1980">1980年代</option> <option value="1990" selected>1990年代</option> <option value="2000">2000年代</option> <option value="2010">2010年代</option> <option value="2020">2020年代</option> </select> <br/> <br/> <input type="button" onclick="history.back()" value="戻る" > <input type="submit" value="OK"><br /> </form> </body> </html>

php(shop_form_check.php)

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ろくまる農園</title> </head> <body> <?php require_once('../common/common.php'); $post=sanitize($_POST); $onamae=$post['onamae']; $email=$post['email']; $postal1=$post['postal1']; $postal2=$post['postal2']; $address=$post['address']; $tel=$post['tel']; $chumon=$post['chumon']; $pass=$post['pass']; $pass2=$post['pass2']; $danjo=$post['danjo']; $birth=$post['birth']; $okflg=true; if($onamae=='') { print 'お名前が入力されていません。<br /><br />'; $okflg=false; } else { print 'お名前<br/>'; print $onamae; print '<br /><br />'; } if(preg_match('/\A[\w\-\.]+\@[\w\-\.]+\.([a-z]+)\z/',$email)==0) { print 'メールアドレスを正確に入力してください。<br /><br />'; $okflg=false; } else { print 'メールアドレス<br/>'; print $email; print '<br /><br />'; } if(preg_match('/\A[0-9]+\z/',$postal1)==0) { print '郵便番号は半角数字で入力してください。<br /><br />'; $okflg=false; } else { print '郵便番号<br />'; print $postal1; print '-'; print $postal2; print '<br /><br />'; } if(preg_match('/\A[0-9]+\z/',$postal2)==0) { print '郵便番号は半角数字で入力してください。<br /><br />'; $okflg=false; } if($address=='') { print '住所が入力されていません.<br /><br />'; $okflg=false; } else { print '住所<br/>'; print $address; print '<br /><br />'; } if(preg_match('/\A\d{2,5}-?\d{2,5}-?\d{4,5}\z/',$tel)==0) { print '電話番号を正確に入力してください。<br /><br />'; $okflg=false; } else { print '電話番号<br/>'; print $tel; print '<br /><br />'; } if($chumon=="chumontouroku") { if($pass=='') { print 'パスワードが入力されていません。<br /><br />'; $okflg=false; } if($pass!=$pass2) { print 'パスワードが一致しません。<br /><br />'; $okflg=false; } print '性別<br />'; if($danjo=='dan') { print '男性'; } else { print'女性'; } print'<br /><br />'; print '生まれ年<br />'; print $birth; print '年代'; print '<br /><br />'; } if($okflg==true){ print'<form method="post" action="shop_form_done.php">'; print'<input type="hidden" name="onamae" value="'.$onamae.'">'; print'<input type="hidden" name="email" value="'.$email.'">'; print'<input type="hidden" name="postal1" value="'.$postal1.'">'; print'<input type="hidden" name="postal2" value="'.$postal2.'">'; print'<input type="hidden" name="address" value="'.$address.'">'; print'<input type="hidden" name="tel" value="'.$tel.'">'; print'<input type="hidden" name="chumon" value="'.$chumon.'">'; print'<input type="hidden" name="pass" value="'.$pass.'">'; print'<input type="hidden" name="danjo" value="'.$danjo.'">'; print'<input type="hidden" name="birth" value="'.$birth.'">'; print'<input type="button" onclick="history.back()" value="戻る">'; print'<input type="submit" value="OK">'; print'</form>'; } else { print '<form>'; print '<input type="button" onclick="history.back()"value="戻る">'; print '</form>'; } ?> </body> </html>

イメージ説明

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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マニュアルを読む練習もしたいと思います。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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