PDOStatement::fetchについて

このQ&Aのポイント
  • PHPでMySQLにPDOでデータベース接続をしている際、特定の条件に一致するレコードの値を取得する方法について質問です。
  • 具体的には、SELECT文で指定した条件に一致するレコードの特定のカラムの値を変数に代入するために、どのfetchメソッドを利用すれば良いか知りたいです。
  • また、取得したカラムの値が文字列である場合にも対応しているfetchメソッドの選び方を教えていただけると助かります。
回答を見る
  • ベストアンサー

PDOStatement::fetchについて

現在phpを学習しており、mysqlにPDOでデータベース接続をしています。 前ページからGETで取得した変数A($varA)があり、 SELECT文で「テーブルA(tableA)のカラムA(columnA)の値が取得した変数Aと一致するもの」という検索条件を指定し、 条件に該当するレコードのカラムB(columnB)の値を取得し、変数B($varB)に代入したいのですが、 $sth = $dbh->prepare("SELECT columnB FROM tableA WHERE columnA = :varA"); $sth ->bindParam(':varA',$varA); $sth ->execute(); まではネットで調べて記述できたのですが、 fetchには沢山の種類があるので、 データ変数B($varB)に該当カラムの値を代入する場合にどれを使ったらよいか分かりませんでした。 1つのカラムの値を取り出すにはどのfetchを利用したら良いのでしょうか? ちなみにcolumnBに入っているのは数字ではなく文字列です。 ご回答、よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>fetchには沢山の種類があるので、 マニュアルには「fetchの引数による取得する内容の違いをvar_dumpで確認した例」が載っています。見比べれば理解できるハズです。 RTFM. http://php.net/manual/ja/pdostatement.fetch.php >データ変数B($varB)に該当カラムの値を代入する場合に >どれを使ったらよいか分かりませんでした。 上記マニュアルの例でわかりますが、変数に直接代入するfetchはありません。危険だからです(extractが基本的に「使ってはいけない」のと同じですね) fetchの引数がPDO::FETCH_ASSOCもしくはPDO::FETCH_BOTHであれば「列名」が添え字に使えます。 $row = $sth->fetch(); $varB = $row['columnB']; です。

mmm5orz
質問者

お礼

マニュアルは何度も見たのですが、いまいち理解できず、色々試してはいたのですが値の取得が出来ませんでした。 でも仰られている通りに書いたら値の取得ができました! まずはマニュアルが理解できるレベルになるまで頑張ります!

