当前位置: 首页 > 面试题库 >

使用MySql,PHP和ADODB在准备好的语句中参数化IN子句

温星华
2023-03-14
问题内容

我正在编写一些SQL,并使用AdoDb连接到我的数据库并运行查询等等。我正在使用参数化查询,并且遇到了麻烦。

它们是将值的数组传递给AdoDb / MySql中的in_clause进行参数化的一种方法。

我的问题是,如果我将准备好的字符串作为参数传递,即 ‘test’,’test2’,’test3’,
则它不起作用,因为库或数据库会自动对其进行转义并在开头和结尾处添加外部引号,因此所有内部引号随后会自动转义,因此查询不返回任何内容,因为它查找的是
‘'test ','test2 ','test3 '‘ ,而不是我输入的内容。

更新了另一种可能的方法来完成此操作

<?php
$in_clause = implode(",", $first_names);

$query = "
SELECT    
    mytable_id_pk
FROM 
    mytable
WHERE
FIND_IN_SET(mytable_fname," . $DB->Param('first_names') . ")"

$stmt = $DB->Prepare($query);

$result = $DB->Execute($stmt,array($in_clause));
?>

问题答案:

我会以这种方式进行操作(因为我搜索了一段时间,而Google却没有任何用处):

$count = count($first_names);
$in_params = trim(str_repeat('?, ', $count), ', ');

$query = "
SELECT    
    mytable_id_pk
FROM 
    mytable
WHERE
    mytable_fname IN ({$in_params});";

$stmt = $DB->Prepare($query);
$result = $DB->Execute($stmt, $first_names);

这应该做的…



 类似资料:
  • 问题内容: 假设我们有一个查询: 以及要获取的ID数组: 预处理语句它劝准备一个语句,并调用它多次: 但是现在我必须手动对结果进行排序。我有其他不错的选择吗? 问题答案: 您可以这样进行: 使用此方法,您将为每个id调用bind_param,并且已由mysql完成排序。

  • 问题内容: 我正在自定义由hibernate生成的插入SQL,并遇到了问题。当Hibernate自己生成查询时,它将数据插入表的前两列,但这会导致数据库错误,因为表的所有四列都是不可为空的。为了正确执行插入,它必须将相同的数据插入到新记录的两列中。这意味着我需要Hibernate将相同的数据绑定到我正在编写的查询(准备好的语句)中的两个不同的参数上。 是否有一些SQL语法可让我以与绑定到绑定语句不

  • 我准备了以下语句,通过JDBC驱动程序将其发送到Oracle数据库: 但是,我希望使用相同的准备好的语句,通过提供通配符参数这样的东西来获取表中的所有行。我尝试了“*”和“”这样的字符串,但它总是不返回行。 是否存在用于获取所有行的此准备语句中的参数的值?

  • 问题内容: 我的目的是在表中找到与存储在String中的集合匹配的所有项目: 这似乎并不完美,它总是向我发出以下警告: 如果我有一个参数,这将是显而易见的: 但是由于我不得不处理这个问题,这对我来说有点复杂。 问题答案: Prepared语句没有参数,因为您在准备列表之前已将列表插入到该语句中。 至此,您创建的SQL语句为: 由于该语句没有参数,因此失败。而不是将项目插值到语句(容易注入)中,而是

  • 我有一个作业必须使用不同的作业参数运行多次。我想设置一个JdbcCursorItemReader来执行对作业的查询,itemReader配置如下: 作业配置如下: 但我得到了这个错误: 我发现了一个非常相似的问题,这个问题和这个问题的区别是,我没有reader类来注释,我只有xml条目,因为我希望避免创建自己的ItemReader。(我可以尝试重写jdbcCursorItemReader类,以便能

  • 问题内容: 我已经多次使用mysqli_stmt_bind_param函数。但是,如果我分开试图防止SQL注入的变量,则会遇到错误。 这是一些代码示例: 是否有可能以某种方式用另一个问号语句替换串联,制作另一个绑定参数语句或添加到现有的语句中以防止SQL注入? 像这样或某种形式: 问题答案: 对您的问题的简短回答是“否”。 从最严格的意义上讲,在数据库级别,准备好的语句仅允许将参数绑定到SQL语句