PHP模式 - 我该如何编写这段代码?

时间:2011-01-14 16:59:29

标签: php

我想制作一个类别系统CMS。一切都很好,除了一个大麻烦。

我如何处理和生成mysql查询取决于一些输入,如:

  

site.com/some-category&sortby=views&from=smt&anotherInput=key

例如,对于此输入,我的查询应该类似于

SELECT * FROM `articles` WHERE from='smt' AND afield='key' ORDER BY VIEWS

但这些输入会有所不同。我怎么写这段代码?我对设计模式了解不多,但是,我听说过Factory模式,这是我解决方案的一部分吗?

4 个答案:

答案 0 :(得分:1)

工厂模式可以帮助您连接/查询各种数据库而无需重写整个代码。这与查询本身无关。

您可以查看PDO扩展,我通常将它与预准备语句一起使用。 它会让你写这样的查询:

$prepare = $db->prepare('
    SELECT 
      *
    FROM
      articles
    WHERE
      from=:from AND afield=:afield
    ORDER BY
      views
');

$prepare->bindValue(':from', $_GET['from'], PDO::PARAM_STR);
$prepare->bindValue(':afield', $_GET['afield'], PDO::PARAM_STR);

$prepare->execute();

return $prepare;

关于它的好处是你不需要保护它免受sql注入,因为PDO为你做了。此外,查询被缓存,您可以使用不同的参数多次运行它。

答案 1 :(得分:0)

直接在查询中使用原始GET参数的非常糟糕的做法,即你不应该像

这样构造

SELECT * FROM articles WHERE from = $ _ GET ['from'] AND afield ='key'ORDER BY VIEWS 而是喜欢的东西 if($ _GET ['from'] =='smt')$ from from''smt'

SELECT * FROM articles WHERE from ='$ from'AND afield ='key'ORDER BY VIEWS

等等

P.S。关键字是'sql injection'

答案 2 :(得分:0)

您可以根据需要构建查询字符串:

$query = "SELECT * FROM `articles` WHERE 1 = 1";

$where = ''

if (isset($_GET['from'])) {
    $where .= " AND `from` = '" . mysql_real_escape_string($_GET['from']) . "'"
}

if (isset($_GET['anotherInput'])) {
    $where .= " AND `from` = '" . mysql_real_escape_string($_GET['anotherInput']) . "'"
}

if (isset($_GET['sortby'] == 'views') {
    $orderby = " ORDER BY `views` DESC"
} else {
    $orderby = " ORDER BY `id` DESC"
}

$query = $query . $where . $orderby;

$result = mysql_query($query);

这是一种直接的PHP / MySQL方式,但实际上我建议您使用Pavel Dubinin的答案中的预准备语句。

答案 3 :(得分:-1)

这与模式无关。使用$_GET超全局变量动态生成查询字符串。

$query = "SELECT * FROM articles WHERE from='".
         $_GET['from'].
         "' AND afield='".
         $_GET['anotherInput'].
         "' ORDER BY ".
         $_GET['sortby'];

免责声明:这很容易引入SQL。在生产环境中使用输入转义和预准备语句(例如PDO):

$query = "SELECT * FROM articles WHERE from='?' AND afield='?' ORDER BY ?";
$clean_from = htmlentities($_POST['from'], ENT_QUOTES, 'UTF-8');
$clean_anotherInput = htmlentities($_POST['anotherInput'], ENT_QUOTES, 'UTF-8');
$clean_sortby = htmlentities($_POST['sortby'], ENT_QUOTES, 'UTF-8');
$clean_inputs = array($clean_from, $clean_anotherInput, $clean_sortby);

$sth = $dbh->prepare($query);
$sth->execute($clean_inputs);