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

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

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

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

PHP

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

Q&A

解決済

2回答

2411閲覧

PHPでMySQLからbitの値を正しく取得出来ない

mmt_0129

総合スコア5

MySQL

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

PHP

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

1グッド

0クリップ

投稿2020/03/13 06:33

編集2020/03/13 06:51

みなさんはじめまして、
1年ほど前にPHP+MySQLのプログラムを習い始めたばかりで
至らないところがあると思います。
未熟ながら頑張っていくのでご指摘頂ければありがたいです。

前提・実現したいこと

題名にもある通り、PHPでPDOを使いMySQLに接続し、
bit(1)を取得しようと考えています。
bitを使う理由はTure/falseとして使いたいからです。

PHPで取得したint型やbit型を含んだ連想配列を取得してから
smartyのif文でbitの値を確認して、表を表示しても良いかかどうかを判断しています

発生している問題・エラーメッセージ

Windowsの環境のもと、xamppを使用してローカルテストをした所。
MySQLのbit型を含んだTableは正常に取得出来ました。

次に
レンタルしたxserverでPHPの動作確認したところ、
Tableは取得したようなのですが、
{$Table|@var_dump}で確認したところ
int型(11)やtime型やvarchar(20) utf8_general_ci 型の列は取得できているが
bit型の列だけ正しく取得出来ていないようです。

試したこと

ローカルのxamppでPHPを動かしローカルのMySQLデータベースに接続して動作確認
→正常に出力された。

ローカルのxamppでPHPを動かしてxserverではない所にあるレンタルしたMySQLデータベースに接続して動作確認。
→正常に出力された。

xserverでPHPを動かしてxserverではない所にあるレンタルしたMySQLデータベースに接続して動作確認。
→bit型だけ取得できていないようにみえる。
var_dumpで確認した所、bitの値が0のときは空白で1のときは文字化けしたものが出力された。

PHPでbit型の列を抜き取り、全て(int)で型変換して@var_dumpで確認。
→ローカルは正常に出力されたが、xserverのみ出力結果が全て0になっていた。

ネット上で「MySQLのBIT型を、PHPで使うにはhexdec(bit型)を使えばいい」とあったので動作確認。
→ローカルは正常に出力されたが、xserverのみ出力結果が全て0になっていた。

MySQLのbit型(1)をint型(1)に変えてローカルとレンタル環境で試す。
→どちらの環境も全て正常に出力された。

ちなみにどの作業でもsmartyのif文は
{if $Table.bit }
{if $Table.bit eq 1 }
{if {$Table.bit} eq 1 }
{if {$Table.bit|escape} eq 1 }などでbit型が取得できて動いているか一通り試しています

補足情報(FW/ツールのバージョンなど)

XAMPP Version: 7.3.10
NetBeans IDE 11.1

ひと通り試した結果、
xserverのOSがLinuxだからもしかすると何か習得方法が違うのかな?と思ったのですが
ネットで「Linux bit型 PHP MySQL」「bit型 PHP 取得」など調べてみましたが、これといって解決方法が載っていませんでした。

どなたかわかる方がおられましたら、どうか教えて頂ければありがたいです。

s.k👍を押しています

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

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

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

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

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

m.ts10806

2020/03/13 06:40

>xammp 細かいですが、自身が最後に環境提示されてるようにXAMPPです。 また、実際のテーブル定義と取得の PHPコードをご提示ください。 要は他者がコピペで再現確認できるコードです。
mmt_0129

2020/03/13 06:50

誤字申し訳ないです。修正します テーブル定義とソースコードは必要だという人が多ければ長くても書こうかと思ってましたが、 今回の場合多分根本的な私のMySQLの解釈不足だと思っているので書いていません。
maisumakun

2020/03/13 06:52

> 今回の場合多分根本的な私のMySQLの解釈不足だと思っているので書いていません。 いえ、ここでは具体的な値のハンドリングがどうなっているかが最大の問題です。
m.ts10806

2020/03/13 06:54

であれば、コード的な要素は質問内容から排除されたほうが良いのでは。 Smartyのコードをつまんでかかれても混乱のもとです。 書くなら全部書く、書かないなら要件だけでもきちんと書く
mmt_0129

2020/03/13 07:09

maisumakunさん そうでしたか、特に今までPDOで他の型をそのまま表示して使っていたので、わかりませんでした。 申し訳ないです m.ts10806さん 確かに仰るとおりです。SQL文とPHPとSmartyと3つもあり全部書くと大変で手抜きしたく中途半端なことをしました 申し訳ないです。。
m.ts10806

2020/03/13 07:25

それならむしろPHPは必要ですね。 情報は不足してるより過多のほうが回答者には優しいのです
guest

回答2

0

ベストアンサー

bit型の列だけ正しく取得出来ていないようです。

はい、bit型はバイナリデータになりますので、ふつうにSELECTしても使える値が返ってきません。特に、0x00ヌル文字ですので、そのまま受け取ってしまうとバグを踏むリスクも高いです。

データベース側SELECT BIN(column_name)と変換して取得するのがいちばん確実だとは思いますが、ORMが挟まっているなどでそのような手を使えない場合、INT(1)の列+0/1だけのテーブルと外部キー制約、のような手段で2値カラムを構築するほうがいいかもしれません。

投稿2020/03/13 06:43

maisumakun

総合スコア145201

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

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

maisumakun

2020/03/13 06:54

「根本的な私のMySQLの解釈不足」というような自覚があるのであれば、なおのことbit型のような特殊な型を使うのは避けたほうがいいです。
mmt_0129

2020/03/13 07:00

教えて頂きありがとうございます。 0としたらbit型は数字の0として返ってくるのかと思っていましたが、0x00として返ってくるのですね。 確かにバグになるので全然違うところにある他のソースコードも修正しておきます。 ありがとうございます。 特にORMを使っていませんが(そもそも知識不足でわからない)、 教えられたSELECT BIN(column_name)の方法を試した結果、望んだ状態で取得することが出来ました。 2~3時間くらい四苦八苦していたので本当にありがとうございます。
mmt_0129

2020/03/13 07:12

bit型は特殊なのですか。てっきり本当にbit(1)を使えばSQLServerのboolのように扱えるのかと思っていました。 ご指摘のようにbitは使わない方向でいきたいとおもいます。
maisumakun

2020/03/13 07:14

ちなみに、MySQLのテーブル定義にBOOLEANと書くとTINYINT(1)と解釈されます。
mmt_0129

2020/03/13 07:17

そうなるのですか!? また一つ賢くなりました。本当に助かります。 TINYINT(1)で使っていこうと思います。
guest

0

mysqlにおいてbooleanはtinyintにしておいてください
true=1,false=0として判断されます。

投稿2020/03/13 07:04

yambejp

総合スコア114964

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

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

mmt_0129

2020/03/13 07:10

そうなのですか、ネットで色々調べたら MySQLでbooleanを使うならbit型が良い!!みたいな記述があったので そのまま鵜呑みにしてしまいました。
mmt_0129

2020/03/13 07:20

1/0に置き換わるのですか、それは便利ですね さっそくテーブル定義をbitだったものをtinyint(1)に置き換えて動作確認しました。 特に不具合もなく全て正常に作動しました。本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問