• ベストアンサー

データベースの中にあるソースコードを実行させたい

こんにちは。php初心者です。 データベースの中にphpコードを保存して、それをphpで呼び出して中のソースを実行させたいのですがphpコードがそのまま表示されてしまいます。何か良い方法はありますでしょうか? ●データベースの中身 [ID] 0 [contents] $test="テスト"; ●ソース <?php $db = mysql_connect('localhost','root'); mysql_select_db('hoge',$db); $id = mysql_escape_string(0); $sql = "select * from contents where ID = '$id';"; $contents = mysql_query($sql,$db); mb_http_output ( 'UTF-8' ); $aryCol=mysql_fetch_assoc($contents); $a = $aryCol['contents']; echo $a; echo $test; ?> ●実行結果 $test="テスト"; ●開発環境 Apache2.0.59 PHP4.3.2 MySQL4.0.26 と、いうような感じです。実行結果は「テスト」という文字のみ表示させたいのですが、$aに入っているソースコードがそのまま表示されてしまい、$testには何も入っていないままです。 このような処理は不可能なのでしょうか?またデータベースに入っているソースコードの処理を行いたい場合、どのような処理をすればよろしいでしょうか? 私では経験不足なため皆様のお知恵を拝借できればと思い質問させていただきました。くだらない質問で大変恐縮ですがご回答のほうよろしくお願いいたします。

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

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

  • ベストアンサー
  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

eval ― 文字列を PHP コードとして評価する という関数がありますが、取り扱いには注意した方がいいと思います。 eval($a); echo $test;

参考URL:
http://jp.php.net/manual/ja/function.eval.php
yore917
質問者

お礼

バッチリ表示されました!本当にありがとうございました!

その他の回答 (2)

  • cdsdasds
  • ベストアンサー率52% (114/217)
回答No.3

>このことは知りませんでした。処理的には変わらないと思っていましたので目から鱗がでるような情報です!もしよければ望ましい理由を詳しく説明されているサイトか書物をご紹介願えませんでしょうか? No.1の回答者が述べておられるように、質問者のやりたいことをファイルではなく、データベースでやろうとするとeval()関数を使用することになります。 No.1の回答者が述べておられるように、eval()関数の利用は取り扱いに注意が必要で、一般的にこの関数をコーディングで用いる際にはセキュリティ的に問題があることが多く、しばしばこの関数を用いずに適切にコーディングした場合より遅いです。これはパースと、変数領域から実行領域へのコード移動というか挿入のオーバーヘッドがばかにならないからです。 質問者の場合は、PHPファイルを読み込む場合に比べて、データベースのレスポンスが十分早いかという問題もあるように思います。チューニング可能な問題ではありますが。 例えば http://ja.wikipedia.org/wiki/Eval に一般的な問題が指摘されています。 セキュリティ的に質問者の場合について怖いと思うのは、eval()で評価されるコード自体が想定外のものとなる可能性を排除できないように思うからです。SQLインジェクションに対する対応は通常のPHPプログラムよりしっかり行う必要があるでしょう。このような対応は往々にしてコードの実行速度を低下させます。 http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole01.html まあ、このような話はエンジニアの感性がどうしても入ってくるところですから、一般的な話以外については最終的にはご自身でということになりますが。

yore917
質問者

お礼

なるほど!わかりやすく説明していただき本当にありがとうございました! >eval()で評価されるコード自体が想定外のものとなる可能性 については特に納得でした。「SQLインジェクションに対する対応」することによって処理が遅くなるのも納得です。今回はファイル数が多いので正規表現で最低限のチェックはしておきつつデータベースを使おうと思います。以後eval()を使う機会があれば気をつけたいと思います! 忙しい中ご教授頂き誠にありがとうございました!

  • cdsdasds
  • ベストアンサー率52% (114/217)
回答No.2

そもそも何で、データベースから返ってくる文字列の実行をしないといけないのでしょう。 常識的に考えて、 データベースのデータはローカルファイルに比べて 1.自分のマシンの権限とは別の存在である可能性がある(高い) 2.コードが汚染される危険性がローカルファイルより高い ということからセキュリティ上の観点から、あるいはスケーラビリティや移植性の観点からデータベースから返される文字列をそのままPHPが解釈することは意味がないと思われます。 また、データベースから帰ってくる文字列はJDBC等を介して、変数領域に書き込まれますが、この領域はセキュリティ上実行コードが書かれる領域とは区別されています。 よって仕組み上からも実行はすぐにはできません。 あえて行うなら、 データベースから文字列取得→取得した文字列をシステムコマンドで特定のPHPファイルに書き込む→そのPHPファイルを呼び出すということになるでしょう。 そんなことをする位なら、データベースのコードを全て事前にファイルにして、データベースにはコードではなく、ファイル名を入れておき、データベースから返ってくるPHPファイル名を呼び出すという方がセキュリティ的にも実行速度上も望ましいように思います。 もう一度なぜコードをデータベースから持ってくる必要があるのかご検討ください。

yore917
質問者

お礼

返信とご忠告ありがとうございます!ここまでの過程は話すと長くなるのですが簡単にまとめると、星の数ほどある「必要かつ不一致なPHPのソースコード」を複数の箇所で使用するため、それぞれ別々のファイルに保存する必要があったのです。開発者側のみの考えなのですが、ファイルとして保存するよりデータベースを使用するほうが見た目もスッキリする上に変更も容易になるためデータベースを使用しました。一言で言うと無駄な処理を省くための使用です。 >そんなことをする位なら、データベースのコードを全て事前にファイルにして、データベースにはコードではなく、ファイル名を入れておき、デ>ータベースから返ってくるPHPファイル名を呼び出すという方がセキュリティ的にも実行速度上も望ましいように思います。 このことは知りませんでした。処理的には変わらないと思っていましたので目から鱗がでるような情報です!もしよければ望ましい理由を詳しく説明されているサイトか書物をご紹介願えませんでしょうか? 頼ってばかりで本当に申し訳ないのですが、よろしくお願いいたします。

