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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

1回答

402閲覧

MySQL 保存された変数に値を代入したい

boooonsai

総合スコア6

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

1グッド

0クリップ

投稿2020/11/04 10:12

編集2020/11/04 11:53

御世話になります。お恥ずかしい質問かと思いますが、対応策が分からず投稿します。

表題の通りですが、phpmyadminを利用し、データ内に

{$name}さん、こんにちは。

と、変数を半角括弧で括った文字列が保存されていたとき、これを呼び出した際に、事前に同名の変数に値を代入しておき、

佐藤さん、こんにちは。

といったように出力したいと考えていますが、どうやっても出力すると

{$name}さん、こんにちは。

と、保存されたデータのまま出力されてしまいます。
単純に、テキストベースで

$name = "佐藤"; $txt = "{$name}さん、こんにちは。"; echo $txt;

このような場合は問題ないのですが・・・

お恥ずかしい質問かと思いますが、どのようにしたら変数に代入した値を出力したら良いうのでしょうか?
アドバイス頂けたら幸いです。

よろしくお願いいたします。

■追記
簡単ですが、再現できるソースを用意しました。

SQL

CREATE TABLE `test` ( `no` int(11) NOT NULL, `str` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test` (`no`, `str`) VALUES (1, '{$name}さん、こんにちは。');

こちらだと問題ない。

$name = "佐藤"; $txt = "{$name}さん、こんにちは。"; echo $txt; //結果:佐藤さん、こんにちは。

対して、上記変数に代入されている文字列がデータベースに保存されていた場合、同じ様な結果を求めようとするが、上手くいかない。

$name = "佐藤"; $query = "SELECT str FROM test WHERE no = 1"; $result = $mysqli->query($query); $row_cnt = $result->num_rows; while ($row = $result->fetch_assoc()) { $str = $row["str"]; } echo $str; //出力結果:{$name}さん、こんにちは。
tanat👍を押しています

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

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

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

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

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

tanat

2020/11/04 11:22

言おうとしていることがなんとなくしかわからないので、実際に問題が起きているコードを追記してください。
boooonsai

2020/11/04 11:54

tanatさん ご親切な書き込みありがとうございます。 只今、質問への追記で簡単ではありますが再現できるソースを記載しました。 アドバイス頂ければ幸いです。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

回答

MySQLや他のリソースから取得した文字列がそのままPHPとして評価されると、注意しないといけないことが増えすぎるので基本的にはただの文字列として評価されます。

そのため、質問中のコード{$name}さん、こんにちは。では変数部分もただの文字列として表示されています。

以下はあまり良くない例です
これを直接解消するには、文字列をPHPとして評価すればいいので、
例えば

PHP

1<?php 2 3$name = "佐藤"; 4 5$query = "SELECT str FROM test WHERE no = 1"; 6$result = $mysqli->query($query); 7$row_cnt = $result->num_rows; 8while ($row = $result->fetch_assoc()) { 9 10 $str = $row["str"]; 11 12} 13 14//DB保存の文字列はPHPとしては不完全なので補完 15eval('echo "'.$str.'";'); 16 17 18

こんな感じでeval()に評価させればPHPとして評価される文字列になります。

ただし、PHPマニュアル eval()
でも

警告
eval() は非常に危険な言語構造です。 というのも、任意の PHP コードを実行できてしまうからです。 これを使うことはおすすめしません。 いろいろ検討した結果どうしても使わざるを得なくなった場合は、細心の注意を払って使いましょう。 ユーザーから受け取ったデータをそのまま渡してはいけません。 渡す前に、適切な検証が必要です。

とある通り、危険で注意すべきことが多い関数なので上記の様なコードはお勧めできません(ほとんどのケースでは書いてはいけないコードに分類されると思います)

例えばDBに格納されるコードが
die();であればPHPが途中で処理終了してしまいますし、
exec('rm -rf ./');であればPHPを実行しているディレクトリ以下のファイルが消えてしまったりします。

別解

自力で単純に変数を当てはめたいのであれば
sprintf()の書式に沿った文字列を格納しておいてsprintf()vsprintf()文字列をはめ込んだり、
独自の書式を作って変数を表現しstr_replace()preg_replace()で置換をかけるのがよくある方法です。

実用まで持っていくのであればPHP テンプレートエンジン 作り方とかで調べてみてください。

別解2

自力で実装したいという欲求がなければ、適当なテンプレートエンジン(PHP テンプレートエンジンで調べてみてください。)
を使うのが確実で且つクオリティの高いものが出来ます。

投稿2020/11/04 12:26

編集2020/11/04 12:55
tanat

総合スコア18727

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

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

boooonsai

2020/11/04 12:37

tanatさん ご親切な回答、誠にありがとうございます。 DBから取得したデータが、「PHPとして評価されない」とははじめて知りました。 追記で再現できるコードを書きながら、「もしかして(変数に与えられた文字列と、DBに保存されている文字列は)見た目同じだが、同様に認識されない?」などと、ふと考えましたが、やはりそうだったのですね。 教えられたリンクを参考に理解を深めたいと思います。 ご親切なアドバイスに感謝します。ありがとうございました!
tanat

2020/11/04 12:47

疑問が解決してよかったです。 実務ではテンプレートエンジンを使うことが殆どですが、自力で実装してみるというのも良い勉強になると思います。
boooonsai

2020/11/04 12:50

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問