2013-10-14 44 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();