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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

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

PHP

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

Q&A

解決済

2回答

1488閲覧

【PHP,MYSQL】PDOでバインドさせた値が予期せぬ形に変換される

hanhunhun

総合スコア100

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

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

PHP

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

0グッド

1クリップ

投稿2017/12/06 00:51

編集2017/12/06 06:37

いつもお世話になっております。

表題の件、以下の事象が発生しており困っております。

PHP

1$pdo = new PDO(~); 2 3$sql = 'DELETE FROM hogehoge 4 WHERE 5 foo = ? 6 AND bar = ?'; 7 8$arr = array('test','value'); //DBから取得してきたデータを整形して格納、上記foo,barにバインドする値 9 10$sth = $pdo->prepare($sql); 11 12$sth->execute($arr); 13

上記を実行し、mysqlのクエリを見ると以下のようなクエリが実行されておりました。

DELETE FROM hogehoge WHERE foo = 0x74657374 AND bar = 0x76616c7565

このクエリをPHPで実行した場合結果0件で返ってきます。

情報が少なくわかりにくいかと思いますがお知恵を貸していただければ幸いでございます。

[2017/12/06 15:34 追記]
以下、PDOのオプションです。
以下のオプションを外すと正常な文字列でクエリが返ってきました。

PHP

1 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 2 PDO::ATTR_EMULATE_PREPARES => false,

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

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

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

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

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

ockeghem

2017/12/06 02:42

PDO呼び出し時の引数を開示可能な範囲で教えてください。また、PHPのバージョンは何でしょうか?
退会済みユーザー

退会済みユーザー

2017/12/06 03:40

DELETE FROM hogehoge WHERE foo = 0x74657374 AND bar = 0x76616c7565 を出力しているコードを提示してもらえる?
guest

回答2

0

自己解決

PDO接続時の以下のオプションを外すことで事象の回避をすることが出来ました。
原因はわかりません。

PHP

1 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 2 PDO::ATTR_EMULATE_PREPARES => false,

投稿2017/12/06 08:25

hanhunhun

総合スコア100

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

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

0

テーブルの定義、特にfooとbarの列の型と文字エンコーディングはどうなっていますか?
ところで、クエリ自体は問題ないのではないでしょうか? MySQLの仕様で、以下のようになるからです。なぜそうなるかは分かりません。PHPのバージョンは何でしょうか?

SQL

1SELECT 0x74657374 = 'test' 2 3実行結果 40x74657374 = 'test' 51 6

投稿2017/12/06 01:02

ockeghem

総合スコア11701

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

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

hanhunhun

2017/12/06 01:10

そうなんです。クエリ自体は問題なく、SQLクライアントソフトやssh接続して直接クエリを流す場合にはしっかりと実行されます。単純に文字列が16進数に変わっているだけなんですが、プログラム上でクエリ実行した際にだけ結果が0件(実行エラーではなく)で返ってきて、当然該当のレコードもデリートされません。 文字エンコ―ディングは以下です PHP : utf8 MYSQL : utf8 DB : sjis ※仕様上この構成は変更できません。 今回扱う型は以下です。 date char お手数おかけしてます。
ockeghem

2017/12/06 01:25

date 型の列が、'test' とか 'value' の値はとらないように思えますが、これは質問時に変えているのでしょうか?
hanhunhun

2017/12/06 01:38

そうです。 date型は実際のデータにはあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問