2017-03-13 120 views
1

我有一個問題準備SQL語句:多個變量PHP

$statement = $conexion->prepare(
    'SELECT * FROM celulares 
    WHERE (MARCA = :marca) 

    AND 

    (CATEGORIA = :categoria1 OR CATEGORIA = :categoria2 OR CATEGORIA = :categoria3) 

    AND 

    (CATEGORIA2 = :categoria1 OR CATEGORIA2 = :categoria2 OR CATEGORIA2= :categoria3) 

    AND 

    (CATEGORIA3 = :categoria1 OR CATEGORIA3 = :categoria2 OR CATEGORIA3 = :categoria3)'); 

給予佔位符值與此:我的應用程序取決於開始時

$statement->execute(array(':categoria1' => $categoria1, 
         ':categoria2' => $categoria2, 
         ':categoria3' => $categoria3, 
         ':marca' => $query 
       )); 

$查詢值可能變動內容對一些結果:

if ($entrada == "LG") { 
      if ($query == "") { 
        $query = "LG"; 
      } else { 
        $query = $query . ' OR MARCA = "LG" '; 
      } 
    } 
if ($entrada == "APPLE") { 
      if ($query == "") { 
        $query = "APPLE"; 
      } else { 
        $query = $query . ' OR MARCA = "APPLE" '; 
      } 
    } 

    if ($entrada == "HUAWEI") { 
      if ($query == "") { 
        $query = "HUAWEI"; 
      } else { 
        $query = $query . ' OR MARCA = "HUAWEI" '; 
      } 
    } 

我嘗試了很多東西,但沒有一個解決了它返回一個空的a rray,誰的作品是唯一一個正在改變這一行我準備好的聲明的:

WHERE (MARCA = :marca OR MARCA = :marca2 OR MARCA = :marca3) 

而且許多「馬卡報」的結果,我認爲這是不這樣做的最好辦法

更新:

現在中陳述我的查詢試圖(感謝大家對我的幫助)

現在它看起來像:

$marcas = array("LG", "HUAWEI"); (Static values for test) 
$inQuery = implode(',', array_fill(0, count($marcas), '?')); 

$statement = $conexion->prepare(
'SELECT * FROM celulares 
WHERE (MARCA = IN (' . $inQuery . ')) 

AND 

(CATEGORIA = :categoria1 OR CATEGORIA = :categoria2 OR CATEGORIA = :categoria3) 

AND 

(CATEGORIA2 = :categoria1 OR CATEGORIA2 = :categoria2 OR CATEGORIA2= :categoria3) 

AND 

(CATEGORIA3 = :categoria1 OR CATEGORIA3 = :categoria2 OR CATEGORIA3 =  :categoria3)'); 


foreach ($marcas as $k => $marca) { 
$statement->bindValue(($k+1), $marca); 

} 

$statement->bindValue(':categoria1', $categoria1); 
$statement->bindValue(':categoria2', $categoria2); 
$statement->bindValue(':categoria3', $categoria3); 

$statement->execute(); 

獲取:警告:PDOStatement對象::執行():SQLSTATE [HY093]:無效的參數號:混合命名和位置參數

試圖修復它

+0

看看(HTTP [我可以將一個數組綁定到一個IN()條件?]:// STAC koverflow.com/questions/920353/can-i-bind-an-array-to-an-in-condition)和[FIND_IN_SET()vs IN()](http://stackoverflow.com/questions/4155873/find -in-set-vs-in) – mrun

+0

我認爲你需要在你的查詢中使用IN語句,並在php代碼中使用switch-case。 –

+0

我不認爲你可以在preparedStatement中設置一個參數值,當這個值實際上是一個SQL語句,就像這個'$ query = $ query。 'OR MARCA =「APPLE」',這看起來像sql-injection,這是PS創建的原因之一。到protected/escape ...所以你的查詢值可能會插入爲文本(轉義)我建議你傳遞一個數組作爲'MARCAs'的$ query'列表,然後你用它來建立你的SQL:'「MARCA = val1 OR MARCA =:val2「'..。.etc基於marcas數組長度,然後設置參數':val1,:val2 ...'並執行。 – Yazan

回答

0

嗯,我解決它,可能它不是解決這個問題的最好辦法,但我現在有這樣的:

我填寫的條目陣列從POST

$query = array(); 
$index = 0; 

foreach ($_POST as $entrada) { 
switch($entrada) { 
case "SAMSUNG": 
$query[] = "SAMSUNG"; 
break; 

case "LG": 
$query[] = "LG"; 
break; 

case "APPLE": 
$query[] = "APPLE"; 
break; 

case "HUAWEI": 
$query[] = "HUAWEI"; 
break; 
} 


} 
$inQuery = str_repeat('?,', count($query) - 1) . '?'; 

這是我的新查詢:問題是我混合「?「與不建議

 $statement = $conexion->prepare(
    "SELECT * FROM celulares 
    WHERE (MARCA IN($inQuery)) 

    AND 

    (CATEGORIA = ? OR CATEGORIA = ? OR CATEGORIA = ?) 

    AND 

    (CATEGORIA2 = ? OR CATEGORIA2 = ? OR CATEGORIA2= ?) 

    AND 

    (CATEGORIA3 = ? OR CATEGORIA3 = ? OR CATEGORIA3 = ?)"); 

然後我bindValues像

$c = 0; 
foreach ($query as $q => $queries) { 
     $c++; 
     $statement->bindValue(($q+1), $queries); 

} 


$statement->bindValue($c+1, $categoria1); 
$statement->bindValue($c+2, $categoria2); 
$statement->bindValue($c+3, $categoria3); 
$statement->bindValue($c+4, $categoria1); 
$statement->bindValue($c+5, $categoria2); 
$statement->bindValue($c+6, $categoria3); 
$statement->bindValue($c+7, $categoria1); 
$statement->bindValue($c+8, $categoria2); 
$statement->bindValue($c+9, $categoria3); 

$statement->execute(); 

$resultados = $statement->fetchAll(); 

我做了很多querys的多次測試和它的正常工作的佔位符(:),也許這是一個」骯髒!「的解決方案,但我會繼續學習

感謝ü所有幫助我

0

您可以簡化您的查詢:

SELECT * FROM celulares 
WHERE (MARCA = :marca) 
AND (:categoria1,:categoria2,:categoria3) 
    IN (
    (CATEGORIA,CATEGORIA2,CATEGORIA3), 
    (CATEGORIA,CATEGORIA3,CATEGORIA2), 
    (CATEGORIA2,CATEGORIA,CATEGORIA3), 
    (CATEGORIA2,CATEGORIA3,CATEGORIA), 
    (CATEGORIA3,CATEGORIA,CATEGORIA2), 
    (CATEGORIA3,CATEGORIA2,CATEGORIA) 
) 

這樣,你只在類別傳球一次,並將其與三類六種可能的排列。

這就是說,這是一個跡象表明你的數據庫是非常糟糕的形狀。一般來說有任何形式的「列2」中,「欄3」系統,你需要調整你的數據庫的一個標誌 - 你結束了,就像上面,只是變得更糟的那種查詢。

具體來說,在這種情況下,只需添加CATEGORIEA4會增加你需要定義從6至24排列的量!

編輯:我完全錯過了大約:marcaIN部分 - 我太專注於數據庫的狀態不好關於類別,對不起!

+0

謝謝尼婭,我是這個世界的新人,你可以看到,類別是由用戶選擇的,他可以選擇三個,所以不會有另一種可能性,我相信有另一種方式更好地做到這一點,我會發現我能做些什麼 –