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

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

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

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

PHP

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

Q&A

解決済

2回答

4115閲覧

関数を使ってDBで取得した変数を別のファイルで呼び出す方法

junkboy

総合スコア45

MySQL

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

PHP

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

0グッド

0クリップ

投稿2015/11/12 03:17

編集2015/11/12 06:12

function.phpとindex.phpを使用しています。

function.phpで定義した関数でDBから取得した値を変数に格納し、index.phpで呼びだし、foreachで繰り返し処理をしたいのですが、

Warning: Invalid argument supplied for foreach() in ****

というエラーが出力され、配列がうまく返されません。

どのようにすればindex.phpで$columnsという配列を出力することができるでしょうか。

ご教授いただけますと幸いです。

【環境】
PHP:5.6
MySQL:5.5

【function.php】

lang

1// DBに登録されている値を取得 2function getColums($table) { 3 $dbh = connectDb(); 4 $columns = array(); 5 $sql = "select * from $table order by created desc"; 6 foreach ($dbh->query($sql) as $row) { 7 array_push($columns, $row); 8 } 9 10 // ここで配列が出力されるのは確認済みです。 11 // foreach ($columns as $colum) { 12 // var_dump($colum); 13 // } 14}

【index.php】

lang

1 <!-- このforeachでエラーが出力されます --> 2 <?php foreach ($columns as $column) : ?> 3 <? var_dump($column); ?> 4 <input type="radio" name="lens_name" value="<?php echo h($column['lens_name']); ?>" id="idnumber<?php echo h($idnumber); ?>"> 5 <label for="idnumber<?php echo h($idnumber); ?>"><?php echo h($column['lens_name']); ?></label> 6 <?php $idnumber++; ?> 7 <?php endforeach; ?>

・追記
【test.php】を作成し、1つのファイルにまとめました。

lang

1 2<?php 3ini_set('display_errors', 1); 4 5require 'config.php'; 6 7// DBコネクト 8function connectDb() { 9 try { 10 return new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 11 } catch (PDOException $e) { 12 echo $e->getMessage(); 13 exit; 14 } 15} 16 17// クロスサイトスクリプティング対策 18function h($s) { 19 return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); 20} 21 22 23// DBに登録されている値を取得 24function getColums($table) { 25 $dbh = connectDb(); 26 $columns = array(); 27 $sql = "select * from $table order by created desc"; 28 foreach ($dbh->query($sql) as $row) { 29 $columns[] = $row; 30 } 31 32 //出力される 33 var_dump($columns); 34} 35?> 36 37<!DOCTYPE html> 38<html lang="ja"> 39<head> 40 <meta charset="utf-8"> 41 <title>Image Uploader</title> 42</head> 43<body> 44 <form action="" method="post" enctype="multipart/form-data"> 45 <ul> 46 <li> 47 <?php 48 getColums("post"); 49 $idnumber = 1; 50 // 出力されない 51 var_dump($columns); 52 ?> 53 <?php foreach ($columns as $column) : ?> 54 <input type="radio" name="lens_name" value="<?php echo h($column['lens_name']); ?>" id="idnumber<?php echo h($idnumber); ?>"> 55 <label for="idnumber<?php echo h($idnumber); ?>"><?php echo h($column['lens_name']); ?></label> 56 <?php $idnumber++; ?> 57 <?php endforeach; ?> 58 </li> 59 </ul> 60 </form> 61 62</body> 63</html>

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

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

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

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

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

guest

回答2

0

ベストアンサー

php

1$sql = "select * from $table order by created desc"; 2foreach ($dbh->query($sql) as $row) { 3 array_push($columns, $row); 4}

php

1$sql = "select * from $table order by created desc"; 2foreach ($dbh->query($sql) as $row) { 3 $columns[] = $row; 4}

※とりあえず動く状態にするだけのもので、セキュリティ上のツッコミはしていません。


php

1<?php 2 getColums("post"); 3 $idnumber = 1; 4 // 出力されない 5 var_dump($columns); 6?>

php

1<?php 2 $columns = getColums("post"); 3 $idnumber = 1; 4 // 出力されない 5 var_dump($columns); 6?>

php

