PHPについて質問です。


現在、検索機能を作成しているのですが、
空白とデータベースにないデータを入力した際に
エラーページへ移動させるようにコードを組んでいるのですが、
うまく移動しません。

http://www.aiomock2008.sakura.ne.jp/kaimono.php

空白の状態で検索ボタンを押すとデータベースのデータが全部出てきてしまいます。
お手数をおかけしますがPHP詳しい方おりましたら一度コードを見ていただけないでしょうか。
お手数をおかけしますがよろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/07/30 20:04:50
  • 終了:2010/07/31 23:56:19

ベストアンサー

id:bayan No.3

bayan回答回数100ベストアンサー獲得回数132010/07/31 21:40:26

ポイント100pt

2010-07-30 22:06:21 のコメントの内容からは、

エラーページへ移動する header() 関数を実行した後も処理が続き、

3つ目の header('Location:kaimono_kensaku.php'); で

HTTPヘッダの内容が上書きされているように思います。


「 header(); を呼んだ直後にスクリプトを終了する 」 とどうでしょうか?


以下 2010-07-30 22:06:21 のコメントに適用する場合。

<?

if(isset($_POST["submit"]))
{

  session_start();
  $_SESSION['kensaku']=$_POST["kensaku"];

  $kw = trim($_SESSION['kensaku']);
  if ($kw == '') {
    header('Location: kaimono_kensaku_error.php');
    exit;
  }

  require 'database_connect.php';
  $kw = mysql_real_escape_string($kw);
  $res = mysql_query("SELECT * from KAIMONO WHERE TITLE Like '%" . $kw . "%' ; ");
  if (mysql_num_rows($res) == 0) {
    header('Location: kaimono_kensaku_error.php');
    exit;
  }

  header('Location:kaimono_kensaku.php');
  exit;

}

?>

http://php.net/manual/ja/function.header.php

id:aiomock

ご回答ありがとうございます。

2010/07/31 23:35:19

その他の回答(2件)

id:tasklight No.1

tasklight回答回数323ベストアンサー獲得回数402010/07/30 20:17:09

ポイント50pt

この部分を

//以下検索で空白、データベースに登録されていないデータが検索された際のエラー処理を施しております。

if($_SESSION["kensaku"]=="")
{header('Location:kaimono_kensaku_error.php');}


require "database_connect.php";

$sql=mysql_query(" SELECT * from KAIMONO WHERE TITLE Like '%".$_SESSION["kensaku"]."%' ; ");

if(!$sql)
{header('Location:kaimono_kensaku_error.php');}

以下のように書き直して下さい。


$kw = trim($_SESSION['kensaku']);
if ($kw == '')) {
    header('Location: kaimono_kensaku_error.php');
}

require 'database_connect.php';
$kw = mysql_real_escape_string($kw);
$sql = mysql_query("SELECT * from KAIMONO WHERE TITLE Like '%" . $kw . "%' ; ");
if (mysql_num_rows($res) == 0) {
    header('Location: kaimono_kensaku_error.php');
}

余談ながら、全体的にSQLインジェクション対策がなされていないようなので、このままインターネットに公開するのは危険なコードです。

id:aiomock

ご回答ありがとうございます。

変更してみましたが

kaimono_kensaku_error ページへ移動しないです。。

SQLインジェクション対策についてですが

SELECT * from KAIMONO WHERE TITLE Like '%" . $kw . "%'

このようなコードからどのように読み取ることが可能なのでしょうか?

'database_connect.php'

の中身がわかったら完ぺきに入られると思うのですが、この中身さえ分からなければ大丈夫だと個人的に思っているのですが

この  'database_connect.php' の中身をわからないようにアクセスを制限したりとか対策はあるのでしょうか。

それとも  'database_connect.php' はそのままでも大丈夫でしょうか。

かなり初歩的な意見ですがわかるかたおりましたらご回答よろしくお願いいたします。

2010/07/30 20:52:07
id:rouge_2008 No.2

rouge_2008回答回数594ベストアンサー獲得回数3512010/07/31 01:00:57

ポイント50pt

1つ目のコメントの以下の部分を修正します。

(修正前)

<?


if(isset($_POST["submit"]))
{

session_start();

$_SESSION["kensaku"]="";
$_SESSION["kensaku"]=$_POST["kensaku"];

//以下検索で空白、データベースに登録されていないデータが検索された際のエラー処理を施しております。

if($_SESSION["kensaku"]==""){header('Location:kaimono_kensaku_error.php');}


require "database_connect.php";

$sql=mysql_query(" SELECT * from KAIMONO WHERE TITLE Like '%".$_SESSION["kensaku"]."%' ; ");

if(!$sql)
{header('Location:kaimono_kensaku_error.php');}

header('Location:kaimono_kensaku.php');

}


