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

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

ただいまの
回答率

88.64%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,659

junkboy

score 45

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】
// 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);
  }

  // ここで配列が出力されるのは確認済みです。
  // foreach ($columns as $colum) {
  //    var_dump($colum);
  //  }
}

【index.php】
  <!-- このforeachでエラーが出力されます -->
  <?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; ?>

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

<?php
ini_set('display_errors', 1);

require 'config.php';

// DBコネクト
function connectDb() {
    try {
        return new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
    } catch (PDOException $e) {
        echo $e->getMessage();
        exit;
    }
}

// クロスサイトスクリプティング対策
function h($s) {
    return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}


// DBに登録されている値を取得
function getColums($table) {
  $dbh = connectDb();
  $columns = array();
  $sql = "select * from $table order by created desc";
  foreach ($dbh->query($sql) as $row) {
        $columns[] = $row;
  }

  //出力される
  var_dump($columns);
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Image Uploader</title>
</head>
<body>
  <form action="" method="post" enctype="multipart/form-data">
    <ul>
      <li>
        <?php
          getColums("post");
          $idnumber = 1;
          // 出力されない
          var_dump($columns);
         ?>
        <?php foreach ($columns as $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; ?>
      </li>
    </ul>
  </form>

</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

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


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

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

function getColums($table) {
  $dbh = connectDb();
  $columns = array();
  $sql = "select * from $table order by created desc";
  foreach ($dbh->query($sql) as $row) {
        $columns[] = $row;
  }

  //出力される
  var_dump($columns);

}

function getColums($table) {
  $dbh = connectDb();
  $columns = array();
  $sql = "select * from $table order by created desc";
  foreach ($dbh->query($sql) as $row) {
        $columns[] = $row;
  }

  //出力される
  var_dump($columns);
retuen $columns;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/12 15:39

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

    キャンセル

  • 2015/11/12 15:43

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

    キャンセル

  • 2015/11/12 17:08

    ご丁寧にありがとうございます。

    説明を簡単にするために、少し省かせていただいた部分になるのですが、複数のテーブルを使ったDB設計をしております。

    他の処理でも同様にgetColums($table)を使い、別のテーブルから取得をする関数として使えれば便利なのではないかと思い、テーブル名を引数として処理ごとに与えて行くようなイメージでした。

    また、おっしゃられるように「lens_name」というカラムが、レンズの管理をしているテーブルと、投稿テーブル、2つのテーブルに存在します。

    レンズテーブルのIDと同じ値を投稿テーブルで管理し、「lens_name」を引っ張ってくるのが良いのかな、と考えていたのですが、自分の技量を考えた時、難しそうだな、と思いとりあえず2つカラムが存在する状態でスタートしていました。

    2つカラムが存在するのは、正規化ができていないということですので、一段落したらDB設計を改めて、ソースを修正していきたいと思います。

    独学で勉強していて、初めてのプロジェクトなので、ご指摘頂いていることが、ありがたくためになります。

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/12 12: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; ?>

    キャンセル

  • 2015/11/12 14:42

    index.php で getColumns で取得した値を $columns に入れてみてください。

    $columns = getColumns(table);

    キャンセル

  • 2015/11/12 15:38

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

    キャンセル

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

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る