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

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

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

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

Q&A

2回答

1845閲覧

php select whereについて

nejico

総合スコア49

PHP

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

0グッド

2クリップ

投稿2015/04/21 08:13

編集2022/01/12 10:55

facebookログインで取得した【id】【last_name】【first_name】をデータベースに格納したいです。

その際、データベースに登録済みだったら格納しないようにしたいです。

カラム【user_id】にfacebookログインで取得した【id】があるかどうかで登録するかしないかの判定にしたいのですが、できませんでした。

実際に書いたのは以下のコードになります。

lang

1<?php 2require_once('../src/facebook.php'); 3 4$config = array( 5 'appId' => '*****', 6 'secret' => '*****' 7); 8 9$facebook = new Facebook($config); 10 11//ログイン済みの場合はユーザー情報を取得 12if ($facebook->getUser()) { 13 try { 14 $user = $facebook->api('/me', 'GET'); 15 $_SESSION["user_id"] = $user["id"]; 16 $_SESSION["last_name"] = $user["last_name"]; 17 $_SESSION["first_name"] = $user["first_name"]; 18 } catch (FacebookApiException $e) { 19 //取得に失敗したら例外をキャッチしてエラーログに出力 20 error_log($e->getType()); 21 error_log($e->getMessage()); 22 } 23 24 25 26 $serv = "127.0.0.1"; //サーバ 27 $user = "root"; //ユーザー名 28 $pass = ""; //パスワード 29 $db = "test"; //データベース名 30 $table1 = "user2_1"; 31 $user_id = $_SESSION["user_id"]; 32 33 try { 34 $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 35 $pdo = new PDO('mysql:host=' . $serv . ';dbname=' . $db . ';charset=utf8', $user, $pass, $options); 36 37 $select_sql = "select * from user2_1 where user_id = :user_id"; 38 $stmt = $pdo->prepare($select_sql); 39 $stmt->execute(array(":user_id" => $user_id)); 40 $row = $stmt->fetch(); 41 42 print_r($row->user_id); 43 if (isset($row->user_id)) { 44 45 } else { 46 $insert_sql = "insert into " . $table1 . "(" 47 . "user_id," 48 . "last_name," 49 . "first_name" 50 . ")values(" 51 . ":user_id," 52 . ":last_name," 53 . ":first_name" 54 . ")"; 55 56 $stmt = $pdo->prepare($insert_sql); 57 58 $stmt->bindValue(":user_id", $_SESSION["user_id"]); 59 $stmt->bindValue(":last_name", $_SESSION["last_name"]); 60 $stmt->bindValue(":first_name", $_SESSION["first_name"]); 61 62 $stmt->execute(); 63 } 64 } catch (Exception $ex) { 65 66 } 67} 68 69 70$pdo = NULL; 71?>

テーブルは

lang

1create table `user2_1`( 2 id int(11) primary key not null auto_increment, 3 `user_id` VARCHAR(10)character set utf8 not null comment 'Facebook_ID', 4 `last_name` VARCHAR(10)character set utf8 not null comment 'last_name', 5 `first_name` VARCHAR(10)character set utf8 not null comment 'first_name', 6 `date` timestamp not null comment '更新日時' 7 )

よろしくお願いします!

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

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

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

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

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

guest

回答2

0

$select_sql = "select * from user2_1 where user_id = :user_id"; $stmt = $pdo->prepare($select_sql); $stmt->execute(array(":user_id" => $user_id)); $row = $stmt->fetch(); print_r($row->user_id); if (isset($row->user_id)) { }

冷静に考えてみると分かるのですが、フェッチの結果は配列でしょう。
何故ならSELECT文は条件に該当した結果を全て返すからです。
たとえ1件しか見つからなかったとしても、配列で返るはずです。

ですから、

$row->user_id

は未定義変数ということになりnullとして扱われます、print_r($row->user_id);ではWarningが発生します。

このため、

if (isset($row->user_id)) {

では偽となり、登録されていないという扱いになります。

print_r($row);

で確認してみてください。
ですから$row[0]->user_idが正しいかと思われます。
もっと適切にいうと、

$rows = $stmt->fetch();

ですね。

投稿2015/04/21 09:51

編集2015/04/21 10:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nejico

2015/04/22 01:14

この部分の ``` $select_sql = "select * from user2_1 where user_id = :user_id"; $stmt = $pdo->prepare($select_sql); $stmt->execute(array(":user_id" => $user_id)); $row = $stmt->fetch(); print_r($row->user_id); if (isset($row->user_id)) { } ``` 正しい書き方を教えていただけますか?
guest

0

まずはfacebookログインで取得した【id】がきちんと取得できているかどうかの確認から始めたらどうでしょう?

投稿2015/04/21 09:32

orange0190

総合スコア1698

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

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

orange0190

2015/04/21 09:41

あと、なぜできないと判断しているかも書いた方がよろしいと思います。
nejico

2015/04/22 01:36

facebookログインで取得した【id】は取得できています。 $select_sql = "select * from ".$table1." where user_id = :user_id"; $stmt = $pdo->prepare($select_sql); $stmt->execute(array(":user_id" => $user_id)); $row = $stmt->fetch(); if (isset($row->user_id)) { } else { } この辺の書き方が間違っていると思うのですが、どこをどう間違っているのか調べてもわからない感じです。
orange0190

2015/04/22 02:02

$stmt->fetch()はデフォルトでは結果セットに返された際のカラム名と 0 で始まるカラム番号で添字を付けた配列を返します。 ですので、今回は次のような形で$rowに配列が入っていると思います。 Array ( [user_id] => id [0] => id [last_name] => last_name [1] => last_name [first_name] => first_name [2] => first_name [date] => date [3] => date ) したがって、 if (isset($row->user_id)) { } else { } という箇所を if (isset($row[0])) { } else { } もしくは if (isset($row['user_id'])) { } else { } と直せば、良いと思います。
orange0190

2015/04/22 02:20

その他には $row = $stmt->fetch(); を $row = $stmt->fetch(PDO::FETCH_OBJ); と直しても、できるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問