2015-09-06 125 views
1

我有一個應用程序顯示數據庫表中的文件列表。我希望用戶能夠通過選擇將過濾文件列表的選項並僅顯示匹配的選項來創建組。組選項被添加到另一個表中供以後使用。在PHP中生成一個動態的MYSQLi準備語句

下面是選項: nameyeartyperoomdaytime

他們全部來自name除了是可選的,可以由用戶留空。某些選項可以包含由,分隔的多個值。

這裏是我的代碼中加入這樣的信息:

if ($addGrp = $m->prepare("SELECT * FROM pro_files WHERE userid=?, name=? ...")) { 
    $addGrp->bind_param('is ...',$userid, $name ...; 
} 

作爲參考,選擇我將使用這些dymanic列:

WHERE room in (g23,f43,g43) AND type in ('pptx,ppt,ai,pdf') 

和使用的變量綁定他們是逗號(根據用戶選擇的內容生成,如果用戶沒有選擇任何內容,變量將不存在):

$room = 'g23,f43,g43'; 
$type = 'pptx,ppt,ai,pdf'; 

使用舊的MYSQL方法,我可以剛剛創建一個查詢字符串沒有問題。當我還有bind_param行來處理時,如何創建動態查詢?

爲了演示我已經添加了...我需要動態生成查詢。

我不能使用PDO,因爲應用程序的其餘部分目前正在使用MYSQLi,這項工作太棒了。

另外,是否有可能在IN子句中使用通配符?在這種情況下,我可以在PHP中創建'' = '*'。但room in ('*')不起作用。

+0

您應該考慮一個已經涵蓋這種用例的框架或[ORM](https://en.wikipedia.org/wiki/Object-relational_mapping)。 – Gumbo

回答

1

那麼,用香草mysqli準備好的聲明,這將是一個相當艱鉅的挑戰。
但是有了一些DBAL或ORM,它可以被簡化。說,通過使用DBAL I wrote,它可以完成一個完美的方式:

首先根據用戶輸入定義您的變量。

$name = 'Bill'; 
$year = NULL; 
$room = ['g23','f43','g43']; 
$type = NULL; 
$day = 4; 
$time = NULL; 

然後寫,每一個變量被使用了兩次

$sql = "SELECT * pro_files WHERE name=?s 
(AND ?s is NULL OR year = ?s) 
(AND ?a is NULL OR type = ?a) 
(AND ?a is NULL OR room = ?a) 
(AND ?s is NULL OR day = ?s) 
(AND ?s is NULL OR time = ?s)"; 

最後運行查詢的查詢:

$data = $db->getAll($sql,$name,$year,$year,$room,$room,$type,$type,$day,$day,$time,$time); 

它將返回搜索結果基於提供非空值。

我只需要提一下,準備好的語句只在這裏模擬,但它與本地語言一樣安全。

順便說一下,我希望看到來自其他DBAL或ORM的方法。推薦一個是一回事,並且展示一個實例是另一回事。