F3 Sql 映射器:为映射表中不存在的字段设置值时出现误导性错误消息

F3 Sql Mapper: Misleading error message when setting value for non existent field in the mapped table

提问人:Paolo 提问时间:12/9/2022 最后编辑:Paolo 更新时间:12/9/2022 访问量:44

问:

给定此代码

$mapper->reset();
$mapper->set( 'foo', 'bar' ); // <--- Error here: `foo` does not exists in the table
$mapper->insert();

映射表中没有 esist 的列在哪里,我收到此错误foo

Internal Server Error

SQLSTATE[42S22]: Column not found:
1054 Unknown column 'bar' in 'field list' 
[/var/www/example.com/html/lib/php/fatfreeframework/DB/SQL.php:230]

错误消息具有误导性,实际上不存在的列是 ,而不是 :后者是已尝试设置为不存在的列的值。foobar

为什么会这样?有没有办法解决这个问题?

-

PHP的 8.1.9

pdo_mysql 客户端 API 版本 => mysqlnd 8.1.9

MySQL的8.0.30

php 无脂肪框架

评论

0赞 hakre 12/9/2022
好吧,如果您的调查发现错误消息是错误的,这可能表明该库中可能存在缺陷。通过自动执行测试和调试,然后在自动化中进一步调查。这可能会导致一种解决此问题的方法(例如,通过编写补丁,然后将其归档到上游)。或者,你也可以针对库的不同版本进行测试,以找出这种行为何时发生了变化(例如,使用 git 二进制搜索)。顺便说一句,你使用的是哪个版本?添加您正在运行的 PHP 版本也没有什么坏处。
0赞 hakre 12/9/2022
并思考:从错误消息来看,它来自数据库服务器。因此,看起来 F3 SQL 映射器只是将错误从数据库服务器传递出去。因此,您还应该编辑您正在使用的数据库服务器(及其版本)。
0赞 Paolo 12/9/2022
@hakre我完全同意。不过,我认为应该采取一些措施来解决这个问题......it looks to me it is from the database server
0赞 hakre 12/9/2022
好吧,那么它的工作方式会不会与你想象的不同?它可能要求第一个参数必须是现有列名,才能成为第二个参数的值(而不是(列)名)。只是大声思考。您是否已经确定了 F3 SQL 映射器的修订版,该修订版引入了您要修复的行为?set()
0赞 Paolo 12/9/2022
@hakre不,在深入研究 F3 之前,我希望从 F3 的人那里得到一些见解。我还在 F3 github 存储库上打开了一个问题And Have you already identified the revision of F3 SQL Mapper

答:

1赞 Paolo 12/9/2022 #1

通过在 github 上打开一个问题,我从 @ikkez 那里得到了答案:


这是当前的预期行为,因为设置不存在的字段 = 定义临时字段。

$mapper->set('count_x',
             'SELECT COUNT(id) from x where x.id = y.foreign_key group by x.id');

编号: https://fatfreeframework.com/3.8/databases#VirtualFields

解决此问题的方法是应用允许设置的可填写字段白名单,以防您使用类似 .copyfrom

即:

$mapper->copyfrom('POST', function($val) {
    return array_intersect_key($val, array_flip(['first_name', 'last_name', 'age']));
});