1function getColums($table) { 2 $dbh = connectDb(); 3 $columns = array(); 4 $sql = "select * from $table order by created desc"; 5 foreach ($dbh->query($sql) as $row) { 6 $columns[] = $row; 7 } 8 9 //出力される 10 var_dump($columns); 11 12}

php

1function getColums($table) { 2 $dbh = connectDb(); 3 $columns = array(); 4 $sql = "select * from $table order by created desc"; 5 foreach ($dbh->query($sql) as $row) { 6 $columns[] = $row; 7 } 8 9 //出力される 10 var_dump($columns); 11retuen $columns; 12}

投稿2015/11/12 03:31

編集2015/11/12 06:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

junkboy

2015/11/12 04:00

ご回答ありがとうございます、いただいた箇所を変更しても、同様にエラーが出力されました。 関数ではなく、index.phpに問題がありそうな気がしてきました。 ```lang-php <?php getColums(colorcon); $idnumber = 1; ?> <?php foreach ($columns as $column) : ?> <? var_dump($column); ?> <input type="radio" name="lens_name" value="<?php echo h($column['lens_name']); ?>" id="idnumber<?php echo h($idnumber); ?>"> <label for="idnumber<?php echo h($idnumber); ?>"><?php echo h($column['lens_name']); ?></label> <?php $idnumber++; ?> <?php endforeach; ?> ``` セキュリティに関する注意書きありがとうございます、学習サイトなどで勉強しながら作っているので、見えていませんでした。 一通り脆弱性について確認し、注意しているつもりだったのですが、簡単にこのソースに潜んでいる脆弱性を教えていただけると助かります。 概要などについては自分で調べたいと思いますので、SQLインジェクションの可能性があるなど、一言いただけるとありがたいです。脱線した質問で恐縮です。
退会済みユーザー

退会済みユーザー

2015/11/12 04:05

getColums(table); の部分、ちゃんと値渡しているんですよね… 記述のままだと、table は 定数になっているはずですか… getColums('mysql.user'); って渡してごらんなさい。
junkboy

2015/11/12 06:15 編集

`getColums("table_name");` としてみました、単純なミス失礼しました。 関数内で`var_dump($columns);`とすると、取得した値が出力されるのですが、関数を呼び出したあと、`var_dump($columns);`すると、出力されません 。 foreachをつかうと、「Invalid argument supplied for foreach() in」というエラーが出力されます。 質問内容にtest.phpを追記し、ソースをまとめました。同様のエラーが出力されます。お時間ある時で構いませんので、ご確認いただけると幸いです。 セキュリティに関する助言ありがとうございました、ためになります。
junkboy

2015/11/12 06:39

ソースを丁寧に補足いただいて、ありがとうございます。 解決しました。また脆弱性に関しても調べたいと思います。
退会済みユーザー

退会済みユーザー

2015/11/12 06:43

脆弱性については、可能性の話に止まります。現状のソースではあるとはいえません。 ただし、カラム名がHTMLに出力せれている時に、固定で $column['lens_name'] と書かれているのに、テーブル名を外部から与えることに何の意味があるのでしょう。単純に無駄なことだと思います。lens_name というカラムは特定のテーブルにしかないはずですし、もし、複数のテーブルに存在するのだとしたら、単純に正規化ができていないまずい設計だと思います。
junkboy

2015/11/12 08:08

ご丁寧にありがとうございます。 説明を簡単にするために、少し省かせていただいた部分になるのですが、複数のテーブルを使ったDB設計をしております。 他の処理でも同様にgetColums($table)を使い、別のテーブルから取得をする関数として使えれば便利なのではないかと思い、テーブル名を引数として処理ごとに与えて行くようなイメージでした。 また、おっしゃられるように「lens_name」というカラムが、レンズの管理をしているテーブルと、投稿テーブル、2つのテーブルに存在します。 レンズテーブルのIDと同じ値を投稿テーブルで管理し、「lens_name」を引っ張ってくるのが良いのかな、と考えていたのですが、自分の技量を考えた時、難しそうだな、と思いとりあえず2つカラムが存在する状態でスタートしていました。 2つカラムが存在するのは、正規化ができていないということですので、一段落したらDB設計を改めて、ソースを修正していきたいと思います。 独学で勉強していて、初めてのプロジェクトなので、ご指摘頂いていることが、ありがたくためになります。
guest

0

index.php側のソースを見てないので間違っているかもしれないですが、

function.phpgetColumsメソッドで$columnsをreturnし、index.php側でそれを受け取ってViewに渡すようにすればいいのではないでしょうか?

投稿2015/11/12 03:22

k.tada

総合スコア1679

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

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

junkboy

2015/11/12 03:33

迅速な回答ありがとうございます。 教えていただいた通り、returnを追記してみたのですが、index.phpで同様のエラーが出力されました。 【function.php】 // DBに登録されている値を取得 function getColums($table) { $dbh = connectDb(); $columns = array(); $sql = "select * from $table order by created desc"; foreach ($dbh->query($sql) as $row) { array_push($columns, $row); } return $columns; } 【index.php】 <?php getColums(table); $idnumber = 1; ?> <?php foreach ($columns as $column) : ?> <? var_dump($column); ?> <input type="radio" name="lens_name" value="<?php echo h($column['lens_name']); ?>" id="idnumber<?php echo h($idnumber); ?>"> <label for="idnumber<?php echo h($idnumber); ?>"><?php echo h($column['lens_name']); ?></label> <?php $idnumber++; ?> <?php endforeach; ?>
k.tada

2015/11/12 05:42

index.php で getColumns で取得した値を $columns に入れてみてください。 $columns = getColumns(table);
junkboy

2015/11/12 06:38

ありがとうございます、教えていただいた通りの修正で、解決しました。 私の理解度が足らず、意向を汲み取れなかった事が原因でした。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問