Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.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 Mysqli bind-参数数量未知_Php_Mysql_Mysqli - Fatal编程技术网

Php Mysqli bind-参数数量未知

Php Mysqli bind-参数数量未知,php,mysql,mysqli,Php,Mysql,Mysqli,如何使用Mysqli绑定未知数量的参数?例如,遵循我的代码: <?php include 'config.php'; $query = "SELECT * FROM table WHERE"; if(isset($_POST['r1'])) $query = $query." id = '$_POST['r1']'"; if(isset($_POST['r2'])) $query = $query." AND par2 = '$_POST['r2']'"; $e = mysqli_

如何使用Mysqli绑定未知数量的参数?例如,遵循我的代码:

<?php
include 'config.php';
$query = "SELECT * FROM table WHERE";
if(isset($_POST['r1']))
  $query = $query." id = '$_POST['r1']'";
if(isset($_POST['r2']))
  $query = $query." AND par2 = '$_POST['r2']'";
$e = mysqli_prepare($conf, $query);
?>

准备好的语句可能不是最好的方法。您可以像正在做的那样组装查询,只要确保转义任何用户输入。例如:

<?php

// assuming $db is a mysqli object

$query = "SELECT * FROM table WHERE";
if(isset($_POST['r1']))
  $query = $query."id = '".$db->real_escape_string($_POST['r1'])."'";
if(isset($_POST['r2']))
  $query = $query." AND par2 = '".$db->real_escape_string($_POST['r2'])."'";

$result = $db->query($query);
?>

准备好的语句可能不是最好的方法。您可以像正在做的那样组装查询,只要确保转义任何用户输入。例如:

<?php

// assuming $db is a mysqli object

$query = "SELECT * FROM table WHERE";
if(isset($_POST['r1']))
  $query = $query."id = '".$db->real_escape_string($_POST['r1'])."'";
if(isset($_POST['r2']))
  $query = $query." AND par2 = '".$db->real_escape_string($_POST['r2'])."'";

$result = $db->query($query);
?>

您不应该使用
isset
。使用
!改为空。@DevlshOne在本例中,
isset
是正确的选择。假设其中一个
$\u POST
变量为0?这是一个合法的值,但是
empty()
将为此返回错误的值。使用
empty
检查表单数据通常是一个错误的选择
isset
同时表示声明的和定义的变量,并且由于表单数据是string类型的,其中空字符串仍然被视为定义变量,
isset
在这里是正确的选择。永远不要使用
isset
。使用
!改为空。@DevlshOne在本例中,
isset
是正确的选择。假设其中一个
$\u POST
变量为0?这是一个合法的值,但是
empty()
将为此返回错误的值。使用
empty
检查表单数据通常是一个错误的选择
isset
表示声明的和定义的变量,并且由于表单数据的类型为string,其中空字符串仍然被视为定义变量,
isset
在这里是正确的选择。本网站上鼓吹准备好的语句作为抵御SQL注入的方式,这种狂热忽视了许多边缘情况,即准备好的语句是不必要的、笨拙的或不可能使用的。这是一个。只要您在转义输入时足够小心,就没有理由认为简单查询不完全安全。@user3022323对于PDO,您可以使用准备好的语句。切换到PDO对您来说是一种选择吗?@MarcelKorpel您也可以将准备好的语句与
mysqli
一起使用。在准备语句之前,必须逐段构造语句,然后像使用PDO一样绑定参数。问题是,为什么要麻烦?在构造模板查询时,可以同样轻松地构造最终查询。这在我上面的评论中属于“笨拙”一类。我知道你可以在MySQLi中使用准备好的语句,但在PDO中你可以使用命名参数,当你想动态地构建查询字符串时,你需要的就是这些。这个网站上鼓吹准备好的语句作为抵御SQL注入的方法的狂热,忽略了许多边缘情况,即准备好的语句是不必要的、笨拙的或不可能使用的。这是一个。只要您在转义输入时足够小心,就没有理由认为简单查询不完全安全。@user3022323对于PDO,您可以使用准备好的语句。切换到PDO对您来说是一种选择吗?@MarcelKorpel您也可以将准备好的语句与
mysqli
一起使用。在准备语句之前,必须逐段构造语句,然后像使用PDO一样绑定参数。问题是,为什么要麻烦?在构造模板查询时,可以同样轻松地构造最终查询。这在我上面的评论中属于“笨拙”一类。我知道可以在MySQLi中使用准备好的语句,但在PDO中可以使用命名参数,这是动态构建查询字符串时所需要的。