• 締切済み

PHP+MYSQLで検索画面を作成しています。プルダウンとキーワードを使用していますがうまくいきません。

住所録を作成し、プルダウンとキーワードで作成しましたがうまくいきません。実行すると最後に記載のエラーがでます。教えてください。フリーワードだけの検索はうまくいきましたが。 ---kensaku.php--- <?php extract($_POST); $dfrom = sprintf("%04d-%02d-%02d",$year1,$mon1,$date1); $dto = sprintf("%04d-%02d-%02d",$year2,$mon2,$date2); if($kai == ''){ }else{ $jouken = "(ocrdate between '$dfrom' and '$dto')"; if ($kai <> "*"){ $jouken = "$jouken and kai like '%$kai%'"; } if ($fuk <> "*"){ $jouken = "$jouken and fuk like '%$fuk%'"; } if ($jic <> "*"){ $jouken = "$jouken and jic like '%$jic%'"; } if ($key1 <> ""){ $jouken = "$jouken and (keyword like '%$key1%' or detail like '%$key1%' or treat like '%$key1%' or remark like '%$key1%')"; if (key2 <> ""){ $jouken = "$jouken and (keyword like '%$key2%' or detail like '%$key2%' or treat like '%$key2%' or remark like '%$key2%')"; if (key3 <> ""){ $jouken = "$jouken and (keyword like '%$key3%' or detail like '%$key3%' or treat like '%$key3%' or remark like '%$key3%')"; } } } mysql_connect('localhost','***','****'); mysql_select_db('****'); $sql = "select * from jyusho where $jouken"; $result = mysql_query($sql); $num = mysql_num_rows($result); if ($num == 0){ echo "該当データがありません<br>"; exit; }else { echo "<table border=\"1\">\n"; echo "<tr>\n"; echo "<th>加入日</th>\n"; echo "<th>加入地域<br></th>\n"; echo "<th>加入県</th>\n"; echo "</tr>\n"; while($row = mysql_fetch_array($result)){ $id = $row["id"]; echo "<tr>"; echo "<td align=\"right\"><a href=\"meisai.php?id=$id\">",$id,"</a>\n"; echo "</td><td>"; echo $row["kai"]; echo "</td><td>"; echo $row["fuk"]; echo "</td><td>"; echo $row["jic"]; echo "</td></tr>"; }(ここまで170行目、次は、/htmlとなっています) ---ここまで--- エラーは、「Parse error: parse error, unexpected $end in c:\(省略)\kensaku.php on line 171」

みんなの回答

回答No.3

> echo"$sql = "select * from jyusho where $jouken""; > するということでしょうか? えっと、質問にあるソース上では、 > $dfrom = sprintf("%04d-%02d-%02d",$year1,$mon1,$date1); からSQL文が作成されており、最終的に > $sql = "select * from jyusho where $jouken"; とすることで実際に実行されるSQL文が生成されています。 なので、 > $sql = "select * from jyusho where $jouken"; のあとに echo $sql; exit; とでもすれば、実行されるSQL文がブラウザ上に表示されるので、 phpMyAdminやコンソール上から直接MySQLにアクセスし、出力された SQL文を実行すれば、それが正常なSQLかどうかが確認出来るという 事になります。(正しいかどうかという指標は『SQLの文法上』。) この方法は、自分で記述したPHPプログラムのSQL部分が正しく 処理されなかった時に有効だと思います。 MySQLとPHPは別に密接な関係があるわけではありませんから、 『MySQLが正常に動作する環境下で実行して、正常である事が 確認できれば、自分で作成したソース上のSQL文は正しい』 という保証を得る事が出来ます。 更に、その環境下で実行することにより、結果も一瞬で返って きますから、取得できたデータなどを確認する事も簡単に 行えます。 > $jyukenという、語句を使用して検索がやりやすくしたのですが > 使わない方法は難しいのでしょうか? $joukenという変数は、色々なパターンがある為に、一度変数に 文字列として各SQL文を格納し、動的SQLを生成しているわけなので、 その方法を否定するつもりはありません。 これだけ条件分岐がある中、一時的に変数に格納しない方法を 取るのは得策とは言えませんしね。

noname#46364
質問者

補足

naktak様 >とでもすれば、実行されるSQL文がブラウザ上に表示されるので、 実行してみました。 エラーは出ませんが、検索結果がでませんでした。 個人的には、最初の日付選択が引っかかっているのかもしれません。 加入日にはyyyy/mm/ddの形式で取り込まれており、検索するときに、 yyyyとmmとddを個別に入れて、何日~何日の間で検索させるようにしているので・・・。

回答No.2

> $sql = "select * from jyusho where $jouken"; > $result = mysql_query($sql); > $num = mysql_num_rows($result); $joukenにどういった文字列が入ってくるかは追っていないので 分かりませんが、mysql_num_rows()がエラーになるという事は、 mysqlのリソースとして正しくない可能性があります。 (つまり、mysql_query()で返ってきている値はリソースではなく false値) $sqlをecho等してみて、それが実際にmysql上で実行出来るか 確認してみてはいかがでしょうか? もしくはmysql_connect()時点でしっかりリソースを取得し、 その上でmysql_query()に接続リソースを指定、 mysql_query()後にmysql_error()を実行しても構いません。

noname#46364
質問者

補足

naktak様 >$sqlをecho等してみて、それが実際にmysql上で実行出来るか確認してみてはいかがでしょうか? 実は、サンプルをかき集めて動かしているうちに ドつぼにはまったわけです。 echo"$sql = "select * from jyusho where $jouken""; するということでしょうか? $jyukenという、語句を使用して検索がやりやすくしたのですが 使わない方法は難しいのでしょうか?

回答No.1

if ($num == 0){ echo "該当データがありません<br>"; exit; }else { echo "<table border=\"1\">\n"; echo "<tr>\n"; echo "<th>加入日</th>\n"; echo "<th>加入地域<br></th>\n"; echo "<th>加入県</th>\n"; echo "</tr>\n"; while($row = mysql_fetch_array($result)){ $id = $row["id"]; echo "<tr>"; echo "<td align=\"right\"><a href=\"meisai.php?id=$id\">",$id,"</a>\n"; echo "</td><td>"; echo $row["kai"]; echo "</td><td>"; echo $row["fuk"]; echo "</td><td>"; echo $row["jic"]; echo "</td></tr>"; } elseに対する}が存在しないように伺えますが。 大体PHPで最終行などがエラーと判断される場合、入れ子構造を ミスしていることが多いと思います。

noname#46364
質問者

補足

naktak様 たしかに「}」が抜けていました。 が、こんどは、 「mysql_num_rows()」がある行が引っかかりましたが・・。 「num」でも大丈夫だと思いましたが・・。 上の続きで、プルダウンの項目があるのですが、 ?> <form action="kensaku.php" method="post"> <table border="0"> <tr> <b>加入日</b> </td> <td> <?php $today=getdate(); $yr=$today[year]; $mon=$today[mon]; $dt=$today[mday]; echo "<select name=\"year1\">\n"; for ($i=$yr;$i>=$yr-31;$i--){ echo "<option value=\"$i\""; if ($i == $yr-1){ echo "selected"; } echo ">$i</option>\n"; } echo "</select>年\n"; echo "<select name=\"mon1\">\n"; for ($m=1;$m<=12;$m++){ echo "<option value=\"$m\" "; if ($m == $mon){ echo "selected"; } echo ">$m</option>\n"; } echo "</select>月\n"; echo "<select name=\"date1\">\n"; for ($d=1;$d<=31;$d++){ echo "<option value=\"$d\" "; if ($d == $dt){ echo "selected"; } echo ">$d</option>\n"; } echo "</select>日\n~"; echo "<select name=\"year2\">\n"; for ($i=$yr;$i>=$yr-31;$i--){ echo "<option value=\"$i\">$i</option>\n"; } echo "</select>年\n"; echo "<select name=\"mon2\">\n"; for ($m=1;$m<=12;$m++){ echo "<option value=\"$m\" "; if ($m == $mon){ echo "selected"; } echo ">$m</option>\n"; } echo "</select>月\n"; echo "<select name=\"date2\">\n"; for ($d=1;$d<=31;$d++){ echo "<option value=\"$d\" "; if ($d == $dt){ echo "selected"; } echo ">$d</option>\n"; } echo "</select>日\n"; ?> </td> <tr> <td> <b>加入地域</b> </td> <td colspan="4"> <select name="kai"> <option value="*">すべて</option> <option value="東部">東部</option> <option value="西部">西部</option> <option value="四国">四国</option> <option value="瀬戸内">瀬戸内</option> </select> </td> </tr> <tr> <td> <b>府県名</b> </td> <td colspan="4"> <select name="fuk"> <option value="*">すべて</option> <option value="徳島県">徳島県</option> <option value="香川県">香川県</option> <option value="愛媛県">愛媛県</option> <option value="高知県">高知県</option> </select> </td> </tr> <tr> <td> <b>キーワード:</b> </td> <td colspan="4"> <input type="text" name="key1" size="20"> <input type="text" name="key2" size="20"> <input type="text" name="key3" size="20"> </td> </tr> </table> <br> <p><input type="submit" value="検索"> <input type="reset" value="クリア"></p> </form>

関連するQ&A