select中的mysql查询出错


Error in mysql query in select

我有一个问题,我想对搜索表单数据进行查询,人们在其中插入一些过滤器。在这种特定情况下,搜索产品会显示较少的房屋。已经用"或"进行了查询,但效果不如此,它使字段单独存在,并且"answers"也不起作用,因为我不希望用户填写所有字段,他们想要的也是,所以我做了

$texto = array();
$contador=0;
if($_SESSION["finalidade"]!=""){
    $contador++;
    $texto[1]="`finalidade` LIKE ".$finalidade;}
if($_SESSION["tipoimovel"]!=""){
    $contador++;
    $texto[2]="`tipoimovel` LIKE ".$tipoimovel;}
if($_SESSION["nquarto"]!=0){
    $contador++;
    $texto[3]="`nquartos` = ".$nquarto;}
if($_SESSION["pmin"]!=0){
    $contador++;
    $texto[4]="`preco` > ".$pmin;}
if($_SESSION["pmax"]!=0){
    $contador++;
    $texto[5]="`preco` < ".$pmax;}
if($_SESSION["elevador"]!=""){
    $contador++;
    $texto[6]="`elevador` LIKE ".$elevador;}
if($_SESSION["garagem"]!=""){
    $contador++;
    $texto[7]="`garagem` LIKE ".$garagem;}
if($_SESSION["vistapriv"]!=""){
    $contador++;
    $texto[8]="`vistapreveligiada` LIKE ".$vistapriv;}
if($_SESSION["piscina"]!=""){
    $contador++;
    $texto[9]="`piscina` LIKE ".$piscina;}
if($_SESSION["jardim"]!=""){
    $contador++;
    $texto[10]="`jardim` LIKE ".$jardim;}
if($_SESSION["condominiof"]!=""){
    $contador++;
    $texto[11]="`condominio` LIKE ".$condominiof;}
if($_SESSION["conselho"]!=""){
    $contador++;
    $texto[12]="`conselho` LIKE ".$conselho;}
if($_SESSION["frequesia"]!=""){
    $contador++;
    $texto[13]="`frequesia` LIKE ".$frequesia;}
if($_SESSION["refimovel"]!=""){
    $contador++;
    $texto[14]="`referencia` LIKE ".$refimovel;}
    $textocompleto="";

$contador2=1;
for($y = 0; $y < 16; $y++) {
    if($texto[$y]!=""){
        if($contador2==1 && $contador2!=$contador){
            $contador2++;
            ;
        $textocompleto=$texto[$y]." AND ";  }
        elseif($contador2==$contador){
            $contador2++;
        $textocompleto=$textocompleto.$texto[$y];}
        elseif($contador2==1 && $contador2==$contador){
            $contador2++;
        $textocompleto=$texto[$y];  }
        else {
            $contador2++;
        $textocompleto=$textocompleto.$texto[$y]." AND ";}

    }

}
$results = $mysqli->prepare("SELECT ID, imagem, frequesia ,conselho, preco FROM `imovel` WHERE ?  ORDER BY `imovel`.`preco` DESC LIMIT ?,? ");
$results->bind_param("sii",$textocompleto,  $page_position, $item_per_page);
$results->execute();
$results->bind_result($id ,$imagem, $frequesia ,$conselho, $preco); //bind variables to prepared statement
} 

问题是,这不是我的回报,没有给我任何价值。已经不知道还能做什么了,因为如果你为每种可能性做一个if,就会给出100多个if,而且需要很长时间。如果有人知道一些有效和快速的方法来做到这一点,请帮助我,因为事实上不知道还能做什么来解决这个问题,谢谢

不能绑定SQL语句的部分,只能绑定值。

所以这是有效的:

$results = $mysqli->prepare("SELECT col1, col2 FROM tbl WHERE col3 = ?");
$results->bind_param("i", 1234);

而这不是:

$results = $mysqli->prepare("SELECT col1, col2 FROM tbl WHERE ?");
$results->bind_param("s", "col3 = 1234");

不过,您可以连接字符串:

prepare("SELECT ... WHERE ".$textocompleto." ORDER BY imovel.preco DESC LIMIT ?,? ");

您可以在$'_SESSION变量上为所有必填字段使用前缀,如sf_{variable_name}。之后,您可以在它们之间循环以构建查询(ps : code not tested):

$sql = "SELECT ";
$sql_cond = " WHERE ";
$texto = [];
foreach($_SESSION as $k => $v){
    if(substr($v, 0, 3) == "sf_"){
        $name = substr($k, 3, strlen($k))
        $texto[$name] = $v;
        $sql .= $name.", ";
        $sql_cond .= $name." LIKE :".$name;
    }
}
$final_sql = $sql.$sql_cond;
$results = $mysqli->prepare($final_sql);
foreach($texto as $k => $v){
    $results->bind_param(":".$k, "%".$v."%");
}
$results->execute();

好吧,经过一些测试,我在媒体的测试数据库中对PDO对象做了同样的处理(PDO与MYSQLI对象几乎是一样的东西),它对我来说很好,只需根据您的情况调整您的数据库ID即可

$pdo = new PDO('mysql:host=localhost;dbname=media_center', 'root', 'root');
$_SESSION["sf_title"] = "Interstellar";
$_SESSION["sf_description"] = "sci-fi";
$sql = "SELECT * ";
$sql_cond = " WHERE ";
$texto = [];
foreach($_SESSION as $k => $v){
    if(substr($k, 0, 3) == "sf_"){
        $name = substr($k, 3, strlen($k));
        $texto[$name] = $v;
        $sql_cond .= $name." LIKE :".$name." OR ";
    }
}
$sql_cond = substr($sql_cond, 0, strlen($sql_cond)-4);
$final_sql = $sql." FROM media ".$sql_cond;
$results = $pdo->prepare($final_sql);
foreach($texto as $k => $v){
    $key = ":".$k;
    $value = "%".$v."%";
    $results->bindParam($key, $value);
}
$results->execute();

我想您需要将值包装在单个qoute ''

例如:

$texto[1]="`finalidade` LIKE ".$finalidade;

应该是

$texto[1]="`finalidade` LIKE '".$finalidade."'";

试试这个。。我认为它会解决