PHP/MySQL从数组中的多个结果运行函数

PHP/MySQL从数组中的多个结果运行函数,php,mysql,Php,Mysql,我不确定我的术语是否正确,但基本上我有一个网站,会员可以订阅他们喜欢的主题,并将其详细信息放入“收藏夹”表中。然后,当对该主题进行更新时,我希望向每个成员发送通知 到目前为止,我得到的是: $update_topic_sql = "UPDATE topics SET ...My Code Here..."; $update_topic_res = mysqli_query($con, $update_topic_sql)or die(mysqli_error()); $get_favs_sql

我不确定我的术语是否正确,但基本上我有一个网站,会员可以订阅他们喜欢的主题,并将其详细信息放入“收藏夹”表中。然后,当对该主题进行更新时,我希望向每个成员发送通知

到目前为止,我得到的是:

$update_topic_sql = "UPDATE topics SET ...My Code Here...";
$update_topic_res = mysqli_query($con, $update_topic_sql)or die(mysqli_error());

$get_favs_sql = "SELECT member FROM favourites WHERE topic = '$topic'";
$get_favs_res = mysqli_query($con, $get_favs_sql);

//Here I Need to update the Members selected above and enter them into a notes table

$insert_note_sql = "INSERT INTO notes ....";

有人知道如何做到这一点吗?

好的,我们已经得到了我们的用户结果集。现在,根据问题的性质,我将假设您可能是PHP、SQL(本例中为MySQL)、web开发或以上所有方面的新手

你的问题第1部分:

我不知道如何创建数组

这比你想象的要容易,如果你已经试过了,那么我道歉,我不想侮辱你的智慧。:)

从mysqli查询中获取数组只是一个函数调用和循环的问题。运行select查询并将返回值保存到变量时,存储了一个mysqli结果集。mysqli库同时支持过程和面向对象的样式,因此,既然您使用的是过程方法,那么我也将使用过程方法

你已经有了你的结果集

$get_favs_res = mysqli_query($con, $get_favs_sql);
现在我们需要一个数组!在这一点上,我们需要考虑我们的数组应该是什么,以及我们需要对请求的内容做什么。您已经声明要从SELECT查询的结果生成一个数组

出于示例的目的,我将假设您返回的“member”字段是某种ID,因此是数值类型,可能是integer类型。我也不知道你们的桌子是什么样子,所以我也会在那个里做一些假设

方法1

//perform the operations needed on a per row basis 
while($row = mysqli_fetch_assoc($get_favs_res)){
    echo $row['member'];
}
方法2

//instead of having to do all operations inside the loop, just make one big array out of the result set

$memberArr = array();
while($row = mysqli_fetch_assoc($get_favs_res)){
    $memberArr[] = $row;
}
那么我们在那里做了什么?让我们从头开始,让您了解数组实际上是如何生成的。首先,while循环中的条件。我们要设置一个变量作为循环条件?是的!为什么会这样?因为当PHP(和许多其他语言)设置该变量时,条件将对照变量的值检查true或false

好的,那么它是如何设置为false的呢?请记住,任何非布尔值false、非null、非0(假设没有类型检查)在分配给某个对象(同样,没有类型检查)时都会解析为true

该函数以关联数组的格式一次返回一行(因此为_assoc后缀)。该关联数组的键只是行中列的名称。因此,在您的情况下,行数组中将有一个名为“member”的值。每次使用结果集调用mysqli_fetch_assoc()时,都会有一个指针指向集合中的下一个结果(这是一个有序的集合),并且该过程会自动重复。实际上,每次循环迭代时都会得到一个新数组,指针也会指向下一个结果。最终,指针将到达结果集的末尾,在这种情况下,函数将返回NULL。一旦条件在该空值上拾取,它将退出

在第二个例子中,我们做的与第一个完全相同的事情。为每一行获取一个关联数组,但我们做的有些不同。我们正在构造一个二维数组,或者说嵌套数组。通过这种方式,我们可以创建关联数组的数字索引数组。我们做了什么?将所有行存储在一个大数组中!那么做像

$memberArr[0]['member'];//will return the id of the first member returned
$memberArr[1]['member'];//will return the id of the second member returned
$lastIndex = sizeof($memberArr-1);
$memberArr[$lastIndex]['member'];//will return the id of the last member returned.
漂亮

这就是制作阵列所需要的全部。如果您选择其中一种方法并进行打印($row)(方法1)或打印($memberArr)(方法2),您将看到我在说什么

你对第二部分提出了质疑:

在这里,我需要更新上面选择的成员,并将它们输入notes表

这就是事情变得阴暗和疯狂的地方。如果您遵循上面的方法1,您几乎必须调用

mysqli_query("INSERT INTO notes VALUES($row['member']);
对于循环的每个迭代。那会有用的,但如果你有10000个成员,那就是10000个插入到你的表中,如果你问我的话,那有点糟糕

如果你遵循上述第二种方法,你就有优势。您有一个有用的数据结构(即二维数组),然后可以进一步处理它以获得更好的性能和更少的查询。然而,即使从这一点上说,您也面临一些挑战,即使使用我们新的处理友好型阵列

您可以做的第一件事(对于一小部分用户来说这很好)是使用多重插入。这只涉及一些简单的字符串构建(这本身可能会带来一些问题,所以不要总是依赖于此),我们将构建一个SQL查询字符串,以使用结果插入所有内容。MySQL中的多插入查询与普通的插入一样,只是有一个不同之处:插入notes值(1)、(2)、(x) 基本上,对于插入的每一行,用逗号分隔值集,该值集由()表示

$query = 'INSERT INTO notes VALUES ';
//now we need to iterate over our array. You have your choice of loops, but since it's numerically indexed, just go with a simple for loop
$numMembers = sizeof($memberArr);
for($i = 0; $i < $numMembers; $i++){
    if($i > 0){
        $query .= ",({$membersArr[$i]['member']})";//all but the first row need a comma
    }
    else {
        $query .= "({$membersArr[$i]['member']})";//first row does not need a comma
    }

}

mysqli_query($query);//add all the rows.
$query='INSERT INTO notes value';
//现在我们需要迭代数组。您可以选择循环,但由于它是数字索引的,所以只需使用一个简单的for循环即可
$numMembers=sizeof($memberArr);
对于($i=0;$i<$nummbers;$i++){
如果($i>0){
$query.=”,({$membersArr[$i]['member']});//除第一行外,所有行都需要逗号
}
否则{
$query.=“({$membersArr[$i]['member']})”;//第一行不需要逗号
}
}
mysqli_查询($query)//添加所有行。
不管需要添加多少行,这都会添加它们。然而,这仍然是一种成本高昂的方式,如果你认为你的电视机会很大,不要用它。您将得到一个巨大的字符串,大量的字符串concat,以及一个巨大的查询

然而,鉴于上述情况,你可以做你想做的事情

注意:这些都是非常简单的做事方式,但我这样做是因为我