使用バージョン
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未満を使用する際は注意しなければならない様です。