プロが教える店舗&オフィスのセキュリティ対策術

住所録を作成し、プルダウンとキーワードで作成しましたがうまくいきません。実行すると最後に記載のエラーがでます。教えてください。フリーワードだけの検索はうまくいきましたが。
---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」

A 回答 (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を生成しているわけなので、
その方法を否定するつもりはありません。
これだけ条件分岐がある中、一時的に変数に格納しない方法を
取るのは得策とは言えませんしね。

この回答への補足

naktak様
>とでもすれば、実行されるSQL文がブラウザ上に表示されるので、
実行してみました。
エラーは出ませんが、検索結果がでませんでした。

個人的には、最初の日付選択が引っかかっているのかもしれません。
加入日にはyyyy/mm/ddの形式で取り込まれており、検索するときに、
yyyyとmmとddを個別に入れて、何日~何日の間で検索させるようにしているので・・・。

補足日時:2007/10/08 13:24
    • good
    • 0

> $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()を実行しても構いません。

この回答への補足

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

補足日時:2007/10/07 23:31
    • good
    • 0

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で最終行などがエラーと判断される場合、入れ子構造を
ミスしていることが多いと思います。

この回答への補足

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>

補足日時:2007/10/07 22:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!