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

4
我正在编写一些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));
?>
2个回答

7
我会这样做(因为我搜索了一段时间,但谷歌没有给出有用的结果):
$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);

这应该可以解决问题...

谢谢你,我一直在考虑类似的事情。我还找到了另一个不错的解决方案,我会在上面的问题中更新它。再次感谢,我很感激。 - jiraiya
谢谢,我正在使用这种方式。 - Dibish

-1

首先是一些提示:

  1. 请仔细阅读AdoDB关于预处理语句的文档。
  2. 在SQL查询字符串中永远不要包含分号(;)

您可以尝试类似以下的代码:

$question_marks = substr(str_repeat('?,', count($first_names)), 0, -1);

$query = "SELECT mytable_id_pk FROM mytable WHERE mytable_fname IN (" . $question_marks . ")";
$stmt = $DB->Prepare($query);
$result = $DB->Execute($stmt,$first_names);

警告:我还没有测试过这个(因为我这里没有安装mySQL)。


为什么不包括分号?我很好奇原因,因为我已经用了多年在每个mysql查询的末尾使用分号...我了解当转移到其他DBMS时,我需要修复每个查询,但是否有其他明智的理由? - shadyyx
@shadyyx 嗯,使用 mysqli_multi_query 你确实可以包含分号。但是,mysql_query 文档明确指出:“查询字符串不应以分号结尾。”这个禁令的确切原因不太清楚(我最近在谷歌上也看到了其他人的疑问)。然而,这完全是没有意义的,并且会对可读性产生负面影响(好吧,这很主观...) - dezso
感谢您的输入。我确实阅读了adodb文档,我甚至已经仔细查找了有关这一点的信息,但没有找到,所以我提出这个问题是想看看是否有其他创新的方法。 - jiraiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接