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

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

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

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

2回答

2650閲覧

PDO利用時、更新系の型変換について

hanzoumon

総合スコア13

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2014/12/12 00:41

PDOを利用してMySQLにUpdateをexecuteした時、型が異なる場合でもエラーは出ないのでしょうか?
以下のDB構成があります。

PROD_CODE varchar(7)

WEST_BC int(11)

このテーブルの'WEST_BC'に対して'aaaa'の様な文字をセットしても、
エラーにはならず、'WEST_BC'の値が'0'になってしまいます。
ここで言うエラーは下記の$flagがtrueかfalseかです。結果、trueになります。

lang

1$flag = $stmt ->execute();

PHPMyadminで手動で同様のUpdateを実行すると、型が違う旨のエラーがでます。
PDOを利用した時、型が違ったものでもエラーとして取り扱われないのでしょうか?
以下にコードを掲載させて頂きます。ご教授頂ますようお願いします。

lang

1<?php 2 //DB接続 3 $dsn = "mysql:dbname=" . DB_NAME . ";host=" . DB_SERVER . ";charset=utf8"; 4 $username = DB_USER; 5 $password = DB_PASS; 6 7 //DB接続開始 8 try{ 9 $pdo = new PDO($dsn, $username, $password); 10 $pdo ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 11 12 $pdo ->beginTransaction(); //トランザクション開始 13 $fp = fopen($csvFullPath, 'r'); //CSVファイル読み込み 14 //UPDATE用Query 15 $sql = 'UPDATE STOCK SET WEST_BC = :west_bc 16 WHERE PROD_CODE = :prod_code'; 17 18 $stmt = $pdo ->prepare($sql); 19 20 while ($ret_csv = fgetcsv($fp)){ 21 $stmt -> bindvalue(':prod_code', $ret_csv[0], PDO::PARAM_STR); 22 $stmt -> bindValue(':west_bc', $ret_csv[1], PDO::PARAM_INT); 23 24 //execute [$flgは成功True 失敗Flaseが入る。多分] 25 $flag = $stmt ->execute(); 26 27 if (!$flag) { 28 $info = $stmt ->errorInfo(); 29 print($ret_csv[0] . '---' . $info[0] . '---' . $info[2] . 30 '---' . $info[1] . "<BR>"); 31 } 32 //結果描画 33 print($ret_csv[0] . "--" . $stmt ->rowCount() . "<BR>"); 34 } 35 36 fclose($fp); 37 38 } catch (Exception $ex) { 39 $pdo ->rollBack(); 40 print('failed:' . $ex->getMessage() . '<BR> ロールバック済み'); 41 exit(); 42 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

下記の1行を入れれば解決出来ます。

lang

1$pdo->exec("SET SESSION sql_mode='TRADITIONAL'");

蛇足ですが、トランザクションの書き方も以下のようにしたほうがいいでしょう。

lang

1try { 2 $pdo = new PDO(...); 3 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 4 $pdo->beginTransaction(); 5 try { 6 ... 7 } catch (PDOException $e) { 8 $pdo->rollBack(); 9 throw $e; 10 } 11} catch (PDOException $e) { 12 ... 13}

備考: PHPでデータベースに接続するときのまとめ

投稿2014/12/11 09:26

mpyw

総合スコア5223

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

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

hanzoumon

2014/12/12 01:06

早速のご回答、有難う御座います!ずばりでした。 MySQLの自動変換の動きに度肝をぬかれました。MSSQLしか触った事がないもので…  また、教示頂いたQiita大変勉強になります。 本当に有難う御座いました。
guest

0

PDOではSQL文のエラーはスルーされます。よく調べてみましょう。
PHP・PDO、SQL実行時のエラーをExceptionで捕捉する

投稿2014/12/11 09:06

sho_cs

総合スコア3541

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

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

hanzoumon

2014/12/11 09:16

恐らく「 $pdo ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);」こちらの事だと思うのですが、本当に機能しているか確かめてみました。 Query文の頭をhogeUpdate...に変更すると例外が発生ました。なので、スルーはされていない様です…
mpyw

2014/12/11 09:19

質問者さんはエラーモードをデフォルトのSILENTのままにされていますが、executeの返り値は確認しているので問題はそこじゃないです。
sho_cs

2014/12/11 09:38

すいません。質問をちゃんと見れていませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問