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

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

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

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Q&A

解決済

1回答

1660閲覧

Mysqliのプリペアドステートメントのエラーレポートについて(PHP)

japanese_ninja

総合スコア196

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

0グッド

2クリップ

投稿2014/06/21 07:26

SQLの実行中にエラーを感知するため、
MySQLiのプリペアドステートメントにおいて返り値を使っています。

$stmt = $db->stmt_init(); if($stmt->prepare("INSERT INTO mytable VALUES (1,2,3)")) { $stmt->execute(); $stmt->close(); } else echo("ステートメントは失敗しました: ". $stmt->error . "<br>");
しかし、プリペアドステートメントの返り値はSQLステートメントの準備段階で
エラーがあるかどうかを感知しているだけで、実行した際のエラーは感知していないようなのです。

であれば、エラーをフラグするために実行ラインを下のように変更したほうがいいでしょうか。

if($stmt->execute()) $error=true;

また、ステートメントが安全に実行されるためにに下記のものも設定したほうがいいでしょうか。

if($stmt->errno) {$error=true;}

それとも、最初のMySQLiの'prepare'ステートメントの返り値を使っているので大丈夫なのでしょうか。

色々うかがい申し訳ないのですが、アドバイスをお願いします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

Mysqliの各メソッドは失敗することがあります。そのため各返り値をテストしなくてはなりません。

もし一つが失敗したとき、思っていた状態ではないオブジェクトでも
続行し続ける意味があるかを考えてみてください。

最後のオペレーションのエラーメッセージは、各コネクション/ステートメントにのみ
格納されているため、失敗したあとも作業を続行した場合になぜ失敗したのかという情報を
失ってしまう恐れがあります。

スクリプトを再び試してみるか、どこか編集するか、すべて止めるかを決めるためには、
その情報が必要となります。

また、この情報があればデバッグするのも簡単になると思いますよ。

`
$stmt = $db->prepare("INSERT INTO mytable VALUES (?,?,?)");
// prepare() はシンタックスのエラー等で失敗する可能性があります
if ( false===$stmt ) {
// 下記のオペレーションは有効/準備されたステートメントのオブジェクトが必要なため、使い続けるのはあまり意味がありません
// die()よりも少し複雑なメカニズムを使うほうがよいかもしれません
// しかし、これはただの例です
die('prepare() failed: ' . htmlspecialchars($db->error));
}

$flag = $stmt->bind_param('iii', $a, $b, $c);
// bind_param()は、ステートメントのプレースホルダーの数と合致していないことで失敗することがあります
// またはタイプがあまりあわないこともあります
if ( false===$flag ) {
// パラメータを結合することができない限り、execute()は使えません。
die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}

$flag = $stmt->execute();
// execute()は複数の理由で失敗する可能性があります。そして誰かがネットワークケーブルでつまずいただけで失敗することもあります
if ( false===$flag ) {
die('execute() failed: ' . htmlspecialchars($stmt->error));
}

$stmt->close();
`

投稿2014/06/22 02:30

kenshiro

総合スコア407

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問