我试图让SQL查询变得动态。
以下是我采取的步骤:
第1步:
//Here the user sets which table fields will be used:
<input type="checkbox" name="id" value="1"> ID
<input type="checkbox" name="name" value="1"> name
<input type="checkbox" name="email" value="1"> email
第2步:
//Here I see what fields the user wants to use and set a variable to 1
<?php
if (isset($_POST['id']) && $_POST['id'] == "1")
{
$form_id='1';
}
//etc etc
?>
第3步:
//And finally here's the sql query
$sql = mysql_query("select * from mytable");
现在我需要将用户选择的字段设置为查询。
例如,如果用户仅选中 <{strong> id
和name
,那么它应如下所示:
$sql = mysql_query("select id, name from $table");
最好的方法是什么?
答案 0 :(得分:3)
为什么不将所有字段名称推送到数组中而不是设置不同的变量?
$fields = [];
if(isset($_POST['id']) && $_POST['id'] == 1) {
$fields[] = 'id';
}
然后你应该能够将数组一起内爆以获得你的选择列:
$fields = implode(', ', $fields);
另外,@ h2ooooo是正确的,请避免使用mysql_
函数。它们被删除,将在PHP的未来版本中删除。
答案 1 :(得分:1)
基本解决方案是检查设置了哪些参数并等于1,如果是这样的话,将列名称推送到数组中。
然后,您可以遍历数组并将字段连接到查询,使其动态。
此处最大的问题是您使用mysql_* deprecated函数。我建议使用PDO,因为我发现它们使用起来既舒适又方便,但mysqli也可行。
使用PDO和mysqli,您可以使用prepared-statements 防止注射的最佳方法,所以请使用它们。
<强>解决方案强>
使用ternary运算符,我们可以检查设置了哪些参数,并相应地指定字段名称。
$id = isset($_POST['id']) && $_POST['id'] == 1 ? 'id' : null;
$name = isset($_POST['name']) && $_POST['name'] == 1 ? 'name' : null;
$email = isset($_POST['email']) && $_POST['email'] == 1 ? 'email' : null;
我这样做是因为我发现三元运算符比更漂亮而不是多个if语句。
让我们构建一个包含我们刚创建的变量的数组:
$parameters = array($id, $name, $email);
只需检查哪些字段不是null
,我们就可以轻松构建列数组。
$columns = array();
foreach($parameters as $column)
{
if($column != null)
{
$columns[] = $column;
}
}
最后,我们可以将implode列放在一起,用逗号分隔:
$activeColumns = implode(",", $columns);
因此,您可以使用$activeColumns
作为查询的一部分,然后建议您在之后做好准备。
答案 2 :(得分:1)
只需你可以使用! empty()函数而不是isset()&amp;&amp; $ _POST [ 'ID'] == 1
$select_fields = array();
if(!empty($_POST['id']))
$select_fields[] = 'id';
if(!empty($_POST['name']))
$select_fields[] = 'name';
if(!empty($_POST['email']))
$select_fields[] = 'email';
$query_fields = implode(', ', $select_fields);
$sql = mysql_query("select $query_fields from $table");