2013-12-18 75 views
1

我無法將我的代碼從sql轉換爲mysqli。 $ XX可以是1或0.當$ XX = 1時,我想要搜索它。當$ XX = 0時,不能搜索$ XX。同樣是$ YY。使用變量變量將sql轉換爲mysqli_prepare

舊代碼

$sql = "SELECT name FROM tabel WHERE 1=1";  
if (!empty($XX)) {$sql .= " AND XX = 1 ";}  
if (!empty($YY)) {$sql .= " AND YY = 1 ";}  

當$ XX = 1和$ YY = 1,代碼將是這樣的:

$sql = "SELECT name FROM tabel WHERE 1=1 AND XX = 1 AND YY = 1"; 

當$ XX = 0,$ YY = 1,代碼看起來像:

$sql = "SELECT name FROM tabel WHERE 1=1 AND YY = 1"; 

當$ XX = 0,$ YY = 0,則代碼如下:

$sql = "SELECT name FROM tabel WHERE 1=1"; 

'問題'是我不想搜索XX = 0,因爲它排除了所有XX = 1個答案。當XX = 0時,它不應該搜索XX。

新代碼

$stmt = mysqli_prepare($link, "SELECT name FROM tabel WHERE XX=? and YY=?");  
mysqli_stmt_bind_param($stmt, "ii", $XX, $YY);   

誰知道mysqli的代碼必須看怎麼樣?謝謝!

+1

是調用帶參數變量數量bind_param() xx或yy用戶輸入? – Ali

+0

@Chosen Wann是$ XX和$ YY都是用戶輸入。 – Helena

+0

將您的代碼轉換爲PDO,您的麻煩就少得多。 –

回答

-1

你可以重寫查詢,通過以下方式

SELECT * FROM table1 WHERE (xx = ? OR ? = 0) AND (yy = ? OR ? = 0) 

這裏是SQLFiddle演示

$sql = "SELECT * FROM table1 WHERE (xx = ? OR ? = 0) AND (yy = ? OR ? = 0)"; 
$db = new mysqli(...); 
$stmt = $db->prepare($sql)) { 
$stmt->bind_param('iiii', $xx, $xx, $yy, $yy); 
$stmt->execute(); 
$stmt->bind_result(...); 
+0

的代碼可行,但老實說,它很髒。 –

+1

哇,這是快速思考!謝謝。 – Helena

+1

非常感謝,這是工作,這節省了我的日子! – Helena

0

編輯

好了,從我現在得到的,它應該是簡單的。如果查詢中唯一可能的XX和YY值是1,則不需要bind_param。

$qry = 'SELECT name FROM table WHERE 1=1'; 
$qry .= (!empty($XX)) ? ' AND XX=1'; 
$qry .= (!empty($YY)) ? ' AND YY=1'; 

$stmt = mysqli_prepare($link, $qry); 

然後只是執行您的查詢。

+0

我會解釋更詳細並編輯上面的問題。 – Helena

+0

你真的需要在嘗試回答這樣的轉換之前至少重寫一次mysql到mysqli –

+0

我沒有得到這個。說明? –

-1

另一備選,如果你可以通過字段名作爲參數

$stmt = mysqli_prepare($link, "SELECT name FROM tabel WHERE XX=? and YY=?");  
mysqli_stmt_bind_param($stmt, "ii", $XX, $YY); 

如果你想避免過濾XX將$ XX作爲'XX'(即字段名稱)插入0

-1

在這種特殊情況下,當沒有變量實際進入查詢時,您可以堅持您當前的設置。只需更改準備並綁定到mysqli_query()即可。

但是,如果你需要一個變量添加到查詢,你要麼可以使用peterm的骯髒的解決方案或者創建佔位符條件查詢,然後使用call_user_func_array()