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

时间:2014-01-03 20:33:52

标签: 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 = "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 ....";

有谁知道如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

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

您的问题第1部分:

  

我不知道如何创建数组

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

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

您已获得结果集

$get_favs_res = mysqli_query($con, $get_favs_sql);

现在我们需要一个阵列!在这一点上,我们需要仔细考虑我们的数组应该是什么,以及我们需要对请求的内容做些什么。您已声明要从SELECT查询的结果中创建数组

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

方法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。一旦条件选择了该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.

妙的!!!

制作阵列所需的一切。如果您选择任一方法并执行print_r($ row)(方法1 )或print_r($ memberArr)(方法2 ),您将看到我&#我正在谈论。

您质疑第2部分:

  

在这里,我需要更新上面选择的成员并将其输入到备注表

这是事情变得模糊和疯狂的地方。如果您按照上面的方法1进行操作,那么您几乎必须致电

mysqli_query("INSERT INTO notes VALUES($row['member']);

循环的每次迭代。这可以工作,但是如果你有10000名成员,那10000张插入你的桌子,如果你问我就有点废话!

如果你按照上面的方法二,你有一个优势。您有一个有用的数据结构(两个昏暗的数组),然后您可以进一步处理以获得更好的性能并减少查询。然而,即使从那时起,即使使用我们新的处理友好阵列,您也会遇到一些挑战。

你可以做的第一件事,对于一小部分用户来说这很好,就是使用多插入。这只涉及一些简单的字符串构建(这本身就构成了一些问题,所以不要一直依赖于此)我们将构建一个SQL查询字符串以使用我们的结果插入所有内容。 MySQL中的多插入查询就像普通的INSERT一样,除了一个不同的:INSERT INTO注意事项VALUES(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.

无论需要添加多少行,都会添加它们。然而,这仍然是一种昂贵的做事方式,如果你认为你的套装将是巨大的,不要使用它。你最终会得到一个巨大的字符串,TONS的字符串连接以及一个巨大的查询来运行。

但是,鉴于上述情况,您可以做您正在尝试做的事情。

注意:这些都是非常简化的做事方式,但我是这样做的,因为我希望您在尝试更先进的方法之前先了解基础知识。有人可能会在没有阅读这个说明的情况下对这个答案发表评论,告诉我,我不知道我为这个愚蠢的事情做了什么。请记住,这些只是基础知识,绝不反映工业强度技术。

如果您对从mysqli结果集生成数组的其他方式感到好奇: The one I used above

An even easier way to make your big array但我想在给你快捷方式之前向你展示做事的基本方法。这也是你不应该使用的功能之一。

Single row as associative(as bove), numeric, or both.

有些人建议对SQL使用loadfiles,因为它们比插入更快(意味着你会将数据转储到文件中,并使用加载查询而不是运行插入)

您可以使用MySQL的另一种方法如上所述使用INSERT ... SELECT 但这不仅仅是一个高级主题,因为它并不是那种你会看到有人做出很多贡献的查询。随意阅读文档并试一试!

我希望这至少可以解决你的问题。如果我没有覆盖某些东西,某些东西没有意义,或者我没有完全解答你的问题,请告诉我一行,我会竭尽所能为你解决问题。