人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:CNET Hatena ITmedia MySQL PHP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Sampo
●10ポイント

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

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

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

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

◎質問者からの返答

動かないですね。。。

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


2 ●
●60ポイント ベストアンサー

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'";

参考になれば幸いです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