• 締切済み

PHP MYSQLでのページ間のやりとり

ブログのようなサイトを作ろうと思い、PHP+MYSQLで四苦八苦しております。 ひとつのページにデータベースの一覧を表示することはできました。 ところがそのページの特定のリンク(IDなど)をクリックした後に詳細ページ(又は管理ページ)を表示させよと思ってますが、なんともうまくいきません。 ちなみに下記のリンクはDreamweaverで自動生成しました。一応動いたのですが if (!function_exists("GetSQLValueString")) { 以下から $colname_rst = "-1"; までさっぱりわかりません。 $colname_rst = "-1"; if (isset($_GET['title'])) { $colname_rst = $_GET['title']; } $query_rst = sprintf("SELECT * FROM sample WHERE title = %s", GetSQLValueString($colname_rst, "text")); のみで動作しないものでしょうか。 --------------------------------------------------------------------------------- <?php require_once('Connections/testserver.php'); ?> <?php if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } } $colname_rst = "-1"; if (isset($_GET['title'])) { $colname_rst = $_GET['title']; } mysql_select_db($database_testserver, $testserver); $query_rst = sprintf("SELECT * FROM sample WHERE title = %s", GetSQLValueString($colname_rst, "text")); $rst = mysql_query($query_rst, $testserver) or die(mysql_error()); $row_rst = mysql_fetch_assoc($rst); $totalRows_rst = mysql_num_rows($rst); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無題ドキュメント</title> </head> <body> <?php echo $row_rst['title']; ?> </body> </html>

みんなの回答

回答No.1

ご質問されてから日が経っているのですでに解決済みかもしれませんが、一応回答を入れてみます。 上記ソースを確認したところ、どうやら冒頭の関数はSQLを流すための データのサニタイジング(無毒化)を行っているようです。 もしもユーザからのリクエストをそのままSQL文に埋め込んで DBに流してしまうと、見えてはいけないデータにアクセスできて しまったり、データを消してしまったりといったことが起きてしまう 可能性があるため、データの中のSQLがコマンドとして判断してしまう 文字(例えばシングルクオテーションなど)を安全のために エスケープ処理(データとして取り扱うようにする)をしているのです。 ※これはセキュリティ上重要です。 上記のソースですと、タイトルをもとにデータを抽出しようとして いるようですが、特定のデータを1件だけ抽出したい場合には ID(プライマリーキー)で取得するのが普通です。 タイトル文字列で抽出すると、万が一まったく同じタイトルが 2件以上登録されている場合に複数のレコードが返ってきてしま います。 上記ソースですと、クエリ部分が以下のようになるイメージです。 $query_rst = sprintf("SELECT * FROM sample WHERE id = %d", GetSQLValueString($colname_rst, "long")); "id"はsampleテーブルの主キーのフィールド名を指定します。 "long"は"id"フィールドの型に従って変更します。int型の場合は、 "int"とします。 以上です。何かの参考になればと思います。

関連するQ&A