【问题标题】:String to Query for All Records in Table查询表中所有记录的字符串
【发布时间】:2012-06-25 18:00:35
【问题描述】:

当我单独拉出每个潜在客户状态(?leadstatus=New、?leadstatus=Hot 等)时,它们可以工作,但是当我尝试获取全部时,我似乎无法让它工作。如您所见,页面上的默认设置是新潜在客户。

`$query = "SELECT * FROM contacts WHERE contacttype IN ('New','Buyer','Seller','Buyer / Seller','Investor') AND leadstatus = 'New' ORDER BY date DESC";

    if(isset($_GET['leadstatus']) && in_array($_GET['leadstatus'], array('New', 'Hot', 'Warm', 'Cold', 'Rejected', 'Closed')))
    {      
    $status = $_GET['leadstatus'];   
    $query = "SELECT * FROM contacts WHERE leadstatus = '".$status."' ORDER BY contacts.date DESC";  
    }`

以下是我尝试过的一些字符串:

?leadstatus=New&leadstatus=Hot&leadstatus=Warm&leadstatus=Rejected&leadstatus=Cold - Only pulls last listed, which is Cold

?leadstatus[]=New&leadstatus=[]Hot&leadstatus[]=Warm&leadstatus[]=Rejected&leadstatus[]=Cold - Returns default, which is New

?leadstatus=New&Hot&Warm&Rejected&Cold 
  • 返回默认值,即新建

【问题讨论】:

  • 为什么不让 where 语句有条件呢?如果状态表明您想要所有记录,请删除 where 子句。

标签: php mysql query-string


【解决方案1】:
if(isset($_GET['leadstatus']) && $_GET['leadstatus'] == "all") {
    $query = "SELECT * FROM contacts ORDER BY contacts.date DESC";  
} else if (in_array($_GET['leadstatus'], array('New', 'Hot', 'Warm', 'Cold', 'Rejected', 'Closed'))) {      
    $status = $_GET['leadstatus'];   
    $query = "SELECT * FROM contacts WHERE leadstatus = '".$status."' ORDER BY contacts.date DESC";  
}

然后,让leadstatus = all。

【讨论】:

    【解决方案2】:

    试试这个:

    if(isset($_GET['leadstatus']) && in_array($_GET['leadstatus'], array('New', 'Hot', 'Warm', 'Cold', 'Rejected', 'Closed')))
    {      
      $status = $_GET['leadstatus'];   
      if(!empty($status)) {
        $query = "SELECT * FROM contacts WHERE leadstatus = '".$status."' ORDER BY contacts.date DESC";  
      } else {
        $query = "SELECT * FROM contacts ORDER BY contacts.date DESC"; 
      }
    }`
    

    但是,我还可以建议您使用参数化查询吗?您在这里很容易受到 SQL 注入攻击。

    【讨论】:

    • 它将在登录屏幕后面,所以没关系,对吧?
    • 它总是很重要!注入攻击很容易给攻击者很大的权力。例如,如果我提出一个请求,上面写着?leadstatus='; DROP TABLE contacts; -- Relevant: xkcd.com/327
    【解决方案3】:

    这样的东西应该匹配多个条件,允许您一次混合匹配多个条件,而不是一个或全部。

    $status = join(',',$_GET['leadstatus']); 
    $query = "SELECT * FROM contacts WHERE leadstatus IN($status) ORDER BY contacts.date DESC";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      相关资源
      最近更新 更多