カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

PDOで取得したデータが、数値型なのに文字列型になってしまう

PHPのバージョンを7.4系から8.x系にバージョンアップする事案があり、変更点やシステムの動作に問題がないか等の調査をしていました。
その中で公式ページにも見当たらないことがあったので、実際にバージョンを切り替えながら検証して分かったことを共有させていただければと思います。

今回発見した問題点はPDOのプリペアドステートメントです。
セキュリティ上、脆弱性のないように開発する中で必ず使われているかと思います。

ただ、このプリペアドステートメント、数値型のデータを文字列型で返してきます。
困りますね。
しかしながらそういう仕様なので、それに合わせてコーディングするしかないわけなんですが、
これがなんと、8.1以降だと数値型で返ってるのです。

なんということでしょう・・・。

厳密な比較を行っている箇所はすべて修正しないといけません。
例えば以下のような場合です。

if($col["COLUMN_NAME_INDEX"] === "1") { ... }

このCOLUMN_NAME_INDEXのデータ型は数値型(Integer)ですが、PDOのプリペアドステートメントで返ってくるのは文字列型のため、このような比較をしています。
これが8.1以降だとCOLUMN_NAME_INDEXのデータが数値型のため、(1 === "1")という式となり判定はfalseとなります。

この問題については、コーディング自体に間違いがあるわけではありませんので、コード解析ツール等にかけても出てこないと思います。
原因の究明に時間がかかったので、ここに記しておきます。

更に調査したところ、PDOの設定でエミュレート・モードというものがあり、有効/無効(true/false)で設定します。
実際には今回の件に関する具体的な設定ではないのですが、この設定を無効(false)に設定してみると8.0でも数値型で返ってきました。

PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, false)

検証したバージョンは次の通りです。
7.4.29
8.0.28
8.1.17
8.2.4

また、逆に従来の文字列に合わせる場合だと確実に動作させることができます。
PDO::ATTR_STRINGIFY_FETCHESオプションをtrueにすることで全て文字列で返すように設定することが可能です。
公式リファレンスにも「全てのフェッチする値を強制的に文字列として扱います。」と書かれています。

PDO::setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false)

公式:PHP 8.0.x から PHP 8.1.x への移行

1,154 views

Invoke-webRequestとcurlコマンドでHTTPリクエスト

Invoke-webRequestとcurlコマンドを使えばCUI(Commandline User Interface)にてHTTPリクエストを送信することができます。
ここでは基本的な使い方をご紹介します。

Windowsの場合

まずはWindowsの場合です。
PowerShellでInvoke-webRequestコマンドを使います。

このコマンドにはエイリアスが設定されており、curl iwr wgetでも使えます。
curlはあくまでエイリアスなので、Linux・Macでのcurlとは異なりますのでご注意ください。

GETリクエスト
Invoke-webRequest https://www.hoge.jp
Invoke-webRequest -Method GET https://www.hoge.jp

パラメータを付加したリクエスト

Invoke-webRequest https://www.hoge.jp?key=value&key=value
Invoke-webRequest -Method "GET" -Body @{key="value";key="value"} https://www.hoge.jp
POSTリクエスト
Invoke-webRequest -Method "POST" -Body 'key=value&key=value' https://www.hoge.jp
Invoke-webRequest -Method "POST" -Body @{key="value";key="value"} https://www.hoge.jp

続きを読む…»

6,119 views

MySQL 既存テーブルの文字コードをutf8mb4に変換する

MySQLのテーブルで文字コードutf8とutf8mb4が混在するシステムをutf8mb4に統一する機会がありました。
そんな時に文字コードや照合順序を確認する方法、変換する方法です。

MySQL:5.7

データベースの文字コードと照合順序を確認する

SELECT
    SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE
    SCHEMA_NAME = 'データベース名';

テーブルの文字コードと照合順序を確認する

SELECT
    TABLE_NAME, TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE
    TABLE_SCHEMA = 'データベース名';

カラムの文字コードと照合順序を確認する

SELECT
    COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
    TABLE_NAME = 'テーブル名';

続きを読む…»

5,405 views

MySQL 外部キー制約を一時的に無効にする

MySQLで外部キー制約を設定しているテーブルは削除等、一部の命令を実行することができません。
開発をしている中でどうしても外部キー制約が邪魔になってしまう場合があります。
その場合は外部キー制約を一時的に無効にすることができます。

外部キー制約を一時的に無効にする

SET foreign_key_checks = 0;

処理が終わったら必ず元に戻しましょう。

SET foreign_key_checks = 1;
1,119 views

Docker + Laravel9 開発環境構築

Dockerを使ってLaravel9の開発環境を構築してみたいと思います。
XAMPPやレンタルサーバーを使うよりお手軽に出来るので是非試してみてください。

OS等の環境は以下の通りです。

OS: Windows10
Docker Desktop: v4.14.1
Visual Studio Code: v1.74.0

Dockerで環境構築

予め必要なファイル等を準備します。
Laravelのプロジェクト名は「laravel-app」と仮定します。

docker/app/000-default.conf
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/laravel-app/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/laravel-app/public>
           AllowOverride All
       </Directory>
</VirtualHost>
docker/app/Dockerfile
# dockerイメージの選択
# 予めPHPとApacheがインストールされているイメージをDocker Hubからダウンロード
FROM php:8.0-apache

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
# ADD:ローカルのファイルをDockerコンテナ内にコピーする
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

# Composerのインストール
# RUN:コンテナ内でコマンド実行する
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get install -y nodejs

# ミドルウェアのインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

続きを読む…»

3,432 views