?>

(修正後)

<?


if(isset($_POST["submit"])){

session_start();

$_SESSION["kensaku"] = "";

//以下検索で空白、データベースに登録されていないデータが検索された際のエラー処理を施しております。

if(!$_POST["kensaku"]){ // 条件を指定
    header('Location:kaimono_kensaku_error.php');
}else{ // 先ほどの条件に当てはまらない場合
    require "database_connect.php";
    $_SESSION["kensaku"] = mysql_real_escape_string($_POST["kensaku"]);
    $sql = mysql_query(" SELECT * from KAIMONO WHERE TITLE Like '%".$_SESSION["kensaku"]."%'"); // 送信するSQL文の中に「;」は必要ありません。
    header('Location:kaimono_kensaku.php');
}

}

?>

上記で大丈夫なはずです。

id:aiomock

ご回答ありがとうございます。

2010/07/31 18:34:31
id:bayan No.3

bayan回答回数100ベストアンサー獲得回数132010/07/31 21:40:26ここでベストアンサー

ポイント100pt

2010-07-30 22:06:21 のコメントの内容からは、

エラーページへ移動する header() 関数を実行した後も処理が続き、

3つ目の header('Location:kaimono_kensaku.php'); で

HTTPヘッダの内容が上書きされているように思います。


「 header(); を呼んだ直後にスクリプトを終了する 」 とどうでしょうか?


以下 2010-07-30 22:06:21 のコメントに適用する場合。

<?

if(isset($_POST["submit"]))
{

  session_start();
  $_SESSION['kensaku']=$_POST["kensaku"];

  $kw = trim($_SESSION['kensaku']);
  if ($kw == '') {
    header('Location: kaimono_kensaku_error.php');
    exit;
  }

  require 'database_connect.php';
  $kw = mysql_real_escape_string($kw);
  $res = mysql_query("SELECT * from KAIMONO WHERE TITLE Like '%" . $kw . "%' ; ");
  if (mysql_num_rows($res) == 0) {
    header('Location: kaimono_kensaku_error.php');
    exit;
  }

  header('Location:kaimono_kensaku.php');
  exit;

}

?>

http://php.net/manual/ja/function.header.php

id:aiomock

ご回答ありがとうございます。

