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

PHPについて質問です。

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

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

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

●質問者: aiomock
●カテゴリ:コンピュータ インターネット
✍キーワード:エラー コード データ データベース ボタン
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● tasklight
●50ポイント

この部分を

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

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インジェクション対策がなされていないようなので、このままインターネットに公開するのは危険なコードです。

◎質問者からの返答

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

変更してみましたが

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

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

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

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

'database_connect.php'

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

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

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

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


2 ● rouge_2008
●50ポイント

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');
}

}

?>

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

◎質問者からの返答

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


3 ● bayan
●100ポイント ベストアンサー

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



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