🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

2回答

715閲覧

php if内でDB接続→SQL実行後に文字列でメッセージを表示させたいがエラーとなる

Ms.yy

総合スコア83

PHP

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

0グッド

0クリップ

投稿2019/10/26 12:27

DB接続後、update SQLで更新した後に「更新に成功しました。」とメッセージを表示させていのですがエラーとなります、

具体的に
if文の中に文字列を入れようと「echo '更新に成功しました。';」と入れるとエラーとなってしまいます。

お助けお願いします。

###問題ファイル

<?php if(!empty($_REQUEST["post"])){ $pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password'); $sql=$pdo->prepare('update product set name=?, price=? where id=?'); $sql->execute( [htmlspecialchars($_REQUEST['name']), $_REQUEST['price'], $_REQUEST['id']] ) echo '更新に成功しました。'; //ここでエラー(syntax error, unexpected 'echo' (T_ECHO)) } else { echo '更新に失敗しました。'; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

php

1 2 $sql->execute( 3 [htmlspecialchars($_REQUEST['name']), 4 $_REQUEST['price'], $_REQUEST['id']] 5)

php

1 2 $sql->execute( 3 [htmlspecialchars($_REQUEST['name']), 4 $_REQUEST['price'], $_REQUEST['id']] 5 );

投稿2019/10/26 12:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Ms.yy

2019/10/26 13:49

ありがとうございます。 エラーは解消されました。 文法ミスとは失態です。汗
guest

0

if(!empty($_REQUEST["post"])) の else は、POSTデータが空なのであって、更新に失敗したわけではないですよね?
更新の失敗は失敗で、try catchで失敗原因のエラーを吐き出させるべきです。

あと個人的に(これは趣味嗜好の範囲ですが)if文やforeach文は{}ではなく以下のほうが読みやすいと思います。
(try catchと併用すると特に)

PHP

1if(!empty($_REQUEST["post"])): //{と同義 2 try{ 3 $pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8','staff','password'); 4 $sql=$pdo->prepare('update product set name=?, price=? where id=?'); 5 $sql->execute( 6 [htmlspecialchars($_REQUEST['name']), 7 $_REQUEST['price'], $_REQUEST['id']] 8 ); 9 echo '更新に成功しました。';//ここまでたどり着けば更新に成功している 10 }catch (PDOException $e){//更新データを受けているにもかかわらず何らかのエラーにより失敗した 11 header('Content-Type: text/plain; charset=UTF-8', true, 500); 12 echo '更新に失敗しました。'; 13 echo($e->getMessage());//エラーを出力 14 exit;//以後の処理を停止 15 } 16else: //{と同義 17 echo 'POSTデータが空です。'; 18endif; //}と同義

投稿2019/10/26 13:00

編集2019/10/26 13:03
Take_it

総合スコア357

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

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

Ms.yy

2019/10/26 13:49

すみません「if(!empty($_REQUEST["post"]))」この辺こんがらがってきたのでここの部分勉強し直します汗 こちらの方がわかりやすいですね! そんな書き方知りませんでしたよ^^
Take_it

2019/10/26 14:27

いやまぁ、if文の書き方は蛇足(あくまでも見やすさと好みの問題なので)であって、そもそもPOSTデータが空の場合と更新失敗の区別のほうは大丈夫ですか? 質問中のコードだとエラーもcatchできていませんし、そっちのほうがif文の書き方よりよほど重要です。
Ms.yy

2019/10/26 22:35

空の場合と更新の区別は分からずです汗 上記のコード文ですと、フォームの送信後そのpostが空でない場合if(!empty($_REQUEST["post"]))〜の中身が実行されて 空だった場合(URLにダイレクトにアクセス)はelse文を想定してます。
Take_it

2019/10/27 01:26

>上記のコード文ですと、フォームの送信後そのpostが空でない場合if(!empty($_REQUEST["post"]))〜の中身が実行されて >空だった場合(URLにダイレクトにアクセス)はelse文を想定してます。 そこはそれでまぁOKとして、if(!empty($_REQUEST["post"]))〜の中身で何らかのエラーが起きて正常に更新できないのと、空だった場合(else)とを区別しておく必要があります。 そのため、SQLの実行を用いて、エラーの排出と処理の中断をする必要があるのです。 質問者さんの最初のコードをただ構文エラー訂正しただけ(セミコロン追記のベストアンサー例)だと、 $_REQUEST["post"]が空でなかった場合  更新に成功しようが失敗しようが、「更新に成功しました」と表示され $_REQUEST["post"]が空だった場合のみ  「更新できませんでした」 となります。 $_REQUEST["post"]がたとえ空ではなくても例えばデータ型が不一致だったり、キーの重複(duplicate)だったり、データベース側の不具合等で例外処理(正常に更新できずエラーになる)場合でも、「更新に成功しました」と表示されてしまいます(本当は成功していなくても) 成功しなかった場合に成功しなかった事実とその原因(エラーメッセージ)を出力しないと、後々困ると思いますよ。そのためのtry-catchです。
Ms.yy

2019/10/27 05:29

なるほどです、 区別するためにtry catchを入れた方がいいのですね。 このtry catchいらないでしょって思ってたので汗 勉強しなきゃです。 if文の時に設定しておくものなんですね。
Take_it

2019/10/27 06:28

>if文の時に設定しておくものなんですね。 上記の私の説明がわかりにくかったようですが、違います。 データベース使って何かするときは必ずtry catchでPDOExceptionを拾って、エラー出力をすべきです。 そうしないと、今回の質問を例に取れば、SQL側で何らかのエラーが生じても、エラーが生じたことすらわからず次の処理が続行してしまいます。 「成功しました」と画面に出ているのに実は成功していない。登録に成功したはずのデータが存在しない(成功メッセージは出たのに)、更新に成功したはずのデータが古いまま(成功メッセージは出たのに)、削除に成功したはずのデータが存在する(成功メッセージは出たのに)・・・という、わけのわからん状態になるわけです。 きちんとtry catchでPDOExceptionを拾ってエラーを表示することによってはじめて、「成功」「不成功」を識別し、不成功の場合のエラーメッセージを表示することで原因の特定・改修が可能になるのです。   if文を使うかどうかは 関 係 が あ り ま せ ん !
Take_it

2019/10/27 06:41

Kosuke_Shibuya さん あー。ご指摘の通りです。抜けてました。 >$pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8','staff','password'); の部分で、 $pdo=new PDO( 'mysql:host=localhost;dbname=shop;charset=utf8','staff','password', array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ) ); とでもしておくべきですね。
Ms.yy

2019/10/27 11:25

失礼しました、DBの時にtry catch文なんですね。^^ そして、DB接続時に「array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, )」これも必要と・・・ ここら辺調べ直します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問