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

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

ただいまの
回答率

87.36%

SQLへとデータが送れない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 958

score 14

phpの参考書を学習しているのですが、どうしてもsqlへとphpで打ち込んだデータを送ることができません。仕方がないのでサンプルコードからコピーしたのですが、catchの部分がどうしても出てしまいます。新たに入力した画面は$sql='INSERT INTO dat~から$dbh=nullまでになります。
それまでのコードは問題なく動いております。
見にくいですが、どうかご教授お願い致します。
下記にコードとsql画面、現在の画面がどうなっているかを掲載しました。

<?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);

$oname=$post['oname'];
$email=$post['email'];
$postal1=$post['postal1'];
$postal2=$post['postal2'];
$address=$post['address'];
$tel=$post['tel'];

print $oname.'様<br />';
print 'ご注文ありがとうござました。<br />';
print $email.'にメールを送りましたのでご確認ください。<br />';
print '商品は以下の住所に発送させていただきます。<br />';
print $postal1.'-'.$postal2.'<br />';
print $address.'<br />';
print $tel.'<br />';

$honbun='';
$honbun.=$oname."様\n\nこのたびはご注文ありがとうございました。\n";
$honbun.="\n";
$honbun.="ご注文商品\n";
$honbun.="--------------------\n";

$cart=$_SESSION['cart'];
$kazu=$_SESSION['kazu'];
$max=count($cart);

$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$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;
    $suryo=$kazu[$i];
    $shokei=$price*$suryo;

    $honbun.=$name.' ';
    $honbun.=$price.'円 x ';
    $honbun.=$suryo.'個 = ';
    $honbun.=$shokei."円\n";
}

$sql='INSERT INTO dat_sales (code_number,name,email,postal1,postal2,address,tel) VALUES (?,?,?,?,?,?,?)';
$stmt=$dbh->prepare($sql);
$data=array();
$data[]=0;
$data[]=$oname;
$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);
$lastcode=$rec['LAST_INSERT_ID()'];

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[]=$lastcode;
    $data[]=$cart[$i];
    $data[]=$kakaku[$i];
    $data[]=$kazu[$i];
    $stmt->execute($data);
}

$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 '<br />';
//print nl2br($honbun);

$title='ご注文ありがとうございます。';
$header='From:info@rokumarunouen.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);

}
catch (Exception $e)
{
    print 'ただいま障害により大変ご迷惑をお掛けしております。';
    exit();
}

?>

</body>
</html>


![イメージ説明]

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Yasumichi

    2020/05/03 23:53 編集

    本番環境でないのなら、catch の中で

    echo $e->getMessage();

    とかするとエラーメッセージが表示できるのですが。

    あと、dat_sales の code_number って、主キーではないのですか?関係するテーブルの列の形式とか分かるともう少し考えられるかなと。

    あと、

    キャンセル

  • gentaro

    2020/05/04 00:23

    どうでもいいですけど
    ×SQLへ
    ○データベースへ
    だと思います。
    SQLはStructured Query Languageの略で、言語そのものを指します。

    キャンセル

回答 1

checkベストアンサー

+5

catch (Exception $e)
{
    print 'ただいま障害により大変ご迷惑をお掛けしております。';
    exit();
}

などというコード(例外を握りつぶしてデバッグが不可能にするコード)を書いている書籍は控えめに言って残念過ぎて参考にしてはいけないレベル。プロなら即見限られてもおかしく無いレベルなので、別の書籍に乗り換えることを強くお勧めします。

例えば

catch (Exception $e)
{
    echo $e->getMessage();
    echo $e->getTraceAsString();

 //   print 'ただいま障害により大変ご迷惑をお掛けしております。';
    exit();
}


とすると(実際はログに吐き出すべきですが)、発生している例外の詳細がわかるので、エラーメッセージに沿ってデバッグが可能です。
(なのに、あえてデバッグが出来無い様なコードになっているのは、仮に他のページで解説があったとしても最低の部類と言わざるを得ない)

どうしてもこの書籍を使わないといけない理由があるのであれば、最初のページから設定/環境/操作も含めて完全に同じ状況を作って使うしかありません。
(この書籍を持っていない他人が回答出来る事は極めて限られます。)
また、DB定義の問題もあるので途中の章だけコードをコピーしてもまともに動かすこともデバッグをすることも無理だと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/04 08:25

    また、気づけばプロ並み、ですね。
    こういう質問者がでることでどんどん書籍の評判は落ちていくんですけど

    キャンセル

  • 2020/05/04 21:35

    おかげ様でエラーコードを表示することが出来て、問題を解決出来ました。
    tanatさん、その他のお方、ありがとうございます。確かにtanatさんのおっしゃる通り分かりにくい所が幾何か存在しますが、もう終盤に差し掛かっておりますので、一旦終わらせて次の書籍は吟味してから購入することにします。本当にありがとうございました。

    キャンセル

  • 2020/05/04 21:43

    > m.ts10806さん

    一から読んでいないので全体の評価は出来ませんが、デバッグ情報を握りつぶしてるケースばかり見かけるので、本気で理解するか一切理解せずに写経で終わるかくらいの使い道しかない様に思います。。。

    キャンセル

  • 2020/05/04 21:47

    > yudouhuさん

    解決したようで何よりです。
    最後まで行けそうであれば、一旦終わらせるまで頑張るのは良いことだと思います。(今回と同様の感じでエラーを拾っていけば何とかなるとは思います。)

    一通り文法等が理解出来たら、既に書籍で作ったものと同じ外部仕様のプログラムを自力で一から作ってみるというのも勉強になるのでお勧めです。

    キャンセル

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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