【问题标题】:mysql stored procedure skip null parametermysql存储过程跳过空参数
【发布时间】:2012-11-21 07:34:05
【问题描述】:

我想我在这里阅读了所有文章,但仍然无法让我的代码 100% 工作。我是一个 PHP 表单,用户可以根据 4 个位置中的任何一个进行搜索,也可以完全跳过它,在这种情况下应该跳过“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$$

每当我选择任何一个或多个位置时都可以正常工作,但如果我尝试跳过它则不起作用(它应该只选择最后一个 inAddDate 中的所有内容)。 如果我替换

(inLocation1 IS NULL OR downtown = inLocation1)

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

然后,如果我绕过该位置,它会选择所有内容,但如果我想搜索任何 2 个或更多位置,它不会返回任何内容。我相信一定有很好的方法来克服这个问题,因为我有更多的参数组要添加。

【问题讨论】:

  • “跳过”是什么意思?您能否澄清一下,最好是输入示例和预期结果,您希望发生什么以及何时发生。
  • 当然。因此 php/html 部分在 4 个主要位置搜索房屋中的添加帖子以供出租。然而,搜索提供了多种选择:租金、吸烟习惯等,所有这些都以相同的形式出现。大多数用户输入的形式是复选框:
  • 价值从何而来无关紧要。我说的是参数值和预期行为。尽可能清晰和准确。就目前而言,您的问题含糊不清。
  • 好的,我刚刚得到了一个“变通”的解决方案。
  • 好的,我刚刚得到了一个“变通”的解决方案。如果选中,我的复选框将参数 location1 设置为 'T'(true),如果未设置,则设置为 '',以此类推。问题是当它们没有设置(检查)时它没有显示任何东西,并且它们都通过了'',尽管我试图获取所有位置。现在我做了 and IF(!isset($_POST['location1'] AND (!isset($_POST['location2']...){$location1=$location2=..='T' ;} 并且它有效

标签: mysql stored-procedures parameters null where


【解决方案1】:

我的 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
    );

这个接缝工作得很好,但我很确定它应该是一个更优雅的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多