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

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

ただいまの
回答率

87.49%

LAST_INSERT_IDの使い方?

解決済

回答 2

投稿

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

前提・実現したいこと

買い物かごの処理を作っており、登録内容をmysqlに登録し、メールで投げるスクリプトです。
どうしてこのエラーが表示されるのかご存じであればご教示いただきたく存じます。
該当の行はコメントで「ココ」と書いてあります。ちなみに真ん中からやや上の89行目くらいです。

発生している問題・エラーメッセージ

Notice: Undefined index: LAST_INSERT_ID() in C:\xampp\htdocs\shop\shop_form_done.php on line 89

該当のソースコード

php7.4
<?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'];

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

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

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

$dsn = 'mysql:host=localhost;dbname=shop;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=?';
$stmh=$dbh->prepare($sql);
$data[0]=$cart[$i];
$stmh->execute($data);

$rec = $stmh->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_member,name,email,postal1,postal2,address,tel) VALUES(?,?,?,?,?,?,?)';
$stmh=$dbh->prepare($sql);
$data=array();
$data[]=0;
$data[]=$onamae;
$data[]=$email;
$data[]=$postal1;
$data[]=$postal2;
$data[]=$address;
$data[]=$tel;
$stmh->execute($data);

$sql='select last_insert_id()';
$stmh=$dbh->prepare($sql);
$stmh->execute();
$rec = $stmh->fetch(PDO::FETCH_ASSOC);
$lastcode=$rec['LAST_INSERT_ID()'];       //<=ココ
echo $lastcode;
var_dump($rec);

$dbh = null;

for($i=0;$i<$max;$i++)
{
$sql='INSERT INTO dat_sales_product (code_sales,code_product,price,quantity) VALUES (?,?,?,?)';
$stmh=$dbh->prepare($sql);
$data=array();
$data[]=$lastcode;
$data[]=$cart['$i'];
$data[]=$kakaku['$i'];
$data[]=$kazu['$i'];
$stmh->execute($data);
}

$dbh = null;

$honbun.="送料は無料です。\n";
$honbun.="--------------------\n";
$honbun.="\n";
$honbun.="代金は以下の口座にお振込みください。\n";
$honbun.="ろくまる銀行 やさい支店 普通口座1234567\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>
```

試したこと

var_dumpにて確認したら直近のINSERT結果であるLAST_INSERT_IDを添字とする値が得られているようです。
var_dump();の結果➡array(1) { ["last_insert_id()"]=> string(2) "14" }

補足情報(FW/ツールのバージョンなど)

xampp3.2.4を使用しています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2020/11/20 19:56 編集

    >ろくまる農園
    可能なら、書籍かえてください。
    悪い評判しか聞きません。(teratail内でも本当によく出る書籍)

    キャンセル

  • m.ts10806

    2020/11/20 19:58

    コードやエラーはマークダウンのcode機能を利用してご提示ください。
    https://teratail.com/questions/238564

    キャンセル

  • lnavi.bex810vh

    2020/11/20 20:00

    わかりました。今後気を付けます。ありがとうございます。

    キャンセル

  • m.ts10806

    2020/11/20 20:00

    質問は編集できます。

    キャンセル

回答 2

checkベストアンサー

+2

LAST_INSERT_IDを添字とする値が得られているようです。

大文字小文字が違います。PHPの連想配列としては、大文字小文字は区別されます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/11/20 19:21

    仰る通り小文字に変えたら動作しました!
    入門書には大文字でかかれてあるのですが・・・
    お手数をお掛けし申し訳ございませんでした。

    キャンセル

+1

大文字とか小文字とか、カッコとかつくと間違いやすいのでエイリアスしたほうが良いかと思います。

$sql='select last_insert_id() as last_id';

//中略


$lastcode=$rec['last_id']; 

自分がつけた名前なら間違うことはほぼないでしょう(というより、普通はコピペします)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/11/20 20:12

    エイリアス?まだ初心者でどうすればよいのかわかりませんが、そういう方法もあるということを覚えておきます。ありがとうございます。

    キャンセル

  • 2020/11/20 20:15

    書籍から離れドキュメントをメインにしてください。
    コードは書いたとおりに動くだけ。仕様を理解、確認しないことには動くコードは書けません。

    キャンセル

  • 2020/11/20 20:17

    承知しました。アドバイスありがとうございます。経験者のご意見は大変参考になります。

    キャンセル

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

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

関連した質問

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