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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

2回答

1644閲覧

PDO で bindColumn した後の fetch の結果を配列に入れたい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2018/08/23 09:24

編集2018/08/23 12:08

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}

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

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

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

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

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

m.ts10806

2018/08/23 10:31

細かいですが、初歩的でも基礎的でもないから悩まれているのでは・・・?初歩的か基礎的かは回答側が判断して回答するのであまり自身で評価しないほうが良いかと思います。なるべく要件を書くことのみに終始していただければと。気になるようでしたら「初心者アイコン」が質問編集画面のタイトル横にあるのでそちらをチェックしてつけてください。
退会済みユーザー

退会済みユーザー

2018/08/23 10:43

修正しました。ご指摘ありがとうございます。
guest

回答2

0

ベストアンサー

まずはfetchAllしてすべての結果を変数で受けたあと、
array_walkしながらキーを元にキャストしていけばよいのでは?

投稿2018/08/23 09:36

yambejp

総合スコア114747

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

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

退会済みユーザー

退会済みユーザー

2018/08/23 12:21 編集

ありがとうございます。 array_walk ではないですが、foreach ループさせて処理しました。
guest

0

何ができないか良く分からないのですが

php

1while($stmt->fetch(PDO::FETCH_ASSOC)){

が、

php

1while($row = $stmt->fetch(PDO::FETCH_ASSOC)){

こう?

投稿2018/08/23 09:36

編集2018/08/23 09:37
papinianus

総合スコア12705

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

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

退会済みユーザー

退会済みユーザー

2018/08/23 12:09

ありがとうございます。 一旦解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問