0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【PHP】PDOのfetchでハマった話

Last updated at Posted at 2023-08-06

使用バージョン

PHP 7.4

前提

カラム名 データの型
id int
type int
name varchar

上記のようなテーブルがあります。
PDOでfetchしてきたものをJSに渡し、typeによって処理を分岐させていました。
分岐にはswitch文を使っていました。

PHP

// ※だいたいこんな感じのコードというだけで、動作は検証してません。
$pdo = new PDO($connection['dsn'], $connection['username'], $connection['password']);
$sql = 'SELECT * FROM '. $connection['table'] .' ORDER BY id ASC';
$stmt = $pdo->prepare($sql);
$stmt->execute();
$records = $stmt->fetchAll();
$records_json = json_encode($records);

JS

// ※だいたいこんな感じのコードというだけで、動作は検証してません。
var records = <?php echo $records; ?>;
// 何かしらの変換処理
type= records.type;
    switch (type) {
        case 1:
            hoge = 'hoge';
            break;
        case 2:
            hoge = 'fuga';
            …

起こったこと

switch文がすべて無視されました。
テーブルを参照するとtypeには1 や 2が確実に入っています。

原因

PDOでfetchしてきたものとテーブルの型が一致していないのが原因でした。
$recordsには例えば下記のようなデータが入っていました。

array(2) { ["id"]=> string(1) "1" ["type"]=> string(1) "2" ["name"]=> string(4) "hoge" } 

これをjsonに変換しても、typeはstringのままなので、JSのswitchの厳密な比較の処理ではすべてfalseになってしまします。

対応策

JS側でparseIntなどを使用して、typeを無理やりint型に変換しました。

注意

PHP8.2でfetchを試してみたところ、int型のカラムの値はint型で取得できました。
PHP8未満を使用する際は注意しなければならない様です。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?