2015-12-15 140 views
-2

我有一個問題,我想查詢一下搜索表單數據,在這裏人們插入一些過濾器會搜索產品,在這個具體情況下出現的次數就少了房子。 用「or」做了一個查詢不如此,它使字段單獨使用,而「and」也不起作用,因爲我不希望用戶填寫所有字段,所以是他們想要的,所以我做了它在選擇mysql查詢時出錯

$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,並且需要很長時間。 如果有人知道一些有效和快捷的方法,請幫助我,因爲其實不知道還有什麼辦法來解決這個問題,謝謝

+0

首先,你是否開始會議?然後你有2個(有效)'?',但是3個在你的綁定中。你不在這裏檢查錯誤。請參閱以下鏈接http://php.net/manual/en/mysqli.error.php和http://php.net/manual/en/function.error-reporting.php 並將其應用於您的代碼。 –

+1

另外,你不能綁定列'WHERE?',並檢查錯誤會告訴你這個。這就是它失敗的原因。 –

+0

是的,我開始 session_start(); $ muda = $ _ SESSION [「muda」]; 我有3個? 哪裏? LIMIT?,? 「); –

回答

1

你不能綁定一部分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 ?,? "); 
+0

ahh okkei,ty ... –

-1

我猜你會需要包裝單個qoute的值''

例如:

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

應該

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

試試這個..我認爲這將解決這個問題

+0

如果'$ finalidade'是一個整數,那麼他們的代碼是有效/正確的。 –

+0

不,不工作... –

+0

@IgorPonte您之前沒有回覆過重要的問題。 '$ finalidade'的價值是什麼?它是一個字符串還是一個整數?字符串=「城市」整數='123' –

0

您可以使用前綴您$\_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的同樣的東西對象),它對我來說很好,只是適應你的情況下你的db 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(); 
+0

此代碼給我一個錯誤「致命錯誤:調用成員函數對非對象執行()「你能幫我嗎? –

+0

你可以把這段代碼放在我的代碼中嗎?請看我做錯了什麼? –