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();
如果它们都是可选的,并且您在查询中使用它们,那么它们都应该有一个默认值。这是个好主意,但对我来说不起作用。