Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 尝试使用其他两个表中的数据更新一个mySQL表失败_Php_Mysql_Sql - Fatal编程技术网

Php 尝试使用其他两个表中的数据更新一个mySQL表失败

Php 尝试使用其他两个表中的数据更新一个mySQL表失败,php,mysql,sql,Php,Mysql,Sql,我正在尝试更新一个表,该表保存了我的员工输入的数据。该表有三列:条目id、字段id和值。我想根据每个条目确保此表中的每个字段都有一行。因此,我编写了以下php/sql脚本。其思想过程是获取两个数组,一个包含条目ID,另一个包含字段ID,并检查输入表以查看每个字段和条目是否都存在一行。若不是,则使用惰性into命令添加值为0的行,但此命令失败。我猜是由于该函数的强度导致的超时错误。有什么建议吗 $db = JFactory::getDBO(); $field_query = 'SELECT id

我正在尝试更新一个表,该表保存了我的员工输入的数据。该表有三列:条目id、字段id和值。我想根据每个条目确保此表中的每个字段都有一行。因此,我编写了以下php/sql脚本。其思想过程是获取两个数组,一个包含条目ID,另一个包含字段ID,并检查输入表以查看每个字段和条目是否都存在一行。若不是,则使用惰性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(); } }
可惜Joomla似乎不支持预处理语句,因为它们可以帮助提高重复查询的性能

然而,在这种情况下,有一个更好的选择。您应该能够使用一条SQL语句替换PHP代码,为语句使用IGNORE子句。首先,确保在jos_directory_enf的entry_id和field_id列上有一个。然后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
;

.

这是立即爆炸还是挂起?表有多大?您可能会因为PHP本身的内存不足,仅仅是因为表的大小,mmm,这可能有点不太可能。另外,您在哪个提交级别下运行?是否有一个名为DUAL的实际表?或者这是ORACLE语法的遗留问题?@MarcB它运行了大约30到60秒,然后出现了一个内部服务器错误。@X-Zero我认为问题是通过PHP超时。我不知道提交级别是什么。我假设INSERT IGNORE会复制行,但我决定根据您的建议无论如何运行它。它确实复制了所有现有的行,并添加了所需的行。如果这样做,重复的行将导致重复键错误,从而阻止添加行。忽略将阻止错误停止查询。