使用MySql、PHP和ADODB的预处理语句中的参数化IN子句。

10 浏览
0 Comments

使用MySql、PHP和ADODB的预处理语句中的参数化IN子句。

我正在编写一些SQL,并使用AdoDb连接到我的数据库并运行查询等操作。我正在使用参数化查询,并遇到了一个问题。

在AdoDb/MySql中,是否有一种方法可以将值数组传递给in_clause进行参数化。

我的问题是,如果我将准备好的字符串作为参数传递,即'test','test2','test3',由于库或数据库自动转义并在开头和结尾添加外部引号,因此所有内部引号都被自动转义,所以查询返回为空,因为它查找'\'test\',\'test2\',\'test3\''而不是我提供的内容。

使用另一种可能的方法来实现这一点进行更新

Param('first_names') . ")"
$stmt = $DB->Prepare($query);
$result = $DB->Execute($stmt,array($in_clause));
?>

0
0 Comments

问题的原因:

在使用MySql、PHP和ADODB进行参数化的准备语句时,可能会遇到无法正确使用IN子句的问题。具体表现为在查询中使用IN子句时,传递的参数不被正确识别,导致查询结果不准确。

解决方法:

1. 阅读AdoDB文档中关于参数化准备语句的内容,以了解正确的用法。

2. 在SQL查询字符串中不要包含分号;这是因为在使用mysql_query函数时,官方文档明确指出“查询字符串不应以分号结尾”。具体原因尚不清楚,但这样做对代码的可读性没有任何帮助。

3. 使用substr和str_repeat函数来生成一个包含逗号分隔的参数占位符字符串,然后将其插入到IN子句中。具体代码如下:

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

需要注意的是,这段代码没有经过测试,因此可能需要根据实际情况进行调整。

0
0 Comments

问题的原因是在使用MySQL、PHP和ADODB进行参数化IN子句的预处理语句时,无法直接将数组作为参数传递给IN子句。解决方法是使用循环将数组中的元素拼接成字符串,并通过占位符的方式传递给IN子句。

具体的解决方法如下所示:

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

通过将数组中的元素拼接成占位符的形式,并将其传递给IN子句,可以实现参数化查询。

这种方法非常实用,谢谢提供这个解决方案。我自己也想到了类似的解决方法。我还找到了另一种解决方案,它也很好用。我将在问题上更新这个解决方案。再次感谢,我很感激。

非常感谢,我正在使用这种方法。

0