gpt4 book ai didi

PostgreSQL SQLSTATE[42P18] : Indeterminate datatype with PDO and CONCAT

转载 作者:行者123 更新时间:2023-11-29 12:53:19 27 4
gpt4 key购买 nike

我在 PDO 中的 WHERE 上使用 CONCAT() 时遇到问题。

代码:

<?php
require_once('config.php');

$fdate = '01/01/2010';
$tdate = '31/12/2030';
$identification = '';

$count = "SELECT count(*) as total FROM ( select time_id from doc_sent WHERE date >= :fdate AND date <= :tdate AND identification LIKE concat('%',:identification,'%') ) x;";

//$count = "SELECT count(*) as total FROM ( select time_id from doc_sent WHERE date >= :fdate AND date <= :tdate ) x;";


$stmt_count_row_main_table = $pdo->prepare($count);
$stmt_count_row_main_table->execute(['fdate' => $fdate, 'tdate' => $tdate, 'identification' => $identification]);
//$stmt_count_row_main_table->execute(['fdate' => $fdate, 'tdate' => $tdate]);
$count_row_main_table = $stmt_count_row_main_table->fetch();

print_r( $count_row_main_table);

?>

当“标识”部分被注释时,代码有效。当我尝试使用 CONCAT() 时,它没有。

我尝试了 CONCAT() 的许多“版本”(并阅读了许多其他问题,例如:How do I create a PDO parameterized query with a LIKE statement?)但我总是指的是主要文档: https://www.postgresql.org/docs/9.1/static/functions-string.html

其中说:

concat('abcde', 2, NULL, 22) --> abcde222

当我使用 CONCAT() 时的完整错误是:

PHP Fatal error:  Uncaught PDOException: SQLSTATE[42P18]: Indeterminate datatype: 7 ERROR:  could not determine data type of parameter $3 in /var/www/pdo-reporter/show.php:17\nStack trace:\n#0 /var/www/pdo-reporter/show.php(17): PDOStatement->execute(Array)\n#1 {main}\n  thrown in /var/www/pdo-reporter/show.php on line 17

我的代码有什么问题?

最佳答案

CONCAT 是一个接受 VARIADIC 参数列表的函数,这意味着在内部 postgres 会将它们转换为相同类型的数组。

postgres=# \df concat
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+--------+------------------+---------------------+------
pg_catalog | concat | text | VARIADIC "any" | func

尝试将输入类型解析为单一类型时,SQL 解析器失败。它可以以这种更简单的形式复制:

postgres=# PREPARE p AS select concat('A', $1);
ERROR: could not determine data type of parameter $1

解析器无法确定 $1 的数据类型,因此它会谨慎行事。

一个简单的解决方案是将参数转换为文本:

postgres=# PREPARE p AS select concat($1::text);
PREPARE

或使用 CAST 运算符:

postgres=# PREPARE p AS select concat(cast($1 as text));
PREPARE

我没有使用 PDO 进行测试,但大概可以将查询更改为:

"...identification LIKE '%' || :identification || '::text%'..."

或者使用'||'运算符而不是查询中的 concat:

identification LIKE '%' || :identification || '%'

编辑:顺便说一句,如果你想找到参数 :Xidentification 的子字符串,这个子句更安全:strpos(identification, : X) > 0,因为 :X 可能包含 '%' 或 '_' 而不会在匹配中造成任何副作用,这与 LIKE 发生的情况相反>.

关于PostgreSQL SQLSTATE[42P18] : Indeterminate datatype with PDO and CONCAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49033241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com