2010/07/31 23:35:19
  • id:aiomock
    以下コードになります。

    <?


    if(isset($_POST["submit"]))
    {

    session_start();

    $_SESSION["kensaku"]="";
    $_SESSION["kensaku"]=$_POST["kensaku"];

    //以下検索で空白、データベースに登録されていないデータが検索された際のエラー処理を施しております。

    if($_SESSION["kensaku"]=="")
    {header('Location:kaimono_kensaku_error.php');}


    require "database_connect.php";

    $sql=mysql_query(" SELECT * from KAIMONO WHERE TITLE Like '%".$_SESSION["kensaku"]."%' ; ");

    if(!$sql)
    {header('Location:kaimono_kensaku_error.php');}

    header('Location:kaimono_kensaku.php');

    }


    ?>
    <html>
    <head>
    <meta content="text/html;charset=Shift_JIS" http-equiv="Content-Type">
    <title></title>
    </head>
    <body>
    <form method="post" action="kaimono.php">
    <center>
    <table border="1" bordercolor="gray" cellspacing="0" width="800">
    <tbody>
    <tr>
    <td><a href="http://www.aiomock2008.sakura.ne.jp/index.html"><img
    src="http://www.aiomock2008.sakura.ne.jp/title.jpg" border="0"></a><br>
    </td>
    </tr>
    </tbody>
    </table>
    <table border="0" bordercolor="gray" cellspacing="0">
    <tbody>
    <tr>
    <td height="10" width="150"><a
    href="http://www.aiomock2008.sakura.ne.jp/index.html"><img
    src="http://www.aiomock2008.sakura.ne.jp/1.jpg"
    onmouseover="this.src='6.jpg'" onmouseout="this.src='1.jpg'" border="0"></a>
    </td>
    <td height="10" width="150"><a
    href="http://www.aiomock2008.sakura.ne.jp/syoukai.html"><img
    src="http://www.aiomock2008.sakura.ne.jp/2.jpg"
    onmouseover="this.src='7.jpg'" onmouseout="this.src='2.jpg'" border="0"></a>
    </td>
    <td height="10" width="150"><a
    href="http://www.aiomock2008.sakura.ne.jp/kaimono.html"><img
    src="http://www.aiomock2008.sakura.ne.jp/3.jpg"
    onmouseover="this.src='8.jpg'" onmouseout="this.src='3.jpg'" border="0"></a></td>
    <td height="10" width="150"><a
    href="http://www.aiomock2008.sakura.ne.jp/taiken.html"><img
    src="http://www.aiomock2008.sakura.ne.jp/4.jpg"
    onmouseover="this.src='9.jpg'" onmouseout="this.src='4.jpg'" border="0"></a>
    </td>
    <td height="10" width="150"><a
    href="http://www.aiomock2008.sakura.ne.jp/toiawase.html"><img
    src="http://www.aiomock2008.sakura.ne.jp/5.jpg"
    onmouseover="this.src='10.jpg'" onmouseout="this.src='5.jpg'"
    border="0"></a></td>
    </tr>
    </tbody>
    </table>
    <table border="1" bordercolor="gray" cellspacing="0">
    <tbody>
    <tr>
    <td style="vertical-align: top;">
    <table>
    <tbody>
    <tr>
    <td border="1" bgcolor="#99ffff" width="200"><br>
        <span style="font-weight: bold;">- 商品検索 -</span><br>
    <br>
    <input name="kensaku" size="25" type="txt"> <input
    name="submit" value="検索" type="submit"> <br>
    <br>
    </td>
    <td rowspan="2" valign="top" width="600"><br>
    <img src="http://www.aiomock2008.sakura.ne.jp/kaimono.jpg">
    <br>
    <br>
    <small>宮崎農園では毎朝取れたての農作物を直送便にてお客様にお届けし
    ております。<br>
    その為 新鮮でおいしい野菜をご家庭で味わう事が可能です。<br>
    <br>
    宮崎農園の野菜の魅力はたくさんあります。<br>
    <br>
    1:</small><small>無農薬野菜のため【 </small><small>健康に良く  </small><small>】、また、</small><small>【 < /small><small>農
    作物本来の味</small><small> </small><small>】< /small><small>を楽しめます。</small><small><br>
    2:</small><small>【 </small><small>昼夜の温度差の激しい気候 </small><small> </small><small>】</small> <small>に
    恵まれ実が非常に引き締まっています。</small><br>
    <small>3:お客様との直接取引を実現したため</small><small>【 </small><small>安
    くておいしい野菜</small><small> </small><small>】</small><small>をお届けすることが可能です。<br>
    <br>
    農園スタッフが愛情を込めて作った農作物をこの機会に是非是非お求めくださいませ^^。<br>
    </small><br>
    <img src="http://www.aiomock2008.sakura.ne.jp/whatnew.jpg"><br>
    <small><br>
    商品を新しい順から表示しております。</small><br>
    <br>
    <br>

    <table border="0" ><tr>

    <td align="center" valign="center">

    <?


    require "database_connect.php";

    $sql=mysql_query(" SELECT * FROM `KAIMONO` ORDER BY `BANGOU` DESC LIMIT 0 ,1 ; ");

    while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {

    echo "<a href=\"KAIMONO/".$row["BANGOU"].".php\"><img src=\"PICTURE/mini_pic/".$row["BANGOU"].".jpg\"></a><Br><Br><font size=\"-1\">

    ".$row["TITLE"]."</font>";
    }



    ?>

    </td>

    <td align="center" valign="center">

    <?


    require "database_connect.php";

    $sql=mysql_query(" SELECT * FROM `KAIMONO` ORDER BY `BANGOU` DESC LIMIT 1 ,1 ; ");

    while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {

    echo "<a href=\"KAIMONO/".$row["BANGOU"].".php\"><img src=\"PICTURE/mini_pic/".$row["BANGOU"].".jpg\"></a><Br><Br><font size=\"-1\">

    ".$row["TITLE"]."</font>";
    }



    ?>

    </td>

    <td align="center" valign="center">

    <?


    require "database_connect.php";

    $sql=mysql_query(" SELECT * FROM `KAIMONO` ORDER BY `BANGOU` DESC LIMIT 2 ,1 ; ");

    while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {

    echo "<a href=\"KAIMONO/".$row["BANGOU"].".php\"><img src=\"PICTURE/mini_pic/".$row["BANGOU"].".jpg\"></a><Br><Br><font size=\"-1\">

    ".$row["TITLE"]."</font>";
    }



    ?>

    </td>

    </tr></table>

    <br>
    <br>
    <img
    src="http://www.aiomock2008.sakura.ne.jp/kaimono2.jpg"> <br>
    <br>
    <small>宮崎農園の人気商品です。<br>
    ご家庭で利用される方だけでなく、遠くの旦那さんや息子さん、お世話になった人への贈り物としてのご利用はいかがでしょうか。<br>
    この機会に是非宮崎農園をご利用くださいませ。</small>

    <br><Br>

    <table border="0" ><tr>

    <td align="center" valign="center">

    <?


    require "database_connect.php";

    $sql=mysql_query(" SELECT * FROM `KAIMONO` ORDER BY `NINKI` DESC LIMIT 0 ,1 ; ");

    while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {

    echo "<a href=\"KAIMONO/".$row["BANGOU"].".php\"><img src=\"PICTURE/mini_pic/".$row["BANGOU"].".jpg\"></a><Br><Br><font size=\"-1\">

    ".$row["TITLE"]."</font>";
    }



    ?>

    </td>

    <td align="center" valign="center">

    <?


    require "database_connect.php";

    $sql=mysql_query(" SELECT * FROM `KAIMONO` ORDER BY `NINKI` DESC LIMIT 1 ,1 ; ");

    while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {

    echo "<a href=\"KAIMONO/".$row["BANGOU"].".php\"><img src=\"PICTURE/mini_pic/".$row["BANGOU"].".jpg\"></a><Br><Br><font size=\"-1\">

    ".$row["TITLE"]."</font>";
    }



    ?>

    </td>

    <td align="center" valign="center">

    <?


    require "database_connect.php";

    $sql=mysql_query(" SELECT * FROM `KAIMONO` ORDER BY `NINKI` DESC LIMIT 2 ,1 ; ");

    while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {

    echo "<a href=\"KAIMONO/".$row["BANGOU"].".php\"><img src=\"PICTURE/mini_pic/".$row["BANGOU"].".jpg\"></a><Br><Br><font size=\"-1\">

    ".$row["TITLE"]."</font>";
    }



    ?>

    </td>

    </tr></table>






    </td>
    </tr>
    <tr>
    <td bgcolor="pink">
    <div style="text-align: center;"><br>
    <iframe
    src="http://www.aiomock2008.sakura.ne.jp/kaimono_menu.php"
    name="WhatsNewSample" cellpadding="0" height="700" width="180">インラインフレー
    ム対応ブラウザでご覧いただけま
    す。 </iframe><br>
    </div>
    <br>
    </td>
    </tr>
    </tbody>
    </table>
    </td>
    </tr>
    <tr>
    <td colspan="2" align="center">
    <center><img
    src="http://www.aiomock2008.sakura.ne.jp/sitaba.jpg"><br>
    </center>
    </td>
    </tr>
    </tbody>
    </table>
    </center>
    </form>
    </body>
    </html>

  • id:tasklight
    No.1で回答した者です。
    最後の4行を以下のように訂正してください。失礼しました。

    $res = mysql_query("SELECT * from KAIMONO WHERE TITLE Like '%" . $kw . "%' ; ");
    if (mysql_num_rows($res) == 0) {
    header('Location: kaimono_kensaku_error.php');
    }

  • id:tasklight
    SQLインジェクションの件ですが、コメントにあるスクリプトのままでは、DELETE構文を実行される恐れがあります。入力値をそのままSQLに渡してはいけません。
    mysql_real_escape_string関数を使ってエスケープするのが最低限の回避策です。
  • id:aiomock
    ご回答ありがとうございます。
    未だにスクリプト実行できません。。ページ移動できないです。。

    SQLインジェクションのアドバイス誠にありがとうございます。
  • id:aiomock
    現在以下の様にコードはなっております。。

    if(isset($_POST["submit"]))
    {

    session_start();
    $_SESSION['kensaku']=$_POST["kensaku"];

    $kw = trim($_SESSION['kensaku']);
    if ($kw == '') {
    header('Location: kaimono_kensaku_error.php');
    }

    require 'database_connect.php';
    $kw = mysql_real_escape_string($kw);
    $res = mysql_query("SELECT * from KAIMONO WHERE TITLE Like '%" . $kw . "%' ; ");
    if (mysql_num_rows($res) == 0) {
    header('Location: kaimono_kensaku_error.php');
    }


    header('Location:kaimono_kensaku.php');

    }

  • id:rouge_2008
    回答オープン前ですが、ちょっと確認と修正を・・・
    検索ワードが送信された場合に、セッションに格納して「kaimono_kensaku.php」に飛ばすだけでいいのではないかと思いました。
    データベースへの接続と検索ワードのエスケープ、SQL文の発行等は、移動先の「kaimono_kensaku.php」の方で処理してください。


    (~略~){
    // require "database_connect.php";
    // $_SESSION["kensaku"] = mysql_real_escape_string($_POST["kensaku"]);
    // $sql=mysql_query(" SELECT * from KAIMONO WHERE TITLE Like '%".$_SESSION["kensaku"]."%'");
    $_SESSION["kensaku"] = $_POST["kensaku"];
    header('Location:kaimono_kensaku.php');
    }

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません