みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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>

投稿日時 - 2009-04-28 18:07:44

QNo.4916065

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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"とします。

以上です。何かの参考になればと思います。

投稿日時 - 2009-05-14 17:40:58

あなたにオススメの質問