Php 使用变量将sql转换为mysqli\u prepare

Php 使用变量将sql转换为mysqli\u prepare,php,sql,mysqli,Php,Sql,Mysqli,我无法将代码从sql转换为mysqli$XX可以是1或0。当$XX=1时,我想搜索它。当$XX=0时,不得搜索$XX。同样是YY美元 旧代码 $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

我无法将代码从sql转换为mysqli$XX可以是1或0。当$XX=1时,我想搜索它。当$XX=0时,不得搜索$XX。同样是YY美元

旧代码

$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";
$sql = "SELECT name FROM tabel WHERE 1=1 AND YY = 1";
$sql = "SELECT name FROM tabel WHERE 1=1";
当$XX=0和$YY=1时,代码如下所示:

$sql = "SELECT name FROM tabel WHERE 1=1 AND XX = 1 AND YY = 1";
$sql = "SELECT name FROM tabel WHERE 1=1 AND YY = 1";
$sql = "SELECT name FROM tabel WHERE 1=1";
当$XX=0和$YY=0时,代码如下所示:

$sql = "SELECT name FROM tabel WHERE 1=1 AND XX = 1 AND YY = 1";
$sql = "SELECT name FROM tabel WHERE 1=1 AND YY = 1";
$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代码应该是什么样子?谢谢

编辑

好的,从我现在得到的,应该很简单。如果查询中XX和YY的唯一可能值为1,则不需要bind_参数

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

然后只执行查询。

您可以用以下方式重写查询

从表1中选择*,其中(xx=?或?=0)和(yy=?或?=0)
这里是演示

$sql=“从表1中选择*,其中(xx=?或?=0)和(yy=?或?=0)”;
$db=新的mysqli(…);
$stmt=$db->prepare($sql)){
$stmt->bind_param('iiii',$xx,$xx,$yy,$yy);
$stmt->execute();
$stmt->bind_result(…);

如果可以将字段名作为参数传递,则另一种替代方法

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

如果您想避免在这种特殊情况下,当没有变量实际进入查询时,将XX pass$XX过滤为“XX”(即字段名),而不是0

,您可以坚持当前设置。只需更改prepare并绑定到mysqli_query()


但是,如果需要向查询中添加变量,可以使用peterm的脏解决方案,也可以使用占位符创建条件查询,然后使用call_user_func_array()调用参数数量可变的bind_param()

是xx还是yy用户输入?@Wann是的,$xx和$yy都是用户输入。将您的代码转换为PDO,您的麻烦会小得多。可行但老实说,它很脏。哇,这想法太快了!谢谢您。非常感谢您,它正在工作,这节省了我几天的时间!在尝试回答问题之前,您确实需要至少将mysql重写到mysqli一次这样的转换我不明白。解释?这是你做的最简单的部分。但也有你忽略的绑定。我看不到在这个查询中使用绑定。查询中没有变量,所有条件值都是1或不存在。我唯一没有放在那里的是
mysqli\stmt\u execute($stmt)
mysql\u prepare
之后。如果我错了,你能提供正确的答案吗?我的错。我没有注意到这个问题实际上比通常的条件绑定简单得多。那么你也不需要准备。