PHP 7.1 で上手く配列を作成できずに四苦八苦しています。
アドバイスのほど、よろしくお願いいたします。
ソースコード
一部を抜粋
php
1<?php 2$stmt = $pdo->prepare( $query ); 3 4$stmt->execute( (array) $bind_params ); 5 6for ( $i = 0; $i < $stmt->columnCount(); $i ++ ) { 7 $column = $stmt->getColumnMeta( $i ); 8 $row[ $column['name'] ] = null; 9 10 if ( isset( $column['native_type'] ) === true ) { 11 switch ( $column['native_type'] ) { 12 case 'TINY': 13 case 'SHORT': 14 case 'INT24': 15 case 'LONG': 16 case 'LONGLONG': 17 $pdo_type = PDO::PARAM_INT; 18 break; 19 default: 20 $pdo_type = PDO::PARAM_STR; 21 } 22 } 23 24 $stmt->bindColumn( $column['name'], $row[ $column['name'] ], $pdo_type ); 25} 26 27if ( $mode === 'all' ) { 28 // 問題の箇所 29 while ( $stmt->fetch( PDO::FETCH_ASSOC ) ) { 30 $result[] = $row; 31 var_dump( $result ); 32 } 33} else { 34 while ( $stmt->fetch( PDO::FETCH_BOUND ) ) { 35 $result = $row; 36 } 37}
本当は for の部分は不要なのですが、とあるレンタルサーバーの PDO Driver が mysqlnd ではなく MySQL を使用しており、結果が全て文字列になってしまうために PDOでフェッチした数値型カラムの値が文字列で取得されるのでなんとかしようと頑張った。 より拝借しました。mysqlnd をインストールできれば、悩むことはないのですが………。
実行結果
/Users/public_html/common/db_connect.php:77: array (size=1) 0 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト1' (length=21) 'url_key' => string 'test1' (length=9) 'priority' => int 1 'delete_flg' => int 0 /Users/public_html/common/db_connect.php:77: array (size=2) 0 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト1' (length=21) 'url_key' => string 'test1' (length=9) 'priority' => int 1 'delete_flg' => int 0 1 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト1' (length=21) 'url_key' => string 'test1' (length=9) 'priority' => int 1 'delete_flg' => int 0 /Users/public_html/common/db_connect.php:77: array (size=2) 0 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト1' (length=21) 'url_key' => string 'test1' (length=9) 'priority' => int 1 'delete_flg' => int 0 1 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト1' (length=21) 'url_key' => string 'test1' (length=9) 'priority' => int 1 'delete_flg' => int 0 2 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト1' (length=21) 'url_key' => string 'test1' (length=9) 'priority' => int 1 'delete_flg' => int 0
目指したい実行結果
/Users/public_html/common/db_connect.php:77: array (size=1) 0 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト1' (length=21) 'url_key' => string 'test1' (length=9) 'priority' => int 1 'delete_flg' => int 0 /Users/public_html/common/db_connect.php:77: array (size=2) 0 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト1' (length=21) 'url_key' => string 'test1' (length=9) 'priority' => int 1 'delete_flg' => int 0 1 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト2' (length=21) 'url_key' => string 'test2' (length=9) 'priority' => int 1 'delete_flg' => int 0 /Users/public_html/common/db_connect.php:77: array (size=2) 0 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト1' (length=21) 'url_key' => string 'test1' (length=9) 'priority' => int 1 'delete_flg' => int 0 1 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト2' (length=21) 'url_key' => string 'test2' (length=9) 'priority' => int 1 'delete_flg' => int 0 2 => array (size=6) 'id' => int 1 'no' => int 1 'name' => string 'テスト3' (length=21) 'url_key' => string 'test3' (length=9) 'priority' => int 1 'delete_flg' => int 0
解決方法
今回は以下のように修正して解決しました。
少々難しく考え過ぎていたのだと思います。ありがとうございました。
php
1<?php 2$stmt = $pdo->prepare( $query ); 3 4$stmt->execute( (array) $bind_params ); 5 6for ( $i = 0; $i < $stmt->columnCount(); $i ++ ) { 7 $column = $stmt->getColumnMeta( $i ); 8 9 if ( isset( $column['native_type'] ) === true ) { 10 switch ( $column['native_type'] ) { 11 case 'TINY': 12 case 'SHORT': 13 case 'INT24': 14 case 'LONG': 15 case 'LONGLONG': 16 $pdo_type = PDO::PARAM_INT; 17 break; 18 default: 19 $pdo_type = PDO::PARAM_STR; 20 } 21 } 22 23 $row[ $column['name'] ] = $pdo_type; 24} 25 26if ( $mode === 'all' ) { 27 $tmp = $stmt->fetchAll(); 28 $tmp_count = count( $tmp ); 29 30 for ( $i =0; $i < $tmp_count; $i++ ) { 31 foreach ( $tmp[ $i ] as $k => $v ) { 32 $result[$i][ $k ] = ( $row[ $k ] === PDO::PARAM_INT ) ? (int) $v : (string) $v; 33 34 unset( $row[ $k ] ); 35 } 36 37 unset( $tmp[ $i ] ); 38 } 39} else { 40 $tmp = $stmt->fetch(); 41 42 foreach ( $tmp as $k => $v ) { 43 $result[ $k ] = ( $row[ $k ] === PDO::PARAM_INT ) ? (int) $v : (string) $v; 44 45 unset( $tmp[ $k ], $row[ $k ] ); 46 } 47}
回答2件
あなたの回答
tips
プレビュー