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

PHP初心者です。

今、作品ギャラリーのページを作っています。
サムネイルがズラッと並んでいる感じです。

サムネイルをクリックすると詳細ページに移動させたいのですが、静的に作るとかなりの数になるのでPHPを何となくですが勉強しています。

やりたいことはこうです。

サムネイルのリンク先URLに?=id1とかつける
http://hogehoge/works/?=id1
http://hogehoge/works/?=id2

そしてリンクのページを開くとidに紐付いたレコードのテキスト(画像)を表示させる。

フィールドの情報を表示させることは分かるのですが、
もし、idが?=id1の時に1行目のレコードのデータを表示するという条件分岐?ところが色々調べたのですが、よく分からずにつまずいています。

やりたいことはわかってるのですが、書ける力がありません。
情けない話ですが、ご存知のかた、アドバイス等いただけると嬉しいです。

初歩的な質問かもしれませんが、PHPは最近使い始めたばかりでハマってしましました。宜しくお願いいたします。

1366441359
●拡大する

●質問者: 匿名質問者
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● 匿名回答1号

>紐付いたレコード
>フィールドの情報を表示させることは分かる

データベースを使っているみたいなので、
SQL文 を作成する部分で絞込みを加えればいいでしょう。

php+MySQLという組み合わせが多いのでMySQL用で回答しますが、
他のデータベースの場合もSQLにあまり違いはないです。
LIMITはあってもなくてもほぼ変わらないと思いますが、いちおう入れておきました。
引数チェックは基礎的なものだけです。

(a)id フィールドが文字列型の場合
引数チェックにはmysql_real_escape_stringを使いましたが接続方法によってはmysqli_real_escape_string()やPDO::quote()などといった具合に違うものになります。
http://www.php.net/manual/ja/function.mysql-real-escape-string.php

if ( isset( $_GET['id'] ) ) {
 // hogehoge/works/id=xxx の場合はid = xxx のレコード
 $sql = "SELECT * FROM テーブル WHERE id = '" . mysql_real_escape_string( $_GET['id'] ) . "' LIMIT 0, 1";
} else {
 // hogehoge/works/ の場合は最初のレコード
 $sql = 'SELECT * FROM テーブル LIMIT 0, 1';
}

(b)id フィールドが数値型の場合
引数チェックは数値型かどうかだけで判断しています。

$id = isset( $_GET['id'] ) ? ( gettype( $_GET['id'] ) == integer ? $_GET['id'] : 0 ) : 0 ;
if ( $id > 0 ) {
 // hogehoge/works/id=xxx の場合はid = xxx のレコード
 $sql = 'SELECT * FROM テーブル WHERE id = ' . $_GET['id'] . ' LIMIT 0, 1';
} else {
 // 引数が無い、または引数が数値型ではない場合は最初のレコード
 $sql = 'SELECT * FROM テーブル LIMIT 0, 1';
}

質問者から

さっそくごの御回答有り難うございます。
MAMPで以下のように試してみたのですが、接続だけはうまくいくのですが、
肝心のテキストをデータベースから引っ張ってこれません。。。


< ?php
mysql_connect('localhost','root','root')or die(mysql_error());
mysql_select_db('test');
echo 'OK';

if ( isset( $_GET['id'] ) ) {
// hogehoge/works/id=xxx の場合はid = xxx のレコード
$sql = "SELECT * FROM works WHERE id = '" . mysql_real_escape_string( $_GET['id'] ) . "' LIMIT 0, 1";
} else {
// hogehoge/works/ の場合は最初のレコード
$sql = 'SELECT * FROM works LIMIT 0, 1';
}

? >
< !doctype html>
< html lang="">
< head>
< meta charset="UTF-8">
< title>Document</title>
< /head>
< body>
< p>< ?php echo ($_POST['name']);? >< /p >
< p>< img src="../< ?php echo $_POST['$id'] ?>/1.jpeg >< /p >
< /body>
< /html>


自分の書き方が絶対に間違っているのはわかるのですが、testというデータベースにworksというテーブルを作っています。
おかしいところだらけだと思いますが、あためてご教授いただけると嬉しいです。


2 ● 匿名回答1号

「フィールドの情報を表示させることは分かる」ってのは、
「MySQLのテーブルのフィールドから情報を得て表示させること」ではなくて、
まったく関係の無いHTMLフォームの話だったのね。がっくしorz

えっとね。MySQLに送る命令(=SQL)を作っただけじゃだめなのよ。

知ってると思ったから回答1では省いたのだけど、
mysql_queryでMySQLにSQLを送って、
mysql_fetch_assocで結果を受け取るみたいなことをしないとダメなの。

こっちはWindowsでMAMPじゃないから動作確認無しで書くけど、こんな感じね。

<?php
mysql_connect('localhost','root','root') or die(mysql_error());
mysql_select_db('test') or die(mysql_error());
if ( isset( $_GET['id'] ) ) {
 $sql = "SELECT * FROM works WHERE id = '" . mysql_real_escape_string( $_GET['id'] ) . "' LIMIT 0, 1";
} else {
 $sql = 'SELECT * FROM works LIMIT 0, 1';
}
$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_assoc($result) or die(mysql_error());
? >

<!doctype html>
<html lang="">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
< body>
 <p><?php echo ($row['name']); ?></p>
 <p><img src="../<?php echo $row['id'] ?>/1.jpeg ></p>
</body>
</html>

phpマニュアルのMySQL関連も熟読すること!
http://www.php.net/manual/ja/function.mysql-query.php
http://www.php.net/manual/ja/function.mysql-fetch-assoc.php


質問者から

ありがとうございます。

まだ始めたばかりで、色々勉強不足でした。
勉強させて頂きます。


3 ● 匿名回答1号
ベストアンサー

「2行目のレコードが出ない」ってコメントを書いて消したみたいだけど、
「idが?=id1の時に1行目のレコードのデータを表示する」にあわせて回答したので、
必ず最初の一レコードしか出力しないようになっています。

SQLでLIMITを使っていたり、
mysql_fetch_assoc を一回だけしか使っていないのはそのためです。

id = 'hoge' のレコードが複数になる場合もあるならば、LIMITは無くして、
mysql_fetch_assocを必要回数分だけループするような形になおします。

<!doctype html>
<html lang="">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
< body>

<?php
 mysql_connect('localhost','root','root') or die(mysql_error());
 mysql_select_db('test') or die(mysql_error());
 if ( isset( $_GET['id'] ) ) {
 $sql = "SELECT * FROM works WHERE id = '" . mysql_real_escape_string( $_GET['id'] ) . "'";
 } else {
 $sql = 'SELECT * FROM works';
 }
 $result = mysql_query($sql) or die(mysql_error());
 echo '<p>' . $sql . '<br>結果は' . mysql_num_rows($result) . 'レコードです</p>' ;
 while ($row = mysql_fetch_assoc($result)) {
 echo '<p>' . $row['name'] . '</p>';
 echo '<p><img src="../' . $row['id'] . '/1.jpeg ></p>';
 }
?>

</body>
</html>

離れた場所に書くのはわかりにくくなるので、
mysql_connectなどもbodyタグの中に移動しました。


匿名質問者さんのコメント
ありがとうございます。 ID別にイメージ通りの形を作ることが出来ました。 とても助かりました。 どうもありがとうございます。 解決いたしましたので、質問を終了させて頂きます。
関連質問

●質問をもっと探す●



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