准备好的查询中的可选where子句

时间:2017-03-21 22:54:29

标签: php mysql mysqli prepared-statement shortest-path

这是一个关于代码优化的问题,因为我的代码运行良好,但我认为有一种更简单的方法来做我做的事情,我解释说,我有一个管理界面,管理员可以搜索课程,但搜索可以是特定的,我的意思是你可以通过作者或/和按类别或/和学校搜索,如果你不选择任何这些选项,它将返回所有课程,所以这里是我的代码,它的工作我使用逻辑,因为我发送一个名为$param的数组,包含3个值。查看$query值,它只会更改Where子句

Author School Category
   0     0       0
   0     0       1
   0     1       0 
   0     1       1 
   1     0       0 
   1     0       1
   1     1       0
   1     1       1  

我的代码以同样的方式工作

if(($param[0]==0)&&($param[1]==0)&&($param[2]==0))
    $query = "SELECT idCurso, tema, indice, descripcion, fecha, idioma, imagenes.ubicacion as imgLocation, enlaces, nivel, keywords, autorId, escuelasId, categoriaId, subcategoriaId FROM plataforma.cursos INNER JOIN imagenes ON imagenes.idImagen = cursos.imagenId  ";

else if( ($param[0]==0)  &&  ($param[1]==0) && (intval($param[2])>=1)){
    $query = "SELECT idCurso, tema, indice, descripcion, fecha, idioma, imagenes.ubicacion as imgLocation, enlaces, nivel, keywords, autorId, escuelasId, categoriaId, subcategoriaId FROM plataforma.cursos INNER JOIN imagenes ON imagenes.idImagen = cursos.imagenId WHERE categoriaId = ?;";
}
else if( ($param[0]==0)  &&  ( intval($param[1])>=1) && ($param[2]==0)){
    $query = "SELECT idCurso, tema, indice, descripcion, fecha, idioma, imagenes.ubicacion as imgLocation, enlaces, nivel, keywords, autorId, escuelasId, categoriaId, subcategoriaId FROM plataforma.cursos INNER JOIN imagenes ON imagenes.idImagen = cursos.imagenId WHERE escuelasId = ?; ";
}
else if( ($param[0]==0)  &&  ( intval($param[1])>=1) && (intval($param[2])>=1)){
    $query = "SELECT idCurso, tema, indice, descripcion, fecha, idioma, imagenes.ubicacion as imgLocation, enlaces, nivel, keywords, autorId, escuelasId, categoriaId, subcategoriaId FROM plataforma.cursos INNER JOIN imagenes ON imagenes.idImagen = cursos.imagenId  WHERE escuelasId = ? AND categoriaId = ?; ";
}
else if( ( intval($param[0])>=1)  &&  ($param[1]==0) && ($param[2]==0)){
    $query = "SELECT idCurso, tema, indice, descripcion, fecha, idioma, imagenes.ubicacion as imgLocation, enlaces, nivel, keywords, autorId, escuelasId, categoriaId, subcategoriaId FROM plataforma.cursos INNER JOIN imagenes ON imagenes.idImagen = cursos.imagenId  WHERE autorId = ?; ";
}
else if( ( intval($param[0])>=1)  &&  ($param[1]==0) && (intval($param[2])>=1)){
    $query = "SELECT idCurso, tema, indice, descripcion, fecha, idioma, imagenes.ubicacion as imgLocation, enlaces, nivel, keywords, autorId, escuelasId, categoriaId, subcategoriaId FROM plataforma.cursos INNER JOIN imagenes ON imagenes.idImagen = cursos.imagenId   WHERE autorId = ? AND categoriaId = ?;";
}
else if( ( intval($param[0])>=1)  &&  ( intval($param[1])>=1) && ($param[2]==0)){
    $query = "SELECT idCurso, tema, indice, descripcion, fecha, idioma, imagenes.ubicacion as imgLocation, enlaces, nivel, keywords, autorId, escuelasId, categoriaId, subcategoriaId FROM plataforma.cursos INNER JOIN imagenes ON imagenes.idImagen = cursos.imagenId  WHERE autorId = ? AND escuelasId = ?; ";
}
else if( ( intval($param[0])>=1)  &&  ( intval($param[1])>=1) && (intval($param[0])>=1)){
    $query = "SELECT idCurso, tema, indice, descripcion, fecha, idioma, imagenes.ubicacion as imgLocation, enlaces, nivel, keywords, autorId, escuelasId, categoriaId, subcategoriaId FROM plataforma.cursos INNER JOIN imagenes ON imagenes.idImagen = cursos.imagenId  WHERE autorId = ? escuelasId = ? AND categoriaId = ?;";
}
//"asi quedo ".$query;
if ($stmt = $mysqli->prepare($query)) {



    /* bind result variables */
    if(($param[0]==0)&&($param[1]==0)&&($param[2]==0)) {

    }
    if( ($param[0]==0)  &&  ($param[1]==0) && (intval($param[2])>=1)){
        $stmt->bind_param("s",$param[2]);
        //echo $param[2];
    }
    if( ($param[0]==0)  &&  ( intval($param[1])>=1) && ($param[2]==0)){
        $stmt->bind_param("i",$param[1]);
    }
    if( ($param[0]==0)  &&  ( intval($param[1])>=1) && (intval($param[2])>=1)){
        $stmt->bind_param("ii",$param[1],$param[2]);
    }
    if( ( intval($param[0])>=1)  &&  ($param[1]==0) && ($param[2]==0)){
        $stmt->bind_param("i",$param[0]);
    }
    if( ( intval($param[0])>=1)  &&  ($param[1]==0) && (intval($param[2])>=1)){
        $stmt->bind_param("ii",$param[0],$param[2]);
    }
    if( ( intval($param[0])>=1)  &&  ( intval($param[1])>=1) && ($param[2]==0)){
        $stmt->bind_param("ii",$param[0],$param[1]);
    }
    if( ( intval($param[0])>=1)  &&  ( intval($param[1])>=1) && (intval($param[0])>=1)){
        $stmt->bind_param("iii",$param[0],$param[1],$param[2]);
    }
/* execute statement */
    $stmt->execute();

我设置$param[x]>=1因为如果值为0表示该字段未被选中但如果选中该字段则必须具有大于或等于1的值 就像我之前说过的,这段代码有效,但我知道它可以少一些,但我不知道方式

0 个答案:

没有答案