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

解決済みの質問

PHPとMysqlのページ分割表示について

以前こちらで質問させて頂きまして
htmlの検索フォームから入力した情報をデータベースから引っ張ってきて
表示するまでは出来たのですが、表示制限を10個にして、次のページ、前のページと移動させるようなシステムにしたいのですが、うまくいきません(エラーが出てしまいます)
どうか、お力をお貸し願えないでしょうか。

search.html
<html>
<head><title>検索</title></head>
<body>
<form action="/search/"method="post">
/*page_numを入れた*/
<input type="hidden" name="page_num" value="0">
<li>会社名</li>
<li><input type="text"name="name"></li>
<li>電話番号</li>
<input type="text"name="phone" maxlength="11">
<input type="submit" name="submit" value="検索">
</body>
</html>

index.php(データベースから情報を引っ張り出す)

<?php
$host="localhost";
if(!$conn=mysql_connect($host,"usr","passwd")){
die("データベース認証エラー.<br />");
}
mysql_select_db("usr",$conn);

$condition="";

if(isset($_POST["name"])&&($_POST["name"]!="")){
$name=mysql_real_escape_string($_POST["name"]);
$name=str_replace("%","\%",$name);
$condition="WHERE name LIKE \"%".$name."%\"";
}

if(isset($_POST["phone"])&&($_POST['phone']!="")){
$phone=mysql_real_escape_string($_POST["phone"]);
$phone=str_replace("%","\%",$phone);
if($condition==""){
$condition="WHERE phone LIKE \"%".$phone."%\"";
}else{
$condition.="AND phone LIKE \"%".$phone."%\"";
}
}
$tmp=$page_num*10;
$sql="SELECT * FROM table".$condition."ORDER BY id limit".$tmp.",10";

while($row=mysql_fetch_array($res)){
print("<table border=\"1\">");
print("<tr><td>会社名</td><td>電話番号</td></tr>");
print("<tr>");
print("<td>".$row['name']."</td>");
print("<td>".$row['phone']."</td>");
print("</tr>");
print("</table>");
}

