Php Mysqli参数绑定问题

Php Mysqli参数绑定问题,php,mysql,mysqli,sql-like,parameterbinding,Php,Mysql,Mysqli,Sql Like,Parameterbinding,我需要在这个上面多加一双眼睛。任何帮助都将不胜感激。这是一个非常简单的搜索查询,但无论出于什么原因,我都找不到bug。我知道虫子在哪里。我就是过不去。无论如何 我从POST变量中获取一个搜索值,设置该变量,然后设置一个列变量,如下所示 $term = "'%".$_POST['searchTerm']."%'"; $field = "columnName"; $suquery=$dbCon->prepare("select * from Table where ? LIKE ?"); $

我需要在这个上面多加一双眼睛。任何帮助都将不胜感激。这是一个非常简单的搜索查询,但无论出于什么原因,我都找不到bug。我知道虫子在哪里。我就是过不去。无论如何

我从POST变量中获取一个搜索值,设置该变量,然后设置一个列变量,如下所示

$term = "'%".$_POST['searchTerm']."%'";
$field = "columnName";
$suquery=$dbCon->prepare("select * from Table where ? LIKE ?");
$suquery->bind_param('ss', $field, $term);
$suquery->execute();
当我回应这些声音时,它们完美地出现了。因此,如果我在表单中键入“a”,我将回显“%a%”和columnName

然后我准备查询并绑定参数,如下所示

$term = "'%".$_POST['searchTerm']."%'";
$field = "columnName";
$suquery=$dbCon->prepare("select * from Table where ? LIKE ?");
$suquery->bind_param('ss', $field, $term);
$suquery->execute();
结果总是返回0行。当我玩这个游戏的时候,我发现两个绑定参数都不能正常工作,即使它本应发出回声。例如,当我更改查询时,列是硬编码的,并且只绑定搜索项

$suquery=$dbCon->prepare("select * from Table where columnName LIKE ?");
$suquery->bind_param('s', $term);
$suquery->execute();
我仍然没有返回任何行。这告诉我,即使$field作为“%a%”回响,但仍有一些内容处于关闭状态。在那件事上我真是不知所措。同样,当我硬连接搜索词并绑定列时

$suquery=$dbCon->prepare("select * from Table where ? LIKE '%a%'");
$suquery->bind_param('s', $field);
$suquery->execute();

返回的行太多了。它实际上是从任何列中的值包含字母“a”的表中提取行。因此,无论是列还是术语都不能正确绑定。求救

编辑:原始答案基于错误假设(假设PDO而非mysqli)。相应地改变了答案

看起来不允许对列名使用参数替换。从文件中:

注:标记仅在以下情况下合法: SQL语句中的某些位置。对于 例如,它们被允许在 INSERT语句的VALUES()列表 (指定行的列值), 或与中的列进行比较 WHERE子句来指定比较 价值但是,他们是不允许的 用于标识符(如表或 列名称),在选择列表中 命名要由 选择语句,或

您可能希望通过在查询中硬编码列/字段名并通过参数替换比较值来验证这一点

$suquery=$dbCon->prepare("select * from Table where ? LIKE ?");
将无法按预期工作。它将被翻译为:

SELECT * from table WHERE 'columnName' LIKE '%a%'
返回所有行,因为“columnName”包含“a”columnName'是一个字符串,不是实际的列名

你的第二次尝试是正确的,除非你在术语中有额外的引号。使用参数时,不需要任何引号。解决办法是:

$term = "%".$_POST['searchTerm']."%";
$suquery=$dbCon->prepare("select * from Table where columnName LIKE ?");
$suquery->bind_param('s', $term);
$suquery->execute();

我只是想澄清一下,如果有人遇到这个问题。这个问题相当简单,但奇怪的是,追踪到它是一只熊。亨里克部分正确。在分析LIKE语句中使用的变量$term时,我执行了以下操作:

$term = "'%".$_POST['searchterm']."%'";
Henrik指出,我不需要将变量括起来的单引号。如果只是准备和执行查询,则为:

$query=$connection->prepare("select * from DATABASE where $field like '$term'");
$query->execute();

那很好用。然而,我实际上使用$term作为绑定参数,这意味着我确实需要单引号,因为语句本身要求搜索词如下所示:'%term%'。它需要单引号。如果尝试在绑定参数的问号占位符周围加上单引号,则会出现语法错误,如果未在用作绑定参数的变量内加上单引号,则结果将始终为0行。所以,简而言之,对于遇到这种情况的其他人来说。。。。如果直接发送查询,则不需要单引号,因为可以将它们直接放入select语句中。如果使用绑定参数,则必须将单引号作为变量的一部分,才能使查询正常工作。

事实上,没有。不过,我尝试过沿着这条路走下去,以使其正常工作。我只是感到困惑。我一直在使用绑定参数,我从来没有在某件事情上被困这么久。这让我沮丧不已。嗨,我刚刚意识到我的错误-应该更仔细地查看标签。我更改了我的答案,因为问题可能与标识符(表和列名)不允许使用参数替换有关。Hank,非常感谢您花费时间和精力帮助我。关于列名不允许作为标识符,您是绝对正确的。这解决了我一半的问题,现在我想知道我是否应该用另一半的问题来重新发帖。当我硬记录列名时,如果我在搜索字段中键入“a”,则查询仍然无法正常工作,我将echo“%a%”(单引号是echo的一部分,而不是我在此处添加的内容)作为$field的值。因此,我的查询读取“从列名为“%a%”的表中选择*”。结果仍然为零。我应该补充一点,当我在上面的评论中键入db时,db或查询语法本身没有问题。当我将“%a%”硬编码到查询中时,它会按预期工作。我想,我的问题是单引号,但我不知道如何解决它。如果从_POST中提取变量时未能将单引号添加到变量中,则会出现mysql语法错误。这是正确的。但是您也在%:
$term=“%”前面和后面添加了单引号-应该不需要这些。。。