php & MySQL hogeter というテーブルに user と word というカラムがあります。


ここで user が hatena という値があるレコードすべてを取得し word に入っている値を ' ではさみ単語ごとを,で区切り最後は,をつけない形 (例 'itmedia','atmarkit','cnet','yahoo' のような感じ)にするPHPソースをお願いします。ちなみに同じ単語は重複しないようにしてください。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/06/23 23:56:44
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:bonlife No.2

回答回数421ベストアンサー獲得回数75

ポイント60pt

id:Sampoさんの例ではdistinct wordとしてしまっているので、$rows["word"]では取得できないのだと思います。

mysql_fetch_assocをmysql_fetch_arrayなどに変更し、$rows[1]に変更するか、distinct wordに別名を付与すれば正しく動作します。

以下のような感じでいかがでしょうか。

<?php
// HTML出力用設定
mb_http_output('UTF-8');
header("Content-Type: text/html; charset=UTF-8");
// HTMLのヘッダー部分出力
print <<<EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>MySQL userがhatenaの行のwordを列挙</title>
</head>
<body>
EOF;
// MySQLに接続 (サーバ名、ユーザーID、パスワードは適宜変更)
$con = mysql_connect("localhost","user","password")
or die("MySQLに接続できません。");
// データベースを選択 (例では test を選択)
mysql_select_db('test');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);
// SQL(SELECT文)設定
$sql = "SELECT distinct WORD AS WORD_UNIQUE FROM hogeter WHERE user = 'hatena'";
$result = mysql_query($sql);
// 以下表示処理
if (!$result) {
// 検索結果が存在しない場合
	print "検索結果を取得できませんでした。";
} else {
// 検索結果が存在する場合
	while($row=mysql_fetch_array($result)){
		$words_quoted[] = "'" . $row['WORD_UNIQUE'] . "'";
	}
	// 検索結果が1件より少ない場合
	if (count($words_quoted)<1) {
		print "検索結果がありませんでした。";
	} else {
	// 検索結果が1件以上ある場合
		$output = implode(",",$words_quoted);
		print $output;
	}
}
// HTMLのフッター部分出力
print <<<EOF
</body>
</html>
EOF;
?>

質問文中の「user が hatena という値がある」は「userがhatenaという値である」と解釈しました。

hatenaという文字列を含むuserを選択したいのであれば、where句の条件を user like '%hatena%' とすれば良いです。

また、wordに入っている値が1語でない場合も想定するのであれば、「検索結果が存在する場合」の部分の処理を以下のように変更してみてください。

// 検索結果が存在する場合
	$words_quoted = array();
	while($row=mysql_fetch_array($result)){
		$word_unique = explode(" ",$row['WORD_UNIQUE']);
		$words_quoted = array_merge($words_quoted, $word_unique);
	}
	for ($i=0;$i<count($words_quoted);$i++){
		$words_quoted[$i] = "'" . $words_quoted[$i] . "'";
	}

補足になりますが、Yahoo、yahoo、YAHOOを同じ単語として認識させるためには、SQL文の部分を以下のどちらかに変更すれば良いです。

$sql = "SELECT distinct lower(WORD) AS WORD_UNIQUE FROM hogeter WHERE user = 'hatena'";
$sql = "SELECT distinct UPPER(WORD) AS WORD_UNIQUE FROM hogeter WHERE user = 'hatena'";

参考になれば幸いです。

その他の回答1件)

id:Sampo No.1

回答回数556ベストアンサー獲得回数104

ポイント10pt

$query = mysql_query("select distinct word from hogeter where user='hatena'");

while( $rows = mysql_fetch_assoc($query) ) $apos[] = "'".$rows["word"]."'";

$result = implode(",", $apos );

うまく動かなかったらご指摘ください。

id:esecua

動かないですね。。。

最後までしっかりとしたソースお願いします。

2006/06/21 23:39:59
id:bonlife No.2

回答回数421ベストアンサー獲得回数75ここでベストアンサー

ポイント60pt

id:Sampoさんの例ではdistinct wordとしてしまっているので、$rows["word"]では取得できないのだと思います。

mysql_fetch_assocをmysql_fetch_arrayなどに変更し、$rows[1]に変更するか、distinct wordに別名を付与すれば正しく動作します。

以下のような感じでいかがでしょうか。

<?php
// HTML出力用設定
mb_http_output('UTF-8');
header("Content-Type: text/html; charset=UTF-8");
// HTMLのヘッダー部分出力
print <<<EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>MySQL userがhatenaの行のwordを列挙</title>
</head>
<body>
EOF;
// MySQLに接続 (サーバ名、ユーザーID、パスワードは適宜変更)
$con = mysql_connect("localhost","user","password")
or die("MySQLに接続できません。");
// データベースを選択 (例では test を選択)
mysql_select_db('test');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);
// SQL(SELECT文)設定
$sql = "SELECT distinct WORD AS WORD_UNIQUE FROM hogeter WHERE user = 'hatena'";
$result = mysql_query($sql);
// 以下表示処理
if (!$result) {
// 検索結果が存在しない場合
	print "検索結果を取得できませんでした。";
} else {
// 検索結果が存在する場合
	while($row=mysql_fetch_array($result)){
		$words_quoted[] = "'" . $row['WORD_UNIQUE'] . "'";
	}
	// 検索結果が1件より少ない場合
	if (count($words_quoted)<1) {
		print "検索結果がありませんでした。";
	} else {
	// 検索結果が1件以上ある場合
		$output = implode(",",$words_quoted);
		print $output;
	}
}
// HTMLのフッター部分出力
print <<<EOF
</body>
</html>
EOF;
?>

質問文中の「user が hatena という値がある」は「userがhatenaという値である」と解釈しました。

hatenaという文字列を含むuserを選択したいのであれば、where句の条件を user like '%hatena%' とすれば良いです。

また、wordに入っている値が1語でない場合も想定するのであれば、「検索結果が存在する場合」の部分の処理を以下のように変更してみてください。

// 検索結果が存在する場合
	$words_quoted = array();
	while($row=mysql_fetch_array($result)){
		$word_unique = explode(" ",$row['WORD_UNIQUE']);
		$words_quoted = array_merge($words_quoted, $word_unique);
	}
	for ($i=0;$i<count($words_quoted);$i++){
		$words_quoted[$i] = "'" . $words_quoted[$i] . "'";
	}

補足になりますが、Yahoo、yahoo、YAHOOを同じ単語として認識させるためには、SQL文の部分を以下のどちらかに変更すれば良いです。

$sql = "SELECT distinct lower(WORD) AS WORD_UNIQUE FROM hogeter WHERE user = 'hatena'";
$sql = "SELECT distinct UPPER(WORD) AS WORD_UNIQUE FROM hogeter WHERE user = 'hatena'";

参考になれば幸いです。

  • id:esecua
    bonlifeさんまたまたありがとうございます。これでバッチリOKです。

    いやぁ~本当にありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません