我想制作一个类别系统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模式,这是我解决方案的一部分吗?
比
答案 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);