我正在尝试更新一个保存员工输入数据的表。该表有三列:entry id,field id和value。我想确保根据每个条目在该表中的每个字段都有一行。因此我编写了以下php / sql脚本。思考过程是获取两个数组(一个包含条目ID,另一个包含字段ID)并检查输入表以查看每个字段和条目是否存在现有行。如果没有,则使用inert into命令添加值为0的行,但此命令失败。我的猜测是由于此功能的强度导致的超时错误。有什么建议吗?
$db = JFactory::getDBO(); $field_query = 'SELECT id FROM `jos_directory_field`'; $db->setQuery( $field_query ); $fields = $db->loadObjectList(); $entry_query = 'SELECT id FROM `jos_directory_entry`'; $db->setQuery( $entry_query ); $entries = $db->loadObjectList(); for($e=0;$e count($entries);$e++) { for($i=0;$i count($fields);$i++) { $insert_query = 'INSERT INTO `jos_directory_enf` (entry_id,field_id,field_value)'; $insert_query .= 'SELECT '.$entries[$e]->id.','.$fields[$i]->id.',0'; $insert_query .= 'FROM dual WHERE NOT EXISTS (SELECT * FROM `jos_directory_enf`'; $insert_query .= 'WHERE entry_id = '.$entries[$e]->id.' and field_id = '.$fields[$i]->id.')'; $db->setQuery( $insert_query ); $db->query(); } }
答案 0 :(得分:0)
这太糟糕了Joomla似乎不支持预备语句,因为它们可以帮助重复查询的性能。
然而,在这种情况下,有一个更好的选择。您应该能够使用单个SQL语句替换PHP代码,并使用INSERT语句的IGNORE
子句。首先,确保entry_id
和field_id
列jos_directory_enf
上有unique index。那么SQL语句就像:
INSERT IGNORE INTO `jos_directory_enf` (entry_id,field_id,field_value)
SELECT e.id, f.id, 0
FROM jos_directory_entries AS e
JOIN jos_directory_field AS f
;