我有一個問題準備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]:無效的參數號:混合命名和位置參數
試圖修復它
看看(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
我認爲你需要在你的查詢中使用IN語句,並在php代碼中使用switch-case。 –
我不認爲你可以在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