【问题标题】:Passing variable in function在函数中传递变量
【发布时间】:2011-05-17 00:31:42
【问题描述】:

这是一个排序脚本。我想按投票排序我的帖子。我在函数中使用 if 语句来检查选择的顺序并据此显示帖子。

以下函数在我的查询中插入数据。

function vote_orderby( $orderby )
{
  global $vote_sort;

  if( $vote_sort == "most_voted") {
     // order by most votes
     return "votes DESC"; //inserts into query
  }

  // return default order by if no votes
  return $orderby;
}

HTML

$vote_sort = "most_voted"; //should be picked up by function

..function
..loop

我要生成,

$query = "SELECT * FROM posts ORDER BY votes DESC";

但是帖子是按日期排序的。但是,它可以在没有 if 语句的情况下工作,这可以确保我没有 MYSQL 错误。

如何将$vote_sort 值传递给函数?

注意:我知道 SQL 注入风险,我会尽快过滤所有内容。

【问题讨论】:

    标签: php mysql database function variables


    【解决方案1】:

    要回答您的评论并扩展上面迈克尔的解决方案,您可能想要这样做...

     function vote_orderby($orderby) {  
        switch($orderby) {
           // Sort by most votes
           case 'most_voted': $sort = 'votes DESC'; break;
           // Sort by least votes
           case 'least_voted': $sort = 'votes ASC'; break;
           // Default to most votes if does not match any other option
           default: $sort = 'votes DESC'; break;
        }
        return $sort; // Return query statement
     }
    

    那么你的查询语句将是这样的......

    $sortby = $_GET['sort']; // However you want to get the way to sort
    // If $sortby is empty, it will default to most_voted via function
    $order = vote_orderby($sortby);
    $query = "SELECT * FROM posts ORDER BY ".$order;
    

    这更像是一种永久性的系统编码方式,可以防止人们注入您的 MYSQL 查询,以后不会出现小错误。

    我过去编写过许多类似的系统,这是最好的方法之一。

    【讨论】:

    • 感谢代码看起来不错!但是由于某种原因,它总是使用默认开关。我不认为它在使用 $sortby 变量。我什至尝试过$sortby = "least_voted",它仍然使用默认值。似乎有些不对劲。
    • 您是否尝试从变量 $order 中回显结果以查看函数实际返回的内容?这样您就可以确定该开关是否与该功能正确,并且数据库可能已关闭。尝试这样做并让我知道结果:)
    【解决方案2】:

    你可能想要这样的东西:

     function vote_orderby( $orderby='most_voted' ) {  
       if( $orderby == "most_voted") {    
          // order by most votes  
          return "votes DESC"; //inserts into query  
       }  
    
      // return default order by if no votes  
     return $orderby;  
     }
    

    在您的查询中,您想要与此类似的东西

    // this will give you the default;
    $orderby = vote_orderby();
    $query = 'SELECT * FROM posts ORDER BY ' . $orderby;
    

    或者

    // this will give you the name;
    $orderby = vote_orderby('NAME DESC');
    $query = 'SELECT * FROM posts ORDER BY ' . $orderby;
    

    但您可能只想为排序方法设置一个变量并将其传递给您的查询。在函数中执行此操作有点矫枉过正,或者您可以在其中添加整个查询并返回正确的查询。

    【讨论】:

    • 感谢您的回答!使用您的代码,$order_by 变量将返回 votes DESC。我需要most_voted,这个值也可以更改为least_voted。我还应该提到该功能是用于查询帖子的 WordPress 过滤器的一部分。 $orderby 仅用于修改 MYSQL。我需要一个单独的变量来处理排序。
    猜你喜欢
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2020-07-02
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多