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));
?>
4

2 回答 2

6

我会这样做(因为我在谷歌上搜索了一段时间,谷歌没有找到任何有用的东西):

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

这个应该做...

于 2012-05-22T09:04:40.473 回答
-1

先说几个tips:

  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)。

于 2012-05-22T09:04:45.157 回答