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

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

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

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

Q&A

解決済

3回答

567閲覧

アロー演算子を使った際のデバッグの仕方を教えてください。

marquez

総合スコア13

PHP

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

0グッド

1クリップ

投稿2020/05/08 15:24

お世話になります。現在、MYSQLIでプリペアドステートメントを試しているのですが、インサートが上手くいかない状況となっています。

// SQL文の作成 $stmt = $mysqli->prepare("INSERT INTO table ( no, name, mail, exp, date ) VALUES ( ?, ?, ?, ?, ? )"); // パラメータを設定 $stmt->bind_param( 'issss', $no, $name, $mail, $exp, $date); // 実行 $res = $stmt->execute(); $stmt->close();

上記コードを基本として色々試しながら動かしているわけですが、上手く実行されずインサートできなかった場合、どのようなデバッグを行ったらよいのでしょうか?

つい先日までは、

$query = "INSERT INTO table ~";

と書いていたため、単純に変数を出力すれば、おかしなコードになっていること確認出来たのですが、ブラウザ上でエラーが出ないものの、インサートが出来ずに困っています。

お恥ずかしながら、あまりクラスに触れることなく来たため、アロー演算子に弱くて・・
ご指導いただければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2020/05/08 22:55

PHPの「クラスの基礎」 のページを見れば分かることも多いですが、どこまで確認していますか? 「弱くて」と言われても結局は探して出てくるような説明にしかなりません。自身で理解しようとしないといつまでも弱いままです。
guest

回答3

0

デバッグする際は例外を捕捉したいので、例外処理を使用します。

PDOもろもろの設定は当方では分かりかねないので、そこは適時変えてください。

コードを見た感じではbindParamにしている意図がわからず、理解していない様にも感じ取れますが、その意図は何なのでしょうか?

PHP

1try { 2 $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 3 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 4 5 $stmt = $db->prepare("INSERT INTO table ( 6 no, name, mail, exp, date) VALUES (?, ?, ?, ?, ?)"); 7 $stmt->bind_param( 'issss', $no, $name, $mail, $exp, $date); 8 //省略... 9} catch (PDOException $e) { 10 echo $e->getMessage(); 11 exit; 12}

投稿2020/05/08 16:43

編集2020/05/09 05:51
kai0310

総合スコア2076

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

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

m.ts10806

2020/05/08 23:13

PDOでヒントを出すのでしたらPDOで通した方が質問者も理解しやすいのでは・・
marquez

2020/05/09 04:16

k011510さん 夜遅くのアドバイスをありがとうございます。 >コードを見た感じではbindParamにしている意図がわからず、理解していない様にも感じ取れますが、その意図は何なのでしょうか? ご指摘ありがとうございます。ここ数日ではじめて、MySqliでのプリペアドステートメントを触っているのですが、誤った処理なのでしょうか?あるサイトにサンプルとして紹介されていた、insert文だったのです。しっかり理解しながら進めていかなければなりませんね。 また、try catch の例文、ありがとうございました。 m.ts10806さんのご指摘にあるよう、k011510さんのコードを片手に、改めて学んでみたいと思います。 ありがとうございました。
kai0310

2020/05/09 05:38

m.ts10806さん > PDOでヒントを出すのでしたらPDOで通した方が質問者も理解しやすいのでは・・ そうですね仰る通りです。ただ、今回の質問とは直接の回答ではないため割愛させていただきました。まだ、PDOに関しても理解が浅いと仮定して今後の指針としてもPDOでヒントを出した次第です。
kai0310

2020/05/09 05:42 編集

marquezさん bindParamの処理はざっくり言うと「? と 値 を bind する」ということです。その様なイメージを持ってみるといいかもしれません。 これらに関しての詳細は、公式マニュアルで詳しく表記されていますので、そちらを参考にしてみてください。
m.ts10806

2020/05/09 05:48

あのいえ >$db と定義しておいて $stmt = $mysqli->prepare ↓ $stmt->bind_param だと整合性取れてなくてそもそも動かなくて余計混乱するのじゃないかなと思って。
kai0310

2020/05/09 05:50

失礼しました。修正しときます。
marquez

2020/05/09 06:44

k011510さん ご親切な書き込みありがとうございます。 >bindParamの処理はざっくり言うと「? と 値 を bind する」ということです。その様なイメージを持ってみるといいかもしれません。 そうですね。今、動作をイメージしながらマニュアルを読んでいるところです。ありがとうございます。 ただ、申し訳ありません、今一度伺いたいのですが、質問時に書いたコードだと「? と 値 を bind する」とはなっていないのでしょうか? ご提示したコードは、フォームからPOSTされたデータがすでに変数に入っており、insertする部分のみ書き出しています。 マニュアルを見ていると、各データはステートメントの実行前に変数に入れられていますが、このくらいしか違いが分からずで、どこがおかしいのかご指摘いただけるととても有難いです。 「解決済み」とした後で恐縮いたします。 お時間が許せば、ご教示ください。
marquez

2020/05/09 13:55

ありがとうございます。拝見させて頂きます。 また、先にこの度質問しておりました件、try~catchにより登録できなかった原因が分かりました。変数に値がセットされていないことが原因できた。ありがとうございました!
guest

0

デバッグの基本は、まずどのようなエラーが出ているか把握することです。
(省略しているだけかもしれませんが)処理をtry~catchで囲んでエラーを拾い、表示してください。
そして表示されたエラーをググったり、teratail内で検索するなどして同様の事例を探してエラーの原因を突き止め、修正しましょう。

投稿2020/05/08 15:53

javahack

総合スコア1088

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

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

marquez

2020/05/08 16:37

javahackさん 夜遅くに早々のアドバイスをありがとうございます。 今試しているTABEのカラムが100近くあるのですが、コード自体、質問時に掲載したコードに違いはありません。(カラムの数が違うだけ) ここ数日ではじめて、MySqliでのプリペアドステートメントを触っているのですが、触り始めから(ブラウザ上に表示される)エラーの連続でしたが、(ブラウザに表示される)エラーはなくなったもののインサートが出来ず、どうしたものかと立ち止まってしまったのが経緯です。 申し訳ありませんが、もう少し具体的にお教えいただくことは可能でしょうか。 コードは質問時に掲載したもの(カラム数が違うだけ)と同じです。 「教えてください」と簡単に言っているようで恐縮しています・・
guest

0

ベストアンサー

「起きている問題」を正確に把握することです。

そもそもですが、DBはPHPなどのアプリケーションからすると外部の仕組みです。
エラーを直接拾うことは出来ません。

PHPマニュアルを確認するのは第一です。
例えばmysqli_stmt::executeですが、「返り値」を見ると「bool」になっており、成功した場合に TRUE を、失敗した場合に FALSE を返します。 とあります。
つまり、execute()の戻り値を確認すると失敗したか成功したかは分かるということ。

php

1var_dump($stmt->execute()); 2//実行結果を確認するだけなので変数で受け取ってません

ただ、これだけではfalseが返ったときに「どんなエラーがあったのか」が分かりません。
それを捕捉できるのが既に出ているtry-catchによる「例外捕捉」です。
「例外とは」は調べてください。

mysqliにも専用の例外があります。
mysqli_sql_exception
※親であるExceptionより専用の例外を捕捉した方が良いと思います。

こちらを導入することで、何か問題(例外)が起きた時にExceptionに「エラーの情報」が入ってきて、その情報を確認することで「どんな問題があったか」ということを把握することができます。


ただ、これらより先にすることがあります。
「外部の仕組みである」と最初に書きました。

ということは、PHPからでないと実行できないわけではなく、
PHPはあくまで外部の仕組みを使っている、外部の仕組みに「情報を問い合わせている」だけです。

ということは、直接実行して想定の結果が得られるかどうかがカギを握っているということになります。
直接実行しても成功しないのであれば、当然PHPから実行しても成功しません。

なので、変数のところはとりあえず「仮の固定値」を与えて、PHPから実行予定のSQLを直に実行しましょう。これの結果によって次の展開を考えることができます。
問題を切り分けのためにとれる手段は多い方が良いです。
「○○に問題がない事実」という前提があるかないかではやりやすさが全く変わってきます。


アロー演算子に弱くて・・

「インスタンス化したオブジェクトが持っている機能(メソッド・プロパティ)を呼び出す」ために使います。
「何を持っているか」はそれを調べる機能もありますが、既存のクラスであればPHPマニュアルを確認することで確認できますし、フレームワークもドキュメントを読めば分かります。

あとはクラスの基礎をしっかり読んでください。

投稿2020/05/08 23:23

編集2020/05/08 23:26
m.ts10806

総合スコア80875

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

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

marquez

2020/05/09 04:23

m.ts10806さん ご親切なコメントありがとうございます。 長文に渡る詳しい説明に頭が下がります。 修正の依頼の際ご指摘いただいた「自身で理解しようとしないといつまでも弱いまま」とのこと、仰る通りですよね。 ここはいったん解決済みとし、教えていただいたマニュアルを参考に学んでみたいと思います。 ありがとうございました。
m.ts10806

2020/05/09 04:26

プログラミングの本質は問題解決 言語もフレームワークも問題解決のための道具の1つに過ぎません。
marquez

2020/05/09 04:40

そうですね。少しずつでもきちんと学んでいきたいと思います。
marquez

2020/05/09 04:41

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問