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

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

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

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

Q&A

解決済

1回答

5034閲覧

PHP PDOのエラー処理について

TChanger

総合スコア69

PHP

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

0グッド

0クリップ

投稿2015/08/06 12:10

PHPのPDOについて質問です。

PHP

1//Connect.php 2 3try { 4//connect 5$db = new PDO(PDO_DNS,DB_USERNAME,DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); 6$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 7 8} catch (PDOException $e) { 9echo $e->getMessage(); 10exit; 11}

といった具合なファイルをインクルードをかけて各PHPファイルで使用しているのですが、

SELECT文でユニークキーにひかかって登録が出来ず

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062・・・・・

というエラーが出るのですが、
これを「同じものは登録出来ないですよ」等のエラーページを作って
そこにリダイレクトしたいのですが、どのように書けばいいのかがわかりません。

そもそも try、catch の使い方もいまいち理解していないまま使用しているのも問題だと重々承知しております。

どうぞ誰かお助けください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

PHP

1// connect.php 2try { 3 //connect 4 $db = new PDO(PDO_DNS,DB_USERNAME,DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); 5 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 6 7} catch (PDOException $e) { 8 throw $e; 9} 10 11// connectを呼び出してる側 12try { 13 // INSERT処理 14} catch (PDOException $e) { 15 if ($e->getCode() == '1022' || $e->getCode() == '1062') { 16 header(リダイレクト); 17 // もしくはメッセージをセットして入力画面で表示 18 $errorMessage = '同じものは登録出来ないですよ'; 19 // もしくはフラグで。ビュー側で$isDuplicateErrorがtrueの時にメッセージ表示 20 $isDuplicateError = true; 21 } 22}

簡単に実装だと、上記のような感じでしょうか。
connect.phpでPDOExceptionを処理しないのは
画面によってエラー処理が違う可能性があるためです。

投稿2015/08/06 13:29

icham

総合スコア559

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

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

TChanger

2015/08/06 15:23 編集

早速の回答をありがとうございます。 SELECT文でなくINSERT文でしたね・・・汗 教えて頂いた通りにINSERT処理のSQL文をつくる所から $st->execute()までを「try」の中に入れてみたのですが、 相変わらず同じエラー画面になってしまいます・・・。 私のPHPコードを記載しますので、またご助言いただければ感謝です。
TChanger

2015/08/06 15:23 編集

if ($_POST['form'] == 'addForm') { // echo 'add ok'; // var_dump($_POST['os']) ; try { //INSERT $sql = 'INSERT INTO mobile_phone_stock( type,model_no,model_name,color,os,version,sim,carrier,maker,release_date,room_stock,outside_stock,delflag) VALUES(:type,:model_no,:model_name,:color,:os,:version,:sim,:carrier,:maker,:release_date,:room_stock,:outside_stock,:delflag)'; $st = $db->query("SET NAMES utf8;"); $st = $db->prepare($sql); $st->bindParam(":type", $_POST['type']); $st->bindParam(":model_no", $_POST['model_no']); $st->bindParam(":model_name", $_POST['model_name']); $st->bindParam(":color", $_POST['color']); $st->bindParam(":os", $_POST['os']); $st->bindParam(":version", $_POST['version']); $st->bindParam(":sim", $_POST['sim']); $st->bindParam(":carrier", $_POST['carrier']); $st->bindParam(":maker", $_POST['maker']); $st->bindParam(":release_date", $_POST['release_date']); $st->bindParam(":room_stock", (int)$_POST['room_stock'], PDO::PARAM_INT); $st->bindParam(":outside_stock", (int)$_POST['outside_stock'], PDO::PARAM_INT); $st->bindParam(":delflag", (int)$_POST['delflag'], PDO::PARAM_INT); $st->execute(); // $db = null; $url = './saved.php'; header("Location: ".$url); exit; } catch (PDOException $e) { if ($e->getCode() == '1022' || $e->getCode() == '1062') { $url = './error.html'; header("Location: ".$url); // $errorMessage = '同じものは登録出来ないですよ'; } } } 見づらくて申し訳ありません。
icham

2015/08/07 00:16

フレームワーク経由でしかPDOをいじったことしかなく曖昧な知識で申し訳ないです! $e->errorInfo[1]でエラーコードが取得できるようです。 1回こちらをvar_dump($e->errorInfo[1])で表示してみて if ($e->errorInfo[1] == '表示したエラーコード') { とすれば良いかと思います。
TChanger

2015/08/07 01:27

ありがとうございます! 出来ました!!!! だいぶ感動しております! 助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問