Php 动态编制报表

Php 动态编制报表,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我准备了这样的查询: $stmt = $mysqli->prepare("SELECT DISTINCT instr FROM raspisanie WHERE state='1' AND type!='free' AND instr=? AND school=? AND age=? AND startdate > NOW()"); $stmt->bind_param("sis", $get_instr, $get_school, $get_age); 然后像这样捆绑: $

我准备了这样的查询:

$stmt = $mysqli->prepare("SELECT DISTINCT instr FROM raspisanie WHERE state='1' AND type!='free' AND instr=? AND school=? AND age=? AND startdate > NOW()");
$stmt->bind_param("sis", $get_instr, $get_school, $get_age);
然后像这样捆绑:

$stmt = $mysqli->prepare("SELECT DISTINCT instr FROM raspisanie WHERE state='1' AND type!='free' AND instr=? AND school=? AND age=? AND startdate > NOW()");
$stmt->bind_param("sis", $get_instr, $get_school, $get_age);
问题是所有变量都是可选的。所以,若至少有一个变量为空,数据库将不返回任何内容。我认为我必须以某种方式使这个语句动态化(以排除准备好的参数和绑定参数之间的不平衡),但我不知道如何做到这一点


所以我必须对prepare和bind参数进行动态修改?什么是正确的方法?所有的变量都被从网站的表单中获取。

我找到了解决方案。这对我来说是完美的

$sql = "SELECT instr FROM schedule WHERE state=1 AND type!='free' AND startdate > NOW()";

$school=$_GET['school'];
$age=$_GET['age'];
$instrument=$_GET['instrument'];

if ($school==true)
{
$sql .= " AND school=?";
$bind[]=$school;
$type[0]='i';
}

if ($age==true)
{
$sql .= " AND (age=? OR mode='ind')";
$bind[]=$age;
$type[0].='s';
}

if ($instrument==true)
{
$sql .= " AND instr=?";
$bind[]=$instrument;
$type[0].='s';
}

$params=array_merge($type, $bind);

$stmt = $mysqli->prepare($sql);
call_user_func_array(array($stmt, 'bind_param'), $params);

$stmt->execute();
$stmt->bind_result($instr);
$stmt->close();

如果它们都是可选的,并且您在查询中使用它们,那么它们都应该有一个默认值。这是个好主意,但对我来说不起作用。