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

vuktfyat  于 2022-12-10  发布在  PHP
关注(0)|答案(1)|浏览(111)

给定此代码

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

其中foo是一个列,存在于Map表中,我得到此错误

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]

错误消息具有误导性,事实上不存在的列是foo而不是bar:后者是试图设置给不存在的列的值。
为什么会发生这种情况?有办法解决吗?

Php 8.1.9中的内容
客户端API版本=〉mysqlnd 8.1.9
mysql8.0.30数据库

9cbw7uwe

9cbw7uwe1#

通过打开issue on 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']));
});

相关问题