関連するQ&A

  • Mysql UPDATE出来ません

    PHP+MySQLでホームページ開発中ですが、MySQLで特定idのフィールドの更新処理(UPDATE)が出来ません。初心者です宜しくお願いします。 【Mysqlで確認した点】 (1)XAMPP・MyAdminからは以下のSQL文で問題なく更新できる。 "UPDATE upload_list SET rem='ABCDEF' WHERE id=15;" 【問題は?】 以下のphpからは更新できません。 【phpで確認した点は?】 (1)DBへ正常に接続してる。 (2)文字コードも正常にSETしてる。 (3)UPDATE実行後の$RESULT(返り値)がない。 (4)PHPを実行後、MyAdminでDBを確認しても更新されていない。 【phpコード】 <?php //データベースパラメータ定義 $DBSERVER="localhost"; $DBUSER="root"; $DBPASSWORD=""; $DBNAME="up_load"; $DATANAME="upload_list"; //Mysqlに接続 if(mysql_connect($DBSERVER,$DBUSER,$DBPASSWORD)) {echo "DB接続済/";} else {echo "<h2>データベースに接続できません</h2>";die();} //Mysql停止 //データベースを選定 mysql_select_db($DBNAME); //Mysqlの文字セットを定義 $sql = "SET NAMES ujis;"; $result = mysql_query($sql); if ($result==true){echo "文字コードSET済/";} //更新id、rem(更新記事)をSET $id=15; $new_rem="ABCDEF"; echo $DATANAME."/".$id."/".$new_rem."/"; //Mysql更新処理 $result=mysql_query('UPDATE $DATANAME SET rem=$new_rem WHERE id=$id;'); if ($result==true){echo "更新!";} else {echo "更新出来ず";} //XAMMP phpMyAdminからは以下のSQL文で更新できた。 //UPDATE upload_list SET rem='ABCDEF' WHERE id=15; ?> 【実行後のブラウザ表示】 DB接続済/文字コードSET済/upload_list/15/ABCDEF/更新出来ず

    • ベストアンサー
    • MySQL
  • PHPからMySQLのデータベースが作成できない

    PHP:4.4.4 MySQL:4.1.21 です。 PHPからデータベースを作りたいのですがうまくいきません。 以下のように記述しています。 $sql = "CREATE DATABASE ".$DBNAME; $rst = mysql_query($sql,$con); $DBNAMEには作りたいデータベースの名前が入っています。また、$conにはIDが入っており接続はできているようです。しかしこの後で$rstをechoするとTRUEでもFALSEでもなく、何も入っていない状態です。 これはどうすればデータベースをcreateできるのでしょうか? 非推奨のようですがmysql_create_dbを使ってたところ画面が真っ白になってしまいました。

    • 締切済み
    • PHP
  • インクルードによる不具合

    PHP初心者です。 以下2つのファイルを使って簡単な接続テストを行ってから徐々に 目的のものを作り上げていこうとしたのですが、どうにもうまく動作しません。(2つは同一ディレクトリにある) ・「mysql.php」:DB接続とSQLの発行 ・「test.php」:ブラウザ出力(本体:mysql.php呼び出し元) 実行すると「*** DB/SQLテスト ***」のみブラウザに出力されるため、試しに「mysql.php」で行うDB接続とSQL発行をすべてtest.phpに直接書いてインクルードせず単体で実行したところ、目的の結果が表示されました。 なので問題はインクルード文にあるのだと思うのですが検討がつきません。 どなたかお力をお貸し下さい。 ちなみに以下のコードは参考にしたテキストの例題をもとに見やすくするため余分な処理やエラー処理などを省いたものです。 ■mysql.php <?php class MySQL{ var $m_con; var $m_rows = 0; function MySQL(){ $this->m_con = mysql_connect("ホスト名", "ユーザ名", "パスワード"); mysql_select_db("データベース名", $this->m_con); } function query($sql){ $this->m_rows = mysql_query($sql, $this->m_con); return $this->m_rows; } } ?> ■test.php <html> <head> <meta http-equive="Content-type" content="text/html; charset=utf-8"> <title>SQLtest</title> </head> <body> *** DB/SQLテスト ***<br> <?php include("mysql.php"); $mysql = new MySQL; $sql = "SELECT * FROM staff"; $mysql->query($sql); while($row = mysql_fetch_array($this->m_rows)){ echo $row["id"]; echo $row["name"]; echo "<br>"; } ?> </body> </html>

    • ベストアンサー
    • PHP
  • 外部ファイルでクエリを実行したい

    「クエリを実行している間にローディング画像を表示する」という処理をしたいです。 外部ファイルの[load.php]内で「データベース接続→mysql_queryを実行する」という処理を 行い、[index.php]で結果を表示したいのですが、うまくいきません。 ※load.phpの中身をindex.php内に書いた場合は成功する ※load.phpの読み込み自体はできている。 [index.php] <script type="text/javascript"> $(function(){ $("#sample").load("load.php"); }) </script> <div id=sample> <div id="loader"><img src="edit/img/loader.gif" width="24" height="24" alt="Loading..." /></div> <?php echo $num; ?> </div> [load.php] <?php $conn = mysql_connect("localhost","DB","pass",true); mysql_query("SET NAMES utf8") or die("can not SET NAMES utf8"); mysql_select_db('DB',$conn); $sql = "SELECT ~" $result = mysql_query($sql) or die(mysql_error()); $num = mysql_num_rows($result); ?>

    • ベストアンサー
    • PHP
  • selectであるデータを検索した結果のリターンコードを取得するには?

    以下のようなコードをPHP内で実行しています。 以下の例は、MySQLテーブル'test_tbl'の'id'というフィールド内に'500'というデータが存在した場合、そのデータを取り出してecho文で表示させるようにしたものです。 検索した結果データが存在しなかった場合、データが存在していないということを、リターンコードで判断したいと思っています。 リターンコードはどうやって見ることができますか? '$rs'にリターンコードが入ってくるのでしょうか? ('Resource id #3'のような値が返ってくるようですが) リターンコードとその意味の一覧とかが、どこかのサイトにあればURLを教えていただければ助かります。 よろしくお願い致します。 ------------------------------------------------ <?php  if( ! $conn = mysql_connect( 'localhost', 'user_id', 'password') ){   die( 'MySQL接続失敗' );  }  mysql_select_db( 'test_db', $conn );  $rs = mysql_query("SELECT id FROM test_tbl WHERE id = 500", $conn);  $rec = mysql_fetch_array( $rs, MYSQL_ASSOC );  echo $rec['id'];  mysql_free_result( $rs );  mysql_close($conn); ?>

  • データーベースのすべての画像を取り出したい

    データーベースのテーブル内の画像をすべて取り出すプログラムを書いています。 データベース(Mysql)には画像が4列(4個)存在しますがプログラムの書き方が悪いと思うのですが、1つしか画像を取り出すことができません。 すべて取り出すにはどこを直せばよいでしょうか? 書いたソースは以下になります。 たぶん$img_db=$row["img_data"]; echo $img_db;が原因のような気がしますが分かりません。 詳しい方教えてください。 <display.php>(データーベースから読み込みようphp) <?php $conn=mysql_connect("localhost","root",""); mysql_select_db("practice"); $result = mysql_query("select img_data from sample "); while($row= mysql_fetch_array($result)){ $img_db=$row["img_data"]; echo $img_db; } ?> <output.php>(ブラウザ表示用php) <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8”> <title>画像表示</title> </head> <body> <p>MySQLのBLOBにバイナリで格納した画像を表示してみます。</p> <?php echo "<img src=\"display.php?$img_db\">" ?> </body> </html>

    • ベストアンサー
    • PHP
  • phpのデータベースを使用したsqlのエラー

    すみません、PHPでデータベースを読み込み、SQLにて処理するプログラムを作成しているのですが、 再びエラーで止まってしまいまして、困っています。 データベースへのアクセスはできたようなのですが、SQLの処理の部分がエラーになっているのだと思われます。 --------------結果表示-------------- Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\site\search_criteria.php on line 70 @ エラー番号 : 1064メッセージ : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'aaa,bbb,ccc FROM `test_table`' at line 1 @ ------------------------- -----------ソース------------- <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>-サイト -検索条件入力ページ-</title> </head> <body> <p>検索条件を入力してください</p><br> <?php # 変数定義関連 # mysqliの定義 global $mysqli; $mysqli = new mysqli('localhost', 'root', "", "****_db"); $link = mysql_connect('localhost', 'root', "", "****_db"); header("Content-type: text/html; charset=shift-jis"); // 文字化け防止 /* 文字セットを utf8 に変更します */ if (!$mysqli->set_charset("utf8")) { printf("処理1:文字コードのセットに失敗しました。: %s\n", $mysqli->error); } else { printf("処理1:文字コードセット-> %s\n", $mysqli->character_set_name()); } printf("<BR><BR>"); #配列定義 $job_name = array("配列定義"); $data = $_GET["job_opening_type"]; //データベースへの接続 if (!$link) { die("処理2:データベースへの接続失敗です。<BR>".mysql_error()); }else{ print("処理2:データベースへの接続成功!<BR><BR>"); } //データベースを選択 if (!mysql_select_db("****_db",$link)){ echo "処理3:データベース選択失敗<BR><BR>"; exit; }else{ echo "処理3:データベースの選択成功です。<BR><BR>"; } $query = file_get_contents("create.sql"); printf("処理4:クエリ->%s",$query); //SELECT文を実行 if($res = mysql_query($query,$link)){ echo "<BR>mysql_query失敗<BR>"; }else{ echo "<BR>mysql_query成功<BR>"; } //検索した結果を全部表示 line 70辺り→while($row = mysql_fetch_array($res,MYSQL_BOTH)){ echo "****=".$row["****"]; echo "****=".$row["****"]; echo "<BR>"; } echo "<BR>@<BR>エラー番号 : " . mysql_errno() . "メッセージ : " . mysql_error() ."<BR>@"; //データベースから切断 $mysqli->close(); echo "<BR><BR>処理5:データベースを切断しました。<BR>"; ?> <br> --------------------------------------------------<br> 最終更新日時<br> <p>&nbsp;</p> </body> </html> 内部のプログラムではなく、外部から読んでいるSQLの問題なのでしょうか? 外部にcreate.sqlというテキストを作成し、 SELECT aaa,bbb,ccc FROM `test_table` としています。 色々試しているのですが、うまくいきません、解決方法を教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • mysql_query文字コード変換について教えてください。

    PHP+MySQLで開発を行っておりますが、次の問題でつまずいて 先に進めず困っております。 お助け下さい 環境 Server : Windows2003Server PHP : 4.4.1 MySql : 4.0 <<<<< PHPソース >>>>>>>>>>>>>>> // MySQLに接続 if (!($cn = mysql_connect("localhost","userXXX","PassXXX"))) { die('接続できませんでした: ' . mysql_error()); } // MySQLのクライアントの文字コードをsjisに設定 mysql_query("SET NAMES 'sjis'") or die("can not SET NAMES sjis"); // MySQL DB 選択 if (!(mysql_select_db("dbXXX"))) { die('データベースが見つかりません.'); } // MySQL 問い合わせ $sql = "SELECT * FROM test"; if (!($rs = mysql_query($sql))) { die('セレクトに失敗しました.');       ・       ・       ・ <<<<< PHPソース >>>>>>>>>>>>>>> 上記の環境でソースを実行すると、「can not SET NAMES sjis」の メッセージでエラーとなります。 この関数をとると処理は最後まで正常終了するのですが、 表示される漢字は、文字化けしています。 ちなみにMySQLの5.0環境で実行すると問題なく変換されて正しく 表示されます。 MySQLの4.0環境では mysql_query("SET NAMES 'sjis'") の 関数は使えないのでしょうか? もし使えないとするならば、何か変わりの方法があると良いのですが 表示する時に項目ごとに変換する mb_convert_encoding を 使う方法はあると思うのですが、出来たら手間をかけたくないのと MySQLの4.0環境とMySQLの5.0環境両方でなるべく変更を少なく 実行したいと思っております。 どなたか、お分かりの方がおられましたら是非ご教授下さい。 

    • ベストアンサー
    • PHP
  • PHPからデータベースへの登録について

    はじめまして。現在、仕事の関係でPHPのプログラムを勉強している者です。 早速ですが、質問させていただきます。 PHPで作成したフォームメールから別で用意したデータベースに 入力データを登録しようとしているのですが、エラーでうまく動作しません。 PHP側のコードミスもあるかもしれませんが、PHPを動作させているサーバーと データベースサーバーの文字コードが違う点も原因しているのでは?と調べている状況です。 フォームからのデータを送るPHP ⇒ Shift_jis PHPをアップしているWebサーバー ⇒ Shift_jis データベースサーバー ⇒ EUC-JP データベースへの接続は問題なく行えているようですので、 登録処理するコードの部分のみを書きます。(↓) ******************************************************************************** // データベースへの登録 $sql = "INSERT INTO FORM_DATA(DataNumber, Time, Name, Email, Area, Sex, Interest, Commnet, OS, IP) VALUES('$tsvcount', '$ymdhis', '$sender_name', '$mail_address', '$mail_area', '$mail_sex', '$mail_interest', '$mail_body', '$os', '$ip')"; $sql = mb_convert_encoding($sql, 'EUC-JP', 'sjis'); mysql_query("SET NAMES 'EUC-JP'"); $db_result = mysql_query($sql); print $sql; print $db_result; if (!$db_result) { exit('Error! データを登録できませんでした。'); } // データベースとの接続解除 $db = mysql_close($db); if (!$db) { exit('データベースとの接続を閉じれませんでした。'); } **************************************************************************** PHP&Webサーバーとデータベースの文字コードを統一すればいい話かもしれませんが、 事情により異なる文字コードの環境で開発しております。 上記の通り、データベースに送信するSQL文はmb_convert_encoding()で「EUC-JP」に変換し、 mysql_query($sql);でデータベースに送信している形です。 この状態で送信すると、エラーとなり送ったSQL文を処理してくれません。 文字コードの変換処理、コードの記述など何が原因なのか分からず困っています。 考えられる原因と、解決策があればご教授いただきたいです。 ちなみに私はPHPはもちろんプログラム自体もまだ経験が浅く、 基礎的なことも理解していないことがかなりあります。 その上でご説明いただけますと大変有難いです。 ではよろしくお願い致します。

    • 締切済み
    • PHP
  • データベース表示結果のデザイン

    データベースの全件検索結果の表示のデザインをしたいと考えているのですがうまくいきません。 PHPのソースは以下の通りです。 <?php mysql_connect('localhost','root','******'); mysql_select_db('AAAAAAAA'); $sql= "select * from ??????"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["renban"]; echo " "; echo $row["tourokubi"]; echo " <br />"; echo $row["title"]; echo " "; echo $row["A"]; echo "-"; echo $row["B"]; echo " "; echo $row["C"]; echo " "; echo $row["D"]; echo " "; echo $row["E"]; echo " "; echo $row["F"]; echo " "; echo $row["G"]; echo "</p><hr />"; } } ?> この検索結果の1つ1つのデータをテーブルで囲んでechoで呼び出したA~Gまでの項目を<tr>や<td>で区切って表のような形にしたいのですがどのようにすればいいでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう