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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

3498閲覧

PHPのPDOの記述に起因すると思われるエラーが解消しません

shinya.g

総合スコア14

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クリップ

投稿2016/10/24 06:05

###前提・実現したいこと
フォームから取得したidから、データベースに登録されているデータを配列で取得したい。

###発生している問題・エラーメッセージ
while ($row = $rs->fetch(PDO::FETCH_ASSOC)) {を記載した行でエラーになってしまっております。
PHP Warning: Invalid argument supplied for foreach() in /Applications/MAMP/htdocs/model/login_check.php
PHP Fatal error: Call to a member function fetch() on a non-object in /Applications/MAMP/htdocs/model/login_check.php
上記エラーが起こる原因を突き止めて、データを取得したい。

###該当のソースコード

<?php require_once ("../function/dbconect.php"); session_start(); header("Content-type: text/html; charset=utf-8"); //パラメーターの取得 $id = $_POST['id']; $password = $_POST['password']; print("$id<br>"); print("$password<br>"); //DB接続 try{ $dbh = new PDO($dsn, $dbuser, $dbpassword); print('接続に成功しました。<br>'); $sql = 'select * from USERS WHERE ID = ?'; //パラメーターの型を指定 $stmt = $dbh->prepare($sql, array('text')); //パラメーターを渡して SQL 実行 $rs = $stmt->execute(array($id)); $count = 0; while ($row = $rs->fetch(PDO::FETCH_ASSOC)) { $id = $row["id"]; $salt = $row["salt"]; $db_password = $row["password"]; $reset = $row["reset"]; $count++; } }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } $dbh = null; ?>

###試したこと
・下記ソースに変更してデータが取得できているかの確認>>okでした。
・様々な初心者向けのPDOなどについて記載されている記事を読んで、細かくソースを色々いじってみたのですが、解決しませんでした(変更したソースを記録してなかったため、細かい内容を覚えておりません、申し訳ありません)

<?php require_once ("../function/dbconect.php"); session_start(); header("Content-type: text/html; charset=utf-8"); //パラメーターの取得 $id = $_POST['id']; $password = $_POST['password']; print("$id<br>"); print("$password<br>"); //DB接続 try{ $dbh = new PDO($dsn, $dbuser, $dbpassword); print('接続に成功しました。<br>'); $sql = 'select * from USERS WHERE ID = 1'; foreach ($dbh->query($sql) as $row) { print($row['ID'].'<br>'); print($row['SALT'].'<br>'); } }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } $dbh = null; ?>

###補足情報(言語/FW/ツール等のバージョンなど)
php,mysql初心者です。
php/mysqlを使ってログイン機能を作ろうとしております。
参考にしているサイト:https://www.websec-room.com/2015/03/15/2153
かなりの初心者のため上記サイトに提示されているソースを見ながら、分からないところがあれば、都度進めながら進めています。
開発環境
・MAMP
・php5.5.38
・mysql5.6.28

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

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

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

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

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

guest

回答2

0

ベストアンサー

php

1$rs = $stmt->execute(array($id)); 2

の$rs はbool型の為、成功失敗を判断

php

1if($rs) 2{ 3 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 4 } 5}

fetchの定義は
PDOStatement::fetch
ですので、PDOStatementオブジェクトのメソッドとして実行しないといけない為エラーになっているものと思われます

投稿2016/10/24 06:42

hiim

総合スコア1689

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

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

shinya.g

2016/10/24 07:26

早い回答ありがとうございます。 コメントを読んだだけでは、まだ何となくしか理解できておりませんが(私の知識不足のため)、頂いた内容を元に調べてトライしてみます。 ありがとうございます。
shinya.g

2016/10/24 08:42

頂いた指摘を修正して、その他の凡ミス(記載してなかったDBの設定など)を修正したら、無事に解決しました。 ありがとうございます。 ただ、完全に理解していないところもあるので、色々調べてみます。 本当にありがとうございました!
guest

0

$stmt->executeの戻り値はbooleanです。resultsetではありません。
以下のように$stmt->fetchとすると動くと思いますよ。

php

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

投稿2016/10/24 06:51

popobot

総合スコア6586

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

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

popobot

2016/10/24 06:53

ああ、かぶった....。
shinya.g

2016/10/24 07:26

コメントありがとうございます。 頂いた内容を元に試行錯誤してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問