php Mysqli参数绑定问题[重复]

rpppsulh  于 2023-01-08  发布在  PHP
关注(0)|答案(3)|浏览(172)
    • 此问题在此处已有答案**:

Mysqli prepared statement column with variable [duplicate](1个答案)
上个月关门了。
我需要一个额外的眼睛在这一个。任何帮助将不胜感激。这是一个非常简单的搜索查询,但不知什么原因,我找不到错误。嗯,我知道错误在哪里。我只是不能过去它。无论如何.....
我从POST变量中获取搜索值,设置该变量,然后设置列变量,如下所示...

$term = "'%".$_POST['searchTerm']."%'";
$field = "columnName";

当我回显这些时,它们会完美地出现。所以如果我在表单中键入"a",我将回显" % a %"和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"的表中拉行。所以,列或术语都没有正确绑定。五月天!

enyaitl3

enyaitl31#

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

hec6srdp2#

    • 编辑:**原始答案基于错误的假设(假设PDO而不是mysqli)。相应地更改了答案。

似乎不允许您对列名使用参数替换。请参阅mysqli::prepare文档:
注:这些标记仅在SQL语句的某些位置是合法的。例如,允许在VALUES()INSERT语句的列表(指定行的列值),或者在WHERE子句中与列进行比较以指定比较值。但是,标识符不允许使用它们(如表名或列名)、在命名SELECT语句要返回的列的选择列表中,或者...
您可能希望通过在查询中硬编码列/字段名并通过参数替换比较值来验证这一点...

bqf10yzr

bqf10yzr3#

我想向所有偶然发现这个问题的人澄清一下。这个问题相当简单,但奇怪的是,追踪它是一个熊。亨里克部分正确。当解析变量$term以在我的LIKE语句中使用时,我做了以下操作:

$term = "'%".$_POST['searchterm']."%'";

Henrik指出我不需要用单引号括住我的变量。如果只是准备和执行查询,这是正确的:

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

这样就可以了,但是,我实际上是使用$term作为绑定参数,这意味着我确实需要单引号,因为语句本身要求搜索词看起来像这样:“%term %”。它需要单引号。如果尝试将单引号括在绑定参数的问号保持器两边,则会出现语法错误;如果未将单引号括在用作绑定参数的变量内部,则结果始终是找到0行。因此,简而言之,对于其他遇到这种情况的人....如果您直接发送查询,则不需要单引号,因为您可以直接将它们放在select语句中。如果使用绑定参数,则必须将单引号作为变量的一部分,以便查询正常工作。

相关问题