使用 \PDO::ATTR_EMULATE_PREPARES => true 时出现 Laravel 数据不匹配错误

2024-05-01

我们在 Php Laravel 中构建了应用程序,对于数据库我们使用 postgres sql。此外,在 postgres 之上,我们还配置了 pgBouncer,通过管理可供任何应用程序使用的空闲连接池来限制服务器端的最大连接数。

现在,我们面临应用程序 (Php Laravel) 中使用的布尔值 (True(0),False(1)) 的问题。执行任何 CRUD 操作时都会出现以下错误。在下面的错误列中,“已撤销”是布尔类型。

列“revoked”是布尔类型,但表达式是整数类型 您将需要重写或转换表达式。 (SQL:\“撤销\”,\“created_at \”)值(0,2020-02-07 06:09:06)

现在经过探索,我开始知道布尔值需要被考虑为 pgBouncer 的字符串。所以我做了一些改变连接.php文件,位于“\vendor\laravel\framework\src\Illuminate\Database“。我已经更改了代码以考虑布尔值,如下所述。

public function bindValues($statement, $bindings)
{
    foreach ($bindings as $key => $value) {
        //if(is_bool($value))
        $statement->bindValue(
            is_string($key) ? $key : $key + 1, $value,
            //is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR
            is_int($value) ? PDO::PARAM_INT : is_bool($value) ? PDO::PARAM_STR : PDO::PARAM_STR
        );
    }
}

经过上述更改后,布尔值的错误已解决。

但是,现在我在服务器上面临奇怪的问题,当我检查数据库日志错误时,我始终收到以下错误。

错误:准备好的语句“pdo_stmt_00000001”已存在 语句:设置名称“utf8” 错误:准备好的语句“pdo_stmt_00000001”不存在 语句:解除分配 pdo_stmt_00000001

这真的很奇怪,在探索互联网之后,我在我的程序中做了以下更改数据库.php文件,以禁用准备语句。

'pgsql' => [
        'driver' => 'pgsql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '5432'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',            
        'schema' => 'public',
        'sslmode' => 'prefer',
        'options' => [
            \PDO::ATTR_EMULATE_PREPARES => true
        ]
]

设置原因ATTR_EMULATE_PREPARES => true是因为我设置了“交易“模式在”pgbouncer.ini" file.

现在,要使准备好的语句起作用交易模式需要 PgBouncer 在内部跟踪它们,但它不这样做。因此,在这种模式下继续使用 PgBouncer 的唯一方法是禁用客户端中的预准备语句,在我的例子中是 PHP Laravel,我已经在“数据库.php如上面代码所示,在建立连接时创建文件。

我已经尝试了所有选项,其中给出http://www.pgbouncer.org/faq.html#how-to-use-prepared-statements-with-transaction-pooling http://www.pgbouncer.org/faq.html#how-to-use-prepared-statements-with-transaction-pooling但它并没有解决准备语句错误显示在数据库日志中。

错误:准备好的语句“pdo_stmt_00000001”已存在 语句:设置名称“utf8” 错误:准备好的语句“pdo_stmt_00000001”不存在 语句:解除分配 pdo_stmt_00000001

请指导我同样的问题以及该错误需要哪些进一步的设置。这些错误发生在客户端生产服务器上,我们无法在生产服务器中继续处理这些错误。

请尽早向我提供您的宝贵反馈,因为我在 5 天后就遇到了这个问题,并尝试了遇到的所有选项。

Thanks!


1)首先,您需要更改您在database.php的pgsql数组中的选项中给出的PDO选项,正确的方法如下所示。

'pgsql' => [
        'driver' => 'pgsql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '5434'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),           
        'charset' => 'utf8',
        'prefix' => '',
        'schema' => 'public',
        'sslmode' => 'prefer',
        'options' => [
            PDO::ATTR_EMULATE_PREPARES => true
        ]       
        ]

2)其次,也是最重要的一点是,确保您在尝试连接的每个数据库连接中将“ATTR_EMULATE_PREPARES”设置为“true”数据库.php file.

例如,

'test' => [
        'driver' => 'pgsql',
        'host' => env('test', '127.0.0.1'),
        'port' => env('test', '5434'),
        'database' => env('DB_TEST_DATABASE', 'test'),
        'username' => env('DB_USERNAME', 'test'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'prefix' => '',
        'schema' => 'public',
        'sslmode' => 'prefer',
        'options' => [
            PDO::ATTR_EMULATE_PREPARES => true
        ]           
    ],
'test1' => [
        'driver' => 'pgsql',
        'host' => env('test1', '127.0.0.1'),
        'port' => env('test1', '5434'),
        'database' => env('DB_TEST1_DATABASE', 'test1'),
        'username' => env('DB_USERNAME', 'test'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'prefix' => '',
        'schema' => 'public',
        'sslmode' => 'prefer',
        'options' => [
            PDO::ATTR_EMULATE_PREPARES => true
        ]           
    ]

请确保对您在应用程序中建立的每个数据库连接使用“ATTR_EMULATE_PREPARES”为 true,在您的注释中,您仅与“pgsql”建立连接,该连接仅强调 postgres sql 连接,而不是与您的应用程序通信的数据库在 postgres 中。

希望这可以帮助您解决您的疑问。享受!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 \PDO::ATTR_EMULATE_PREPARES => true 时出现 Laravel 数据不匹配错误 的相关文章

  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • laravel 中哪里可以设置标题

    我想将标题设置为array Cache Control gt no cache no store max age 0 must revalidate Pragma gt no cache Expires gt Fri 01 Jan 1990
  • postgresql 登录到另一个表时发生冲突

    我正在使用 PostgreSQL 9 5 并尝试使用批量插入每天插入数百万行 INSERT INTO tours as cst adults country id price VALUES 3 129 80 2 119 120 on con
  • 使用 MacPorts 在 Mac OS X 10.5 上安装 PostgreSQL 时出错

    我已经使用 MacPorts 在几台不同的计算机上安装了 PostgreSQL 没有问题 但是当涉及到我自己的笔记本电脑时 我无法构建它 当我执行此命令时 sudo port install postgresql83 我收到此错误 chec
  • 有哪些可用选项可以识别和删除 Postgres 中的无效对象(例如:损坏的索引)

    有哪些可用选项可以识别和删除 Postgres 中的无效对象 如果您指的是检测 无效 创建不良 索引 显然 Postgres 在尝试创建索引时可能会 失败 然后查询规划器将不会使用它们 尽管它们存在于您的系统中 此查询将检测 失败 索引 h
  • Postgres JSONB:数组数组的 where 子句

    postgres 中有 v 9 5 如果有的话 create table json test id varchar NOT NULL data jsonb NOT NULL PRIMARY KEY id 其中 data 是 json 并且包
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • 如何创建没有循环关系的树形表?

    CREATE TABLE TREE node1 id UUID REFERENCES nodes object id NOT NULL node2 id UUID REFERENCES nodes object id NOT NULL CO
  • Laravel/00webhost 错误 404。在此服务器上找不到请求的 URL

    1 将我的文件上传到 000webhost 我将公用文件夹中的所有文件放置到公共 html然后我创建了一个名为laravel我在那里上传了所有其他文件 这是我的目录结构 laravel app 引导程序 config 公共 html 索引
  • 如何在 PostgreSQL 中返回不同时区的当前日期

    我正在开发一个使用东部时间并将数据库设置为太平洋时间的应用程序 这已经引起了一些问题 但我们被告知不可能有其他方式 所以我们只能解决它 不管怎样 我遇到的麻烦之一就是获取今天的约会 由于数据库位于太平洋 如果我使用以下命令询问今天的日期cu
  • PostgreSQL:删除数据库但数据库仍然存在[重复]

    这个问题在这里已经有答案了 我是 PostgreSQL 的新手 我尝试着理解它 我熟悉数据库和MySQL 我正在尝试删除我创建的数据库 因为 psql 似乎忽略了我尝试通过 Django 推送的更改 当我执行时 l我得到以下回复 List
  • Laravel Auth:attempt() 不会持久登录

    我在网上找到了许多有类似问题的资源 但似乎没有一个解决方案可以解决我的问题 当我使用以下代码登录用户时 一切看起来都很好 email Input get email password Input get password if Auth a
  • laravel - 使用请求类或输入类

    在宁静的控制器中 我应该使用哪个类来获取传递的变量 member gt email Input get email or member gt email Request get email 两种选择都适合我 但有什么区别 Input get
  • Laravel S3 检索视频以流式传输

    我通过 Laravel 应用程序将视频存储到 Amazon S3 效果很好 但我无法 流式传输 它们 这是例如 URL https website com video 342 qt api token a5a18c9f f5f6 5d66
  • PHP - 类外 use 关键字和类内 use 关键字的区别

    伙计们 美好的一天 只是想问一下有什么区别use之外的class and use在 的里面class 我也用谷歌搜索过 但我的问题与答案不匹配 Example namespace App Http Controllers Auth use
  • “WHERE”处或附近的语法错误

    创建 postgres 函数时会导致错误 如下所示 错误 WHERE 处或附近的语法错误 第 19 行 其中 s shift id shiftid 错误 错误 WHERE 处或附近的语法错误 SQL状态 42601 人物 108 请帮忙 C
  • 如何修复“缺少表的 FROM 子句条目”错误

    我正在尝试根据游戏 ID 获取平台名称 我有如下三个表 我正在尝试加入它们以获得所需的结果 Games Id 1 2 3 4 Game Platforms Id game id platform id 1 1 1 2 1 2 3 3 3
  • postgresql中的按日期聚合函数分组

    我在运行此查询时遇到错误 SELECT date updated at count updated at as total count FROM persons WHERE persons updated at BETWEEN 2012 1
  • 使用所有连接的 Flask unittest 和 sqlalchemy

    在进行了大约 100 个单元测试后 我刚刚在 Flask 应用程序上运行单元测试时遇到了问题 所有单元测试都会通过 但是当一次全部运行时 它们将失败并出现以下错误 OperationalError OperationalError FATA

随机推荐