関連するQ&A

  • Oracle 10g/11での外部結合について

    お世話になります。 開発経験がOracleの9i以降からとまっているのですが、 9i当時、外部結合する際、 SELECT A.ColumnA2, B.ColumnB2, FROM A,B WHERE A.ColumnA1 = B.ColumnB1(+) などと、(+)や(-)で実装できていたと思いますが、 10/11でも同様の記述方法で取得することが可能でしょうか? よろしくお願いいたします。

  • phpでsqlを利用した検索結果表示画面について

    phpで検索結果画面の制作を勉強中です。 pdoでmysqlデータベースに接続しています。 検索フォームに入力されたテキストデータを条件に tableA内をあいまい検索をして 必要項目columnA、columnB、columnCを取得し、 htmlのテーブルの<td></td>に それぞれ$row['columnA']、$row['columnB']、$row['columnC']を入れ、 while($row = $stmt->fetch(PDO::FETCH_ASSOC)で繰り返すことで テーブル一行ごとに取得できたデータを1つ記載して結果として表示するプログラムを書き、うまく稼働させることができました。 問題は、今度はtableB内で、tableAで取得したcolumnAとtableBのcolumnDの値が同じという条件のもと、 該当レコードのcolumnE、columnFを取得して、 検索結果のテーブルに、tableAの取得データと同じ行で データを表示させたいという点です。 単純に、上記のうまく稼動したテーブル内の <td></td>内に $stmtb=$db->prepare('SELECT columnE,columnF FROM tableB WHERE columnD :columnA'); $stmtb->bindValue(':columnA',$row['columnA'],PDO::PARAM_STR); $stmtb->execute(); $row_b = $stmtb->fetch(PDO::FETCH_ASSOC); print htmlspecialchars($row_b['columnD']); というプログラムを記述しましたが、 テーブル上にデータが表示されませんでした。 どのようにしたら同一テーブル行内で別テーブルの該当データを表示することができるのでしょうか? イメージが伝わりづらいかと思いますので以下、テーブルとカラムに名称を付けて、 表示したいテーブルのイメージとデータベーステーブルのイメージの画像を添付します。 添付画像の 顧客No.・顧客名・住所のデータが顧客情報用のテーブルに格納されていて 顧客No.・購入品・購入日のデータが購入品ログ用のテーブルに格納されている 状態で、 顧客No.と照合した購入品ログ用テーブル内の購入品のデータと購入日のデータを 添付画像のように、同じテーブルの行で表示をさせたいです。 ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • pdoでバインドしない場合のデメリット

    $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); $sth->execute(); 上記ではなく $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->execute(array($calories,$colour)); のようにbindParamやbindValueを使わない場合は危険はあるのでしょうか? ご教示頂けますと幸いです。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • mysql_fetch_array結果の配列化

    【ご質問】 あるselect文を実行し、mysql_fetch_arrayで取得した結果を配列したいのですが、どのようにしたら実現できるでしょうか? 【例】 select文の結果で3レコードヒットした場合、 カラム1 カラム2 カラム3 a b c d e f g h i a⇒カラム1[1]、b⇒カラム2[1]、c⇒カラム3[1] d⇒カラム1[2]、e⇒カラム2[2]、f⇒カラム3[2] g⇒カラム1[3]、h⇒カラム2[3]、i⇒カラム3[3]      と配列化したいのです。 ご教授宜しくお願いいたします。

  • ASPでの日付の取得について

    ASPにてシステム日付の3日前の日付を取得したいのですが、 下記のようにすると変数varAに 38735 という数字が入ってきます。 システム日付の1日後のvarBには 2006/01/22 と入るのですが、 x日前の日付の取得はどうすればよろしいのでしょうか? varA =DateDiff("d", 3, date) varB =DateAdd("d", 1, date)

  • ○LinuxでのPDO利用

    ○LinuxでのPDO利用 PHPで次のようなコードを記述しています。 ------------------------------------------------------------- $db = 'mysql:host=localhost;dbname=dbn'; $login = 'user'; $password = 'pass'; try { $pdo = new PDO($db , $login, $password); $sth = $pdo->prepare("SELECT * FROM USER WHERE NAME=? AND PASSWORD=?"); $sth->bindParam(1, $name); $sth->bindParam(2, $password); $sth->execute(); while($row = $sth->fetch(PDO::FETCH_ASSOC)){ $user[] = $row; } }catch(PDOException $e){ var_dump($e); } ------------------------------------------------------------- このコードがWindowsでxampp上で動かすと問題ないんですが、 Linux上で動かすと$sth->execute();でfalseが返ってきて、 値を取得できません。 設定の問題だと思うのですが、 どこにその問題があるのかが分かりません。 環境は CentOS apache 2.0 php 5.3 mysql 5.1 PDO driver,pdo_mysqlもphpinfo()から確認できてます。 php.iniにも extension=pdo.so extension=pdo_mysql.so の記述はあります。 どなたか分かる方、宜しくお願いします。

    • ベストアンサー
    • PHP
  • ハッシュのキー追加について

    とある既存プログラムに機能追加したいのですが上手くいきません。 ハッシュだとは思うのですが、%だったり$だったりしてよくわからなくなってしまいました。 どこがおかしいか教えていただけないでしょうか。 <概要> もともとあった(1)と(3)の処理の間に、(2)を行う <ソース> (1)DBから1レコードを取得する $sql = "select * from tenpo where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); $shop = $sth->fetchrow_hashref(); (2)別TABLEから値を取得し、(1)に追加する $sql = "select todoufuken from area where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); @todoufuken= $sth->fetchrow_array; $shop{place} = $todoufuken[0]; (3)$shopの情報をサブルーチンに渡す ソース略

    • ベストアンサー
    • Perl
  • DBIを使ってSelect文 複数のカラム、複数のレコードを取得するには?

    Perl DBIを使用してDB検索する部分で質問させてください。 検索してきた複数のレコードの中のカラムを全て取得したいのですが うまくできません。 テーブルAAAに フィールドa,b,cがあり、レコードが3つ入っているとします。 テーブルAAA a b c ------ 1 2 3 4 5 6 7 7 7 $sqlState= "select a,b,c from AAA"; $sth= $dbh->prepare($sqlState); $sth->execute; @row = $sth->fetchrow_array; foreach (@row){ ($a,$b,$c,)= @row; print $a; print $b; print $c; } このようなコードでいいのかと思うのですが 出力結果は111 222 333 となってしまってまるで期待通りの結果にはなりませんでした。 上記の例では 123 456 777 という出力結果を望むとすると、どのように記述すればよろしいのでしょうか?

  • perl+mysqlで変数が使えなくて困ってます。

    use DBI; $id=1; $nm="gootarou"; $mm="friend"; $user = '***'; $passwd = '***'; $db = 'DBI:mysql:***'; $dbh = DBI->connect($db, $user, $passwd); $sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); $sth -> execute; $sth -> finish; $dbh -> disconnect; exit; mysqlの勉強を始めたところでいきなり壁にぶちあたってしまいました^^; googleその他で検索かけてみましたが解決に至りませんでしたので 質問させてください。 >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); ↑ここの部分を >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ('1','gootarou','friend')"); と直接入力してやれば問題なく登録されるのですが、変数を使うと正常に処理がされません。 数字を変数に代入したものは大丈夫なのですが 英字や二バイト文字を変数に代入したものが問題あるようです。 それぞれのフォームの型はvarchar(100)で設定しています。 ループで一括処理したいのですが変数が使えないことには・・と困ってます。 よろしくお願いします。

  • DBIを使ってSelect文 複数のカラム、複数のレコードを取得するには?

    Perl DBIを使用してDB検索する部分で質問させてください。 検索してきた複数のレコードの中のカラムを全て取得して そのパラメータを一括で返して 別処理で展開させたいのですがうまくいきません。 テーブルAAAに フィールドa,b,cがあり、レコードが3つ入っているとします。 テーブルAAA a b c ------ 1 2 3 4 5 6 7 7 7 sub AAA(){ $sqlState= "select a,b,c from AAA"; $sth= $dbh->prepare($sqlState); $sth->execute; while (@row = $sth->fetchrow) { ($a,$b,$c)= @row; } return @row; } とやれば、whileの中ではそれぞれのレコードが取得できるのですが それをsub AAAを呼び出した側で 一度に受け取り、それを再び 1レコードづつ取り扱いたいのです。 イメージは @row = &AAA(); foreach(@row){ ($a,$b,$c)=@row print $a... } とやると、全てのレコードが、foreach内で取得できる ・・・ような感じです。 わかりにくい説明で申し訳ないですが、 どうぞよろしくお願い致します。

専門家に質問してみよう