我尝试将多个记录插入到无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
为空。
现在我不知道如何找出问题
答案 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