Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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 如何使用阵列更新_Php_Mysql_Arrays - Fatal编程技术网

Php 如何使用阵列更新

Php 如何使用阵列更新,php,mysql,arrays,Php,Mysql,Arrays,我想从比我更聪明的人那里得到一些关于PHP/MySQL的灵感 在中,我们有一个数据库应用程序,在这个实例中有两个主表和一个子表 主表1-文件 主表2-职务说明 子表-LnkDocuments_JobDescriptions,正如标题所示,它是文档和职务描述表之间的一对多关系表。在我的文档表中,我有一个字段,用于查找职务描述并以复选框形式显示选项,该字段称为“AppliesTo”,因为应用程序的工作方式,该字段将结果存储为字符串,例如“1,2,3,4,5)我使用explode函数将其转换为数组,然

我想从比我更聪明的人那里得到一些关于PHP/MySQL的灵感

在中,我们有一个数据库应用程序,在这个实例中有两个主表和一个子表

主表1-文件 主表2-职务说明 子表-LnkDocuments_JobDescriptions,正如标题所示,它是文档和职务描述表之间的一对多关系表。在我的文档表中,我有一个字段,用于查找职务描述并以复选框形式显示选项,该字段称为“AppliesTo”,因为应用程序的工作方式,该字段将结果存储为字符串,例如“1,2,3,4,5)我使用explode函数将其转换为数组,然后将每条记录插入子表,因为我更喜欢1-2-many关系。这是我拥有的代码,它是有效的

$jdarray = explode(',',$values['AppliesTo']);

foreach($jdarray as $item)
{
$sql2 = "INSERT INTO LnkDocuments_JobDescriptions (DocumentFk, JobDescriptionFk) 
values ('".$keys["DocumentPk"]."', '$item')"; CustomQuery($sql2);
}
我现在遇到的问题是,如果该表得到更新,我还需要更新子表,我已经尝试了以下代码(但很快意识到它是错误的):

我突然想到,我需要比较数组中的差异,但我不知道如何做,但这就是我需要的:

例如,如果我可以得到$oldarray和$newarray进行比较

如果旧数组中有值1,2,3,4,$newarray中有值1,2,3,5,我希望代码循环遍历每个值以确定是否有更改,例如,如果值存在于旧数组和新数组中,则不执行任何操作,如果值存在于旧数组中但不是新的,则删除,如果值存在于新数组中但不是旧的,则插入

我也曾考虑过删除所有相关记录并再次添加,但我认为这是一种不好的做法,会导致主键数过高,而且值得注意的是,在我的示例中只有5个选项,这只是为了测试,实际上可能有几十个


提前感谢

如果您试图优化内容,我不确定读取表中已经存在的值,然后在插入丢失的记录时仅删除新版本中没有的值是最好的方法。在我看来,在一个查询中删除所有内容,然后在一个查询中插入所有记录要快得多。试着这样做:

$item_list = implode( ',' , $jdarray );
$delete_query = "DELETE FROM LnkDocuments_JobDescriptions WHERE DocumentFk='".$keys["DocumentPk"]."' AND JobDescriptionFk IN ( $item_list )";
CustomQuery($delete_query);

$document_key = "'" . $keys["DocumentPk"] . "'";
$item_list_to_insert = "($document_key, " . implode( "), ($document_key, ", $jdarray ) . ")";

$insert_query = "INSERT INTO LnkDocuments_JobDescriptions (DocumentFk, JobDescriptionFk) VALUES " . $item_list_to_insert;
CustomQuery($insert_query);

注意:我没有对此进行测试,可能需要进行一些调试。

我没有仔细查看您的所有代码,但在我看来它应该可以工作。到底是什么问题?我使用的代码的问题是它不比较差异,它会插入新记录,好的,但它也会删除所有已经存在的记录,不考虑它们是否已在新阵列中删除。我想我看到了您试图实现的目标,谢谢。我想你让自己的生活很艰难。如果您要从主表中删除一行,您应该知道在那个时间点要删除哪个链接行。您将拥有同时执行链接表tidyup所需的其中一个键。所有这些数组处理意味着您错过了明显的结果。我不是从主表中删除,而是从子表中删除了关联的记录。我确实考虑过删除子表中链接到该记录的所有内容,然后根据新值再次添加,但这不是坏做法吗?一点也不,事实上,如果生成的查询可以更快地执行,这是标准做法,大多数数据库设置都是如此。通常查询循环时间比查询执行时间更重要,因此您应该尽量减少运行的查询数量。这还不包括循环的处理时间。好的,我已经输入了代码,它确实可以工作,但我想这样做的原因之一是,以后我想扩展代码,通过电子邮件向订阅的用户发送更改。您希望能够指定所做更改的确切数量吗?这应该是您的问题的一部分,因为它将问题从性能转变为用户友好性。也许接受这个答案,然后打开另一个问题,解释为什么要进行比较?
$item_list = implode( ',' , $jdarray );
$delete_query = "DELETE FROM LnkDocuments_JobDescriptions WHERE DocumentFk='".$keys["DocumentPk"]."' AND JobDescriptionFk IN ( $item_list )";
CustomQuery($delete_query);

$document_key = "'" . $keys["DocumentPk"] . "'";
$item_list_to_insert = "($document_key, " . implode( "), ($document_key, ", $jdarray ) . ")";

$insert_query = "INSERT INTO LnkDocuments_JobDescriptions (DocumentFk, JobDescriptionFk) VALUES " . $item_list_to_insert;
CustomQuery($insert_query);