$cnt=$row[0];
//ページ表示
if(!$cnt>10){
echo ceil($cnt/10), "ページの中の",$page_num+1,"ページ目を表示<br>";
}
//前の10件
if ($page_num!=0){
echo "<a href=index.php?name=",$name,".$page_num -1.">";
echo "&lt</a>;
echo "前の10件";

//次の10件
if (($page_num+1)*10<$cnt){
echo "<a href=index.php?name=",$name,".$page_num +1.">";
echo "次の10件";
echo "&g</a>t";

mysql_free_result($res);
//データベースから切断
mysql_close($conn);
?>


ちなみにエラーが出ている行はここの
//前の10件
if ($page_num!=0){
echo "<a href=index.php?name=",$name,".$page_num -1.">";
echo "&lt</a>;
echo "前の10件";

>>echo "&lt</a>;
この部分がエラーになっています。

投稿日時 - 2012-01-05 01:33:58

QNo.7225889

困ってます

質問者が選んだベストアンサー

$resを使う前に、

$res = mysql_query($sql);
if ( ! $res ) { die('Invalid query: ' . mysql_error());}

を入れてみてください。

なぜ必要なのかは、以下のURLの解説がわかりやすいと思います。
http://park18.wakwak.com/~little-box/Dreamweaver/sql009.htm

投稿日時 - 2012-01-06 09:43:44

補足

ご指摘ありがとうございます。
下記の通り入れたところエラーもなくなり一覧表示しました。
$res = mysql_query($sql);
if ( ! $res ) { die('Invalid query: ' . mysql_error());}

ですが、肝心の//ページ表示//次のページ//前のページが表示されません。
検索のフォームのhtmlでは
<input type="hidden" name="page_num" value="0">
にてGETにてデータを以下のPHPに引渡ししているのですが、引き渡された後がうまくいきません。
色々と試していますが駄目です。
今登録されている件数が11件であれば//次の10件の部分が表示されるはずなのですが。
不思議とhtmlのvalue="1"にすると、//前の10件の部分は表示されるようになりました。


$page=mysql_real_escape_string($_GET["page"]);
$cnt=$row[0];
//ページ表示
if(!$cnt>10){
echo ceil($cnt/10),"ページの中の",$page +1,"ページ目を表示<br>";
}
//前の10件
if($page!=0){
echo "<a href=index.php?name=".$name."&phone=".$phone."&page_num=".($page_num -1).">";
echo "&lt;</a>";
echo "前の10件";
}
//次の10件
if(($page+1)*10<$cnt){
echo "<a href=index.php?name=".$name."&phone=".$phone."&page_num=".($page_num +1).">";
echo "次の10件";
echo "&gt;</a>";
}

mysql_free_result($res);
//データベースから切断
mysql_close($conn);
?>

2日間もお付き合いいただき本当にありがとうございます。
もし面倒で無ければアドバイスいただけたらと思います。
アドバイスいただけなくても、superside0さまをベストアンサーにさせて頂きます

投稿日時 - 2012-01-06 15:08:19

お礼

今まで、色々と教えて下さりありがとうございました。

後は自分で頑張って解決してみます。

本当に感謝しています。

投稿日時 - 2012-01-06 23:51:11

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

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

回答(6)

ANo.5

----
> 5.echo "&lt</a>;から echo "&lt"; echo "</a>";に変更

じゃなくて...
&ltの後にセミコロンがいるっていうのは、PHPの構文終わりのセミコロンがいるという意味でなく
「小なり」を表示するための HTMLは "&lt"じゃなくて "&lt;" ですよって 意味です。

(&ltでも 多分、ブラウザが補完して表示してくれるんだろうけど。ブラウザ依存させないほうがいいので、一応)


なので、そこは
echo "&lt";
echo "</a>";
にするんじゃなくて
echo "&lt;</a>";
です。
--------------

$sql.="limit" .$tmp.",10";
これでは、結果の$sqlが
"~ ORDER BY gyosya_idlimit10,10"
になってしまって前より悪化しているので、
$sql.=" limit " .$tmp.",10";
です。
(” ”内で、'limit'って文字の前後に ブランクを入れる)


-----------
「あと、$sqlに文字列を代入しただけで、これをMySQL上で実行してない」
の件が 解決してないので、構文エラーがでなくてなっても、
mysql_fetch_array($res)の行で、空のエラーになるはず。

SQL文を作る→そのSQLを実行して結果を格納する→その結果を1つづつ取り出す→結果を解放する
という行程の2つ目が抜けてます。

---------

syntax error, unexpected T_IF in /home/search/index.php on line 105
の件は、多分、その行そのものではなくて、
その前で、;が抜けているとか、 { や } や ( ) が 全角になっているとか
全角の空白を使っているとかかも。
丁寧にトレースすれば、発見できるはずです。
----------



(目視で気になったとこだけなので、実際に動かすとまだ問題はあるかもしれないですけど・・・)

投稿日時 - 2012-01-05 20:13:49

補足

度々、ありがとうございます。
コツコツと訂正しました。

するとようやく、一欄は表示されましたが、検索フォームに入力するとエラーを吐いてしまいます。


superside0さまがおっしゃりました
-----------
「あと、$sqlに文字列を代入しただけで、これをMySQL上で実行してない」
の件が 解決してないので、構文エラーがでなくてなっても、
mysql_fetch_array($res)の行で、空のエラーになるはず。

SQL文を作る→そのSQLを実行して結果を格納する→その結果を1つづつ取り出す→結果を解放する
という行程の2つ目が抜けてます。

---------
お恥ずかしいのですが、
ここの部分がよくわからないのです。
前述のエラーは解消したようですが、$resのところの部分だけがエラーの箇所と指摘されました。
おそらくsuperside0さまがおっしゃってます箇所>>mysql_fetch_array($res)の行で、空のエラーになるはず。

を解決したいのですが、この場合どのようにすれば良いのですか?
本当に初心者でごめんなさい。

投稿日時 - 2012-01-06 00:47:45

ANo.4

"ORDER BY id limit".$tmp.",10";
だと
"ORDER BY id limit10,10" になってしまうから、
"limitのあとに ブランクが入るように$sqlを作らないとまずくないかな。


あと、$sqlに文字列を代入しただけで、これをMySQL上で実行してないのに
その結果を期待している$resが突然発生しているのも おかしいですね。


それと、
echo "<a href=index.php?name=",$name,".$page_num -1.">";
は #3さんの言われているように構文(カンマや"の数)もおかしいけど、
GETデータで複数のパラメータ引き渡したいなら
echo "<a href=index.php?name=".$name."&phone=".$phone."&page_num=".($page_num -1).">";
みたいになるはず。


その前に、この$page_numって変数もまだ準備できてないので、利用する前に
$page_num =mysql_real_escape_string($_GET["page_num"]);
とかやっとかないと。


あと、最初のフォームは、<form action="/search/"method="post">
でPOSTデータにしてるけど、ページ分割したときのリンクは
<a href=index.php?name=".$name ~ > っていうGETデータにするなら
if(isset($_POST["name"])&&($_POST["name"]!="")){
 $name=mysql_real_escape_string($_POST["name"]);

if(isset($_POST["phone"])&&($_POST['phone']!="")){
 $phone=mysql_real_escape_string($_POST["phone"]);
じゃ取り出せなくなるから
最初のフォームをGETに変更してPHPを$_POSTから$_GETにするか
PHP側をどっちでもいけるように $_POSTから  $_REQUESTに変更するか。

他にもいろいろ、HTML側の構文ミスもありそうだけど・・・・
たとえば、
echo "&g</a>t";

echo "&gt;</a>";
じゃないかな。

echo "&lt</a>;
も "の閉じ忘れ以外に、 &ltの後のセミコロン抜けてる感じ。

投稿日時 - 2012-01-05 14:01:49

補足

きめ細かなご指摘ありがとうございます。
早速訂正しましたが、まだエラーが出てしまいます。

1.訂正した箇所はphp側の$_POSTを$_REQUESTに変更
2.>>GETデータで複数のパラメータ引き渡したいなら
echo "<a href=index.php?name=".$name."&phone=".$phone."&page_num=".($page_num -1).">";
echo "<a href=index.php?name=".$name."&phone=".$phone."&page_num=".($page_num +1).">";
に変更しました
3.$page_num =mysql_real_escape_string($_GET["page_num"]);を追加
4.echo "&g</a>t";からecho "&gt;</a>";に変更
5.echo "&lt</a>;から echo "&lt"; echo "</a>";に変更

以上を訂正しましたが
//次の10件
if (($page_num+1)*10<$cnt){
echo "<a href=index.php?name=".$name."&phone=".$phone."&page_num=".($page_num +1).">";
echo "次の10件";
echo "&gt";
echo "</a>";

ここの
if (($page_num+1)*10<$cnt){
部分が以下のようなエラーコードが出てしまいます
syntax error, unexpected T_IF in /home/search/index.php on line 105
あともう少しなのですが、うまくいきません。


・・・略
$page_num=mysql_real_escape_string($_REQUEST["page_num"]);
$tmp=$page_num*10;
$sql="SELECT * FROM gyosya_list".$condition."ORDER BY gyosya_id";
$sql.="limit" .$tmp.",10";

while($row=mysql_fetch_array($res)){
print("<table border=\"1\">");
print("<tr><td class=\"m_nam\">会社名</td><td class=\"m_pho\">電話番号</td></tr>");
print("<tr>");
print("<td class=\"g_nam\">".$row['gyosya_name']."</td>");
print("<td class=\"g_pho\">".$row['gyosya_phone']."</td>");
print("</tr>");
print("</table>");
}

$cnt=$row[0];
//ページ表示
if(!$cnt>10){
echo ceil($cnt/10),"ページの中の",$page_num+1,"ページ目を表示<br>";
}
//前の10件
if ($page_num!=0){
echo "<a href=index.php?name=".$name."&phone=".$phone."&page_num=".($page_num -1).">";
echo "&lt";
echo "</a>";
echo "前の10件";

//次の10件
if (($page_num+1)*10<$cnt){
echo "<a href=index.php?name=".$name."&phone=".$phone."&page_num=".($page_num +1).">";
echo "次の10件";
echo "&gt";
echo "</a>";

・・・略

投稿日時 - 2012-01-05 17:59:59

お礼

補足のところ間違えました。
ごめんなさい
1.訂正した箇所はphp側の$_POSTを$_GETに変更です。

お時間を頂いてすいません。

投稿日時 - 2012-01-05 18:03:23

ANo.3

こんにちは。

なんか、単純な記述ミス・・・?
echo "<a href=index.php?name=",$name,".$page_num -1.">";
これもおかしいです。
カンマとピリオドを間違えてる?
どちらにしても、ダブルコーテーションの数が合ってないです。

echo "&lt</a>;
これは#2さんがおっしゃるように、閉じ忘れですかね?

投稿日時 - 2012-01-05 10:29:30

お礼

こんばんは

記述ミスみたいでした
#4さんがおっしゃっていただいた方法に訂正しました。

ですが、まだエラーが出てしまいます。

PHPは始めたばっかりなのでわからない事だらけです。

わざわざこんな自分のために回答していただいてありがとうございました。

投稿日時 - 2012-01-05 18:11:50

ANo.2

× echo "&lt</a>;
○ echo "&lt</a>";

っていうこと?

投稿日時 - 2012-01-05 07:36:37

お礼

ご指摘ありがとうございます。

直してみましたが、他にも間違えがあるようです。

探してみます。

本当にありがとうございました。

投稿日時 - 2012-01-05 17:36:02

>> この部分がエラーになっています。
技術系の質問はエラー文そのものが解決方法です。
エラー文を記述してください。
そのほうがソースをダラダラと記述するよりも回答者に優しいと思いますが。

投稿日時 - 2012-01-05 02:28:02

補足

>>そのほうがソースをダラダラと記述するよりも回答者に優しいと思いますが。

申し訳ございませんでした。
こちらがエラーコードになります。
宜しくお願いします。

Parse error: syntax error, unexpected '/' in /home/index.php on line 70

投稿日時 - 2012-01-05 02:31:40

あなたにオススメの質問