1

ここのすべての記事を読んだと思いますが、それでもコードを 100% 動作させることはできません。私は、ユーザーが 4 つの場所のいずれかに基づいて検索を実行したり、完全にスキップしたりできる PHP フォームです。その場合、「where location」句をスキップして次のパラメーター グループに移動する必要があります。私のmysqlストアドプロシージャは次のようになります。

CREATE PROCEDURE search( 
  IN inRoomsPerPage INT,
  IN inStartItem INT,
  IN inAddDate INT,
  IN inLocation1 ENUM('T','F'),
  IN inLocation2 ENUM('T','F'),
  IN inLocation3 ENUM('T','F'),
  IN inLocation4 ENUM('T','F')
)
BEGIN
SELECT * 
 FROM useradds as ua
 INNER JOIN household as hh on hh.idx_user_id = ua.idx_user_id
 INNER JOIN house as h on h.idx_user_id = ua.idx_user_id
 WHERE adddate >= (CURDATE() - INTERVAL inAddDate DAY) AND
 ((inLocation1 IS NULL OR downtown = inLocation1) OR 
 (inLocation2 IS NULL OR hwy = inLocation2) OR
 (inLocation3 IS NULL OR dewey = inLocation3) OR
 (inLocation4 IS NULL OR lewes = inLocation4))
 ORDER BY ua.adddate DESC
 LIMIT inStartItem, inRoomsPerPage;
 END$$

これは、1 つまたは複数の場所を選択するたびに正常に機能しますが、スキップしようとすると機能しません (最後の inAddDate のすべてを選択する必要があります)。交換したら

(inLocation1 IS NULL OR downtown = inLocation1)

downtown = COALESCE(NULLIF(inLocation1, ''), downtown))

次に、場所をバイパスするとすべてが選択されますが、2つ以上の場所を検索したい場合は何も返されません。パラメータグループを追加する場所がもっとあるので、これを乗り越えるための良い方法があるはずです。

4

1 に答える 1

0

私の php/html 部分は次のようになります。

<form action='' method='post'  >
    <select name='ckadddate'>
        <option value='1'>last 24 hours</option>
        <option value='3' selected>last 3 days</option>
        <option value='7'>last week</option></select>
in:<input type='checkbox' name='Downtown' >Downtown
     <input type='checkbox' name='Hwy' >HWY 1
      <input type='checkbox' name='Dewey'>Dewey
      <input type='checkbox' name='Lewes'>Lewes
<input name='SubmitSearch' type='submit' value='Search'>

ストアド プロシージャを呼び出す php 関数の部分は次のとおりです。

if(isset($_POST['SubmitSearch'])){
    $cklocation1 = $cklocation2= $cklocation3= $cklocation4= '';
    if(isset($_POST['Downtown']))$cklocation1 = 'T';
       if(isset($_POST['Hwy']))$cklocation2 = 'T';
       if(isset($_POST['Dewey']))$cklocation3 = 'T';
       if(isset($_POST['Lewes']))$cklocation4 = 'T';
    **if(!isset($_POST['Downtown']) && !isset($_POST['Hwy']) && !isset($_POST['Dewey']) && !isset($_POST['Lewes'])){
        $cklocation1 = $cklocation2= $cklocation3= $cklocation4= 'T';
    }**
$sql = 'CALL search_room(:RoomsPerPage, :StartItem,:Adddate,
:Location1,:Location2,:Location3,:Location4)';
$params = array (':RoomsPerPage' => ADDS_PER_PAGE, ':StartItem' => $start_item, 
':Adddate' => $_POST['ckadddate'],':Location1' => $cklocation1, 
':Location2' => $cklocation2, ':Location3' => $cklocation3, ':Location4' => $cklocation4
    );

これは問題なく機能しますが、よりエレガントなソリューションになるはずです。

于 2012-12-06T21:51:16.363 に答える