如何在无Fat Framework

时间:2016-06-21 05:10:11

标签: mysql orm fat-free-framework

我尝试将多个记录插入到无PK表

for ($x = 0; $x < count($arr); $x++) {
    $name=$arr[$x];
    $user=new DB\SQL\Mapper($f3->get('DB'),'User');
    $user->name=$name;
    $user->save();
}

最后,只有一条记录插入数据库

我也尝试了reset,但仍然只有一条记录

for ($x = 0; $x < count($arr); $x++) {
    $name=$arr[$x];
    $user=new DB\SQL\Mapper($f3->get('DB'),'User');
    $user->reset();
    $user->name=$name;
    $user->save();
}

如果我在此表中添加auto_increment主键,则没问题。

更新1:

我在网络浏览器中再次测试了这个问题。然后我收到了这个错误

Internal Server Error

PDOStatement: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

所以我无法在$db->log()之后执行save(),现在我知道为什么只有一条记录,因为php在第一个循环中停止了。

然后启用general_log_file,我在文件中找到了这个日志

160621 18:00:53    47 Connect   dev@localhost on my_db
           47 Query SET NAMES utf8
           47 Query SHOW columns FROM `my_db`.`UserAccount`
           47 Query INSERT INTO `UserAccount` (`name`) VALUES ('uName')
           47 Quit  

所以我尝试运行这个SQL INSERT INTO `UserAccount` (`name`) VALUES ('uName')并且没有错误。

我还检查了/var/log/mysql.log/var/log/mysql.err为空。

现在我不知道如何找出问题

1 个答案:

答案 0 :(得分:1)

你的第二次尝试是正确的:

foreach($names as $name) {
    $user->reset();
    $user->name=$name;
    $user->save();
}

即使对没有主键的地图制作者也是如此。

请记住,如果没有主键,您将无法更新$user。引自docs

  

虽然在数据库的所有表中拥有主键的问题是有争议的,但F3并不会阻止您创建与不包含主键的表通信的数据映射器对象。唯一的缺点是:您无法删除或更新映射记录,因为F3绝对无法确定您所指的是哪条记录。

注意:如果您仍在努力处理记录插入问题,则可以输出数据库日志$db->log()以查看在后台运行的查询。

<强>更新

为了能够在出现错误时输出数据库日志,您可以挂钩ONERROR事件:

$f3->ONERROR=function($f3) {
  echo $f3->get('DB')->log();
}
$mapper->save();// SQL error will trigger ONERROR