2013-10-14 70 views
2

好吧,所以我的問題是我有一個函數,但我想解析它執行查詢時不同的WHERE子句。例如:使用動態WHERE子句準備的語句

function query($where) 
{ 
$query = $mysql->prepare("SELECT * FROM table WHERE ?"); 
$query->bind_param("s", $where); 
$query->execute(); 

... 

} 

query("table.id=123 AND table.name='abc'"); 

據我瞭解,這是不正確因此,我怎麼執行類似的東西,我有很多地方我需要WHERE子句來使用該功能不同,併爲每個功能是不切實際的,所以不會直接調用函數。

+0

如果這個子句是完全任意的,爲什麼不自己清理輸入並執行'$ mysql-> prepare(「SELECT * FROM table WHERE $ where」);'? –

+0

有太多的東西可能會導致您自己的SQL輸入消毒過程出錯。使用像prepare這樣的內置函數是安全和簡單的 – Snowburnt

回答

1

對於您必須指定一個WHERE子句一份聲明中什麼值將例如:

SELECT * FROM table WHERE ID=? 

如果你想讓它更動態,你可以在一個函數中指定查詢,然後調用查詢函數。例如,你有這樣的:

function query($query, $param, $where) 
{ 
$query = $mysql->prepare($query); 
$query->bind_param($param, $where); 
$query->execute(); 

... 

} 

,並在你的其他功能你說:

$results=query("SELECT * FROM table WHERE Id=?","s","1"); 

你甚至可以更復雜的通過使查詢類,它可以包含where子句的數組做這樣的:

class query 
{ 
    public $query; 
    public $param; 
    public $where; 
} 

$query=new query(); 
$query->query="SELECT * FROM Table WHERE group=? AND name like ?"; 
$query->param="ss"; 
$query->where = array(); 
$query->where[]="administrators"; 
$query->where[]="sam"; 

,改變你的查詢功能看起來像:

function SQLCall(query $query) 
{ 
$db = $mysql->prepare($query->query); 
call_user_func_array(array(&$db, 'bind_param'), $where) 
$db->execute(); 

... 

} 
1

不同的查詢在if(或者,如果你有很多差異的,switch)聲明:

if($item === 'option1'){ 
    $query = "SELECT * FROM table WHERE item = ?;"; 
    $preparedQuery = $mysql->prepare($query); 
    $preparedQuery->bind_param("s", $someString); 
} elseif($item === 'option2'){ 
    $query = "SELECT * FROM table WHERE different = ?;"; 
    $preparedQuery = $mysql->prepare($query); 
    $preparedQuery->bind_param("i", $someInteger); 
} 

$preparedQuery ->execute(); 

過於明顯泛型,但你應該得到的總體思路。如果你知道,總會有相同數量的值,而且它永遠是同一類型,可以將其簡化:

if($item === 'option1'){ 
    $query = "SELECT * FROM table WHERE item = ?;"; 
} elseif($item === 'option2'){ 
    $query = "SELECT * FROM table WHERE different = ?;"; 
} 

$preparedQuery = $mysql->prepare($query); 
$preparedQuery->bind_param("s", $someString); 
$preparedQuery->execute();