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

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

解決済

4回答

2807閲覧

$_POSTで受け取った値をSQL文に挿入して該当するデータを表示させたい。

Mcworter

総合スコア13

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グッド

1クリップ

投稿2018/08/23 09:07

編集2018/08/23 09:19

前提・実現したいこと

フォームでIDを入力し、$_POSTで受け取ったIDをSQL文に挿入して該当するユーザーの名前を表示させたいのですが、
現状、実行すると「あなたの名前は1です。」と表示されてしまいます。

bindvalueでプレースホルダに挿入する時に何らかのエラーが起きているのは何となく想像つくのですが、
原因がいまいち特定できません。

ご教示頂けましたら幸いです。

発生している問題・エラーメッセージ

Notice: Undefined variable: id in C:\xampp\htdocs\test2\sousin.php on line 23

該当のソースコード

PHP

1<?php 2 3// Your code here! 4try{ 5 6 $pdo = new PDO( 7 'mysql:host=127.0.0.1;dbname=test;charset=utf8', 8 "root", 9 "", 10 [ 11 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 12 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 13 ] 14 ); 15 16} catch (PDOException $e){ 17 header('Content-Type: text/plain; charset=utf8', true, 500); 18 exit($e->getMessage()); 19} 20 21 $username_sql = 'SELECT user_name FROM users WHERE id = ?'; 22 $stmt = $pdo -> prepare($username_sql); 23 $stmt -> bindvalue(1,$id,PDO::PARAM_STR); 24 $username = $stmt -> execute(); 25 26echo "あなたの名前は".$username."です。" 27 28?> 29 30<!DOCTYPE html> 31<html> 32<head> 33 <title>Page Title</title> 34<body> 35 <form class="" action="sousin.php" method="post"> 36 <label for="id">ユーザーID:</label> 37 <input type="text" name="id" id="id"> 38 <input type="submit" value="ログイン"> 39 </form> 40</body> 41</html>

試したこと

XAMPのコンソールで「SELECT user_name FROM users WHERE id ="hoge"」と入力した際には
+-----------+
| user_name |
+-----------+
| huga |
+-----------+
と正常に表示されています。

補足情報(FW/ツールのバージョンなど)

XAMPP Version: 7.2.7
PHP Version 7.2.7
10.1.34-MariaDB

###追記!!!!

コピーする際に
「$id = htmlspecialchars($_POST["id"]);」
が抜けてしまいました;;

大変申し訳ないです。

本来のソースコード

PHP

1<?php 2 3// Your code here! 4try{ 5 6 $pdo = new PDO( 7 'mysql:host=127.0.0.1;dbname=test;charset=utf8', 8 "root", 9 "", 10 [ 11 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 12 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 13 ] 14 ); 15 16} catch (PDOException $e){ 17 header('Content-Type: text/plain; charset=utf8', true, 500); 18 exit($e->getMessage()); 19} 20 21 $id = htmlspecialchars($_POST["id"]); 22 23 $username_sql = 'SELECT user_name FROM users WHERE id = ?'; 24 $stmt = $pdo -> prepare($username_sql); 25 $stmt -> bindvalue(1,$id,PDO::PARAM_STR); 26 $username = $stmt -> execute(); 27 28echo "あなたの名前は".$username."です。" 29 30?> 31 32<!DOCTYPE html> 33<html> 34<head> 35 <title>Page Title</title> 36<body> 37 <form class="" action="sousin.php" method="post"> 38 <label for="id">ユーザーID:</label> 39 <input type="text" name="id" id="id"> 40 <input type="submit" value="ログイン"> 41 </form> 42</body> 43</html>

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

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

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

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

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

guest

回答4

0

ベストアンサー

html

1<?php 2ini_set('display_errors', true); 3error_reporting(E_ALL); 4 5function h($string) 6{ 7 return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); 8} 9 10if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') { 11 try { 12 $pdo = new PDO( 13 'mysql:host=127.0.0.1;dbname=test;charset=utf8', "root", "", [ 14 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 15 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 16 ] 17 ); 18 $id = filter_input(INPUT_POST, 'id'); 19 $username_sql = 'SELECT user_name FROM users WHERE id = ?'; 20 $stmt = $pdo->prepare($username_sql); 21 $stmt->bindvalue(1, $id, PDO::PARAM_STR); 22 $stmt->execute(); 23 $row = $stmt->fetch(); 24 25 $user_name = $row['user_name']; 26 } catch (PDOException $e) { 27 header('Content-Type: text/plain; charset=utf8', true, 500); 28 exit($e->getMessage()); 29 } 30// echo "あなたの名前は" . $username . "です。"; 31} 32?> 33<!DOCTYPE html> 34<html> 35 <head> 36 <meta charset="utf-8"> 37 <title>Page Title</title> 38 <body> 39 <?php if (isset($user_name)) : ?> 40 <p><?php echo h($user_name); ?></p> 41 <?php endif; ?> 42 <form class="" action="sousin.php" method="post"> 43 <label for="id">ユーザーID:</label> 44 <input type="text" name="id" id="id"> 45 <input type="submit" value="ログイン"> 46 </form> 47 </body> 48</html>

投稿2018/08/23 09:12

編集2018/08/23 09:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Mcworter

2018/08/23 09:53

ご回答頂きありがとうございます! なるほど、私のコードではexecuteから値を取得しようとしていたので上手くいかなかったのですね。 ご回答頂いたコードを参考に手元の環境で書き直してみたところ無事に値が取得できました! 修正して頂いたコードも全体的にハイクオリティになっており、 不明点以外も含め参考にさせて頂きたいと思います! 今回は非常に勉強になりました。
退会済みユーザー

退会済みユーザー

2018/08/23 09:56

「うまくいかない」とき、teratailより、リファレンスを確認しましょう。 http://php.net/manual/ja/book.pdo.php 聞かれたことに回答するだけのここより、周辺知識を増やすことができるリファレンスを参考に。
guest

0

$id = filter_input( INPUT_POST, 'id' );
とか
$id = $_POST['id'];
などとしないと、フォーム送信データを変数に受信できませんけど。
$_POSTを直接参照するのはよくないので、
filter_input()の使用を推奨です。

$idを宣言せずにコード内で使ってしまうと、
そりゃ 「Notice: Undefined variable」を引き起こしてしまうでしょうね。

投稿2018/08/23 09:09

編集2018/08/23 09:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Mcworter

2018/08/23 09:23

ご回答頂きありがとうございます! 仰る通りで、 「$id = htmlspecialchars($_POST["id"]);」 の部分がコピーする際に飛んでしまいました。 お手数をお掛けして申し訳ありません。
guest

0

$id = htmlspecialchars($_POST["id"]);

これは一番やっちゃいけないやつです
htmlspecialchars()はHTMLに書き出すときに使うもののなので
ユーザーからpostで受け取ったidはそのまま使います
(もちろん置き換えが必要な文字をidに使うとは思えませんが)

SQLでのデータ投入や検索文字は「生データ」をつかってください
そうでない場合はデータの一意性が失われてしまい
想定する正しい検索ができなくなる場合があります。
そもそも変換しないでも支障がないようにするためにわざわざプレースホルダーで
prepare処理をしているのですから

投稿2018/08/23 09:46

yambejp

総合スコア114843

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

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

Mcworter

2018/08/23 10:15

ご回答頂きありがとうございます! 不勉強で申し訳ないです・・・「formから入力されてきた値はとりあえずhtmlspecialchars()を通しておこう」位の認識で使っていました。 参考書やリファレンスを読み返してそれぞれの関数の使い方をもう一度見直そうと思います。大変勉強になりました。
guest

0

PDOのステートメントに対してexecuteした結果の返り値は、成功したか失敗したかのブール値です(PHPマニュアル)。

データ自体は、fetchなどで別途取得する必要があります。

投稿2018/08/23 09:09

maisumakun

総合スコア145184

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

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

maisumakun

2018/08/23 09:11 編集

なお、検索結果が0件でも、検索に成功すればTRUEが返ります。
Mcworter

2018/08/23 09:31

ご回答頂きありがとうございます! なるほど...今回の件はexecuteの戻り値はTRUEなので1が出力されていた訳ですね。 fetchを使って出力できるか試してみたいと思います。 非常に勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問