Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用动态WHERE子句准备语句_Php_Mysqli - Fatal编程技术网

Php 使用动态WHERE子句准备语句

Php 使用动态WHERE子句准备语句,php,mysqli,Php,Mysqli,好的,我的问题是我有一个函数,但我想在它执行查询时解析不同的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子句。例如:

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子句的函数,为每个where子句创建函数是不切实际的,因此不创建函数并直接调用它。

if
(或者,如果存在大量差异,
开关
)语句:

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();

对于带有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();

...

}

如果该子句是完全任意的,为什么不自己清理输入,然后执行
$mysql->prepare(“SELECT*FROM table WHERE$WHERE”);
?清理自己的SQL输入可能会出现太多问题。使用像prepare这样的内置函数既